diff --git a/benchmark/bench.dart b/benchmark/bench.dart
index d03c249..b1e039d 100644
--- a/benchmark/bench.dart
+++ b/benchmark/bench.dart
@@ -18,7 +18,7 @@
 
   final harness = BenchmarkHarness(asJson: json);
 
-  final compiler = Compiler(SdkManager.sdk, SdkManager.flutterSdk);
+  final compiler = Compiler(SdkManager.sdk);
 
   Logger.root.level = Level.WARNING;
   Logger.root.onRecord.listen((LogRecord record) {
diff --git a/bin/server.dart b/bin/server.dart
index 5750d57..49bc5ab 100644
--- a/bin/server.dart
+++ b/bin/server.dart
@@ -15,7 +15,6 @@
   // Ensure the Dart SDK is downloaded (if already up-to-date, no work is
   // performed).
   await SdkManager.sdk.init();
-  await SdkManager.flutterSdk.init();
 
   server.main(args);
 }
diff --git a/bin/server_cloud_run.dart b/bin/server_cloud_run.dart
index 76eae64..1f74f3e 100644
--- a/bin/server_cloud_run.dart
+++ b/bin/server_cloud_run.dart
@@ -12,7 +12,6 @@
 
 Future<void> main(List<String> args) async {
   await SdkManager.sdk.init();
-  await SdkManager.flutterSdk.init();
 
   return services_cloud_run.main(args);
 }
diff --git a/bin/server_dev.dart b/bin/server_dev.dart
index 79ae125..50799e0 100644
--- a/bin/server_dev.dart
+++ b/bin/server_dev.dart
@@ -12,7 +12,6 @@
 
 Future<void> main(List<String> args) async {
   await SdkManager.sdk.init();
-  await SdkManager.flutterSdk.init();
 
   services_dev.main(args);
 }
diff --git a/lib/src/analysis_server.dart b/lib/src/analysis_server.dart
index c747173..1937e05 100644
--- a/lib/src/analysis_server.dart
+++ b/lib/src/analysis_server.dart
@@ -68,7 +68,7 @@
   final FlutterWebManager flutterWebManager;
 
   FlutterAnalysisServerWrapper(this.flutterWebManager)
-      : super(SdkManager.flutterSdk.sdkPath);
+      : super(SdkManager.sdk.sdkPath);
 
   @override
   Future<AnalysisServer> init() async {
diff --git a/lib/src/analysis_servers.dart b/lib/src/analysis_servers.dart
index 6a56526..765fcb8 100644
--- a/lib/src/analysis_servers.dart
+++ b/lib/src/analysis_servers.dart
@@ -46,7 +46,7 @@
   Future<void> warmup() async {
     _logger.info('Beginning AnalysisServersWrapper init().');
     _dartAnalysisServer = DartAnalysisServerWrapper();
-    _flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+    _flutterWebManager = FlutterWebManager(SdkManager.sdk);
     _flutterAnalysisServer = FlutterAnalysisServerWrapper(_flutterWebManager);
 
     await _dartAnalysisServer.init();
diff --git a/lib/src/common_server_impl.dart b/lib/src/common_server_impl.dart
index f55234c..a578da6 100644
--- a/lib/src/common_server_impl.dart
+++ b/lib/src/common_server_impl.dart
@@ -183,7 +183,7 @@
   Future<void> init() async {
     log.info('Beginning CommonServer init().');
     _analysisServers = AnalysisServersWrapper();
-    _compiler = Compiler(SdkManager.sdk, SdkManager.flutterSdk);
+    _compiler = Compiler(SdkManager.sdk);
 
     await _compiler.warmup();
     await _analysisServers.warmup();
@@ -285,9 +285,9 @@
           ..runtimeVersion = vmVersion
           ..servicesVersion = servicesVersion
           ..appEngineVersion = _container.version
-          ..flutterDartVersion = SdkManager.flutterSdk.version
-          ..flutterDartVersionFull = SdkManager.flutterSdk.versionFull
-          ..flutterVersion = SdkManager.flutterSdk.flutterVersion,
+          ..flutterDartVersion = SdkManager.sdk.version
+          ..flutterDartVersionFull = SdkManager.sdk.versionFull
+          ..flutterVersion = SdkManager.sdk.flutterVersion,
       );
 
   Future<proto.CompileResponse> _compileDart2js(
diff --git a/lib/src/compiler.dart b/lib/src/compiler.dart
index 48d91ef..2fd2dda 100644
--- a/lib/src/compiler.dart
+++ b/lib/src/compiler.dart
@@ -22,21 +22,20 @@
 /// An interface to the dart2js compiler. A compiler object can process one
 /// compile at a time.
 class Compiler {
-  final Sdk _sdk;
-  final FlutterSdk _flutterSdk;
+  final FlutterSdk _sdk;
   final FlutterWebManager _flutterWebManager;
   final String _dartdevcPath;
   final BazelWorkerDriver _ddcDriver;
 
-  Compiler(this._sdk, this._flutterSdk)
-      : _dartdevcPath = path.join(_flutterSdk.sdkPath, 'bin', 'dartdevc'),
+  Compiler(this._sdk)
+      : _dartdevcPath = path.join(_sdk.sdkPath, 'bin', 'dartdevc'),
         _ddcDriver = BazelWorkerDriver(
             () => Process.start(
-                  path.join(_flutterSdk.sdkPath, 'bin', 'dartdevc'),
+                  path.join(_sdk.sdkPath, 'bin', 'dartdevc'),
                   <String>['--persistent_worker'],
                 ),
             maxWorkers: 1),
-        _flutterWebManager = FlutterWebManager(_flutterSdk);
+        _flutterWebManager = FlutterWebManager(_sdk);
 
   bool importsOkForCompile(Set<String> imports) {
     return !_flutterWebManager.hasUnsupportedImport(imports);
@@ -153,7 +152,7 @@
           '-s',
           _flutterWebManager.summaryFilePath,
           '-s',
-          '${_flutterSdk.flutterBinPath}/cache/flutter_web_sdk/flutter_web_sdk/kernel/flutter_ddc_sdk.dill'
+          '${_sdk.flutterBinPath}/cache/flutter_web_sdk/flutter_web_sdk/kernel/flutter_ddc_sdk.dill'
         ],
         ...['-o', path.join(temp.path, '$kMainDart.js')],
         ...['--module-name', 'dartpad_main'],
@@ -185,7 +184,7 @@
         final results = DDCCompilationResults(
           compiledJS: processedJs,
           modulesBaseUrl: 'https://storage.googleapis.com/'
-              'compilation_artifacts/${_flutterSdk.versionFull}/',
+              'compilation_artifacts/${_sdk.versionFull}/',
         );
         return results;
       }
diff --git a/lib/src/protos/dart_services.pb.dart b/lib/src/protos/dart_services.pb.dart
index 6a9a2ee..78e1f1e 100644
--- a/lib/src/protos/dart_services.pb.dart
+++ b/lib/src/protos/dart_services.pb.dart
@@ -10,11 +10,27 @@
 import 'package:protobuf/protobuf.dart' as $pb;
 
 class CompileRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
-    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'returnSourceMap', protoName: 'returnSourceMap')
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'CompileRequest',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'source')
+    ..aOB(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'returnSourceMap',
+        protoName: 'returnSourceMap')
+    ..hasRequiredFields = false;
 
   CompileRequest._() : super();
   factory CompileRequest({
@@ -30,31 +46,40 @@
     }
     return _result;
   }
-  factory CompileRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CompileRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory CompileRequest.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CompileRequest.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   CompileRequest clone() => CompileRequest()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CompileRequest copyWith(void Function(CompileRequest) updates) => super.copyWith((message) => updates(message as CompileRequest)) as CompileRequest; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CompileRequest copyWith(void Function(CompileRequest) updates) =>
+      super.copyWith((message) => updates(message as CompileRequest))
+          as CompileRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileRequest create() => CompileRequest._();
   CompileRequest createEmptyInstance() => create();
-  static $pb.PbList<CompileRequest> createRepeated() => $pb.PbList<CompileRequest>();
+  static $pb.PbList<CompileRequest> createRepeated() =>
+      $pb.PbList<CompileRequest>();
   @$core.pragma('dart2js:noInline')
-  static CompileRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileRequest>(create);
+  static CompileRequest getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<CompileRequest>(create);
   static CompileRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get source => $_getSZ(0);
   @$pb.TagNumber(1)
-  set source($core.String v) { $_setString(0, v); }
+  set source($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasSource() => $_has(0);
   @$pb.TagNumber(1)
@@ -63,7 +88,10 @@
   @$pb.TagNumber(2)
   $core.bool get returnSourceMap => $_getBF(1);
   @$pb.TagNumber(2)
-  set returnSourceMap($core.bool v) { $_setBool(1, v); }
+  set returnSourceMap($core.bool v) {
+    $_setBool(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasReturnSourceMap() => $_has(1);
   @$pb.TagNumber(2)
@@ -71,10 +99,21 @@
 }
 
 class CompileDDCRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileDDCRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'CompileDDCRequest',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'source')
+    ..hasRequiredFields = false;
 
   CompileDDCRequest._() : super();
   factory CompileDDCRequest({
@@ -86,31 +125,40 @@
     }
     return _result;
   }
-  factory CompileDDCRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CompileDDCRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory CompileDDCRequest.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CompileDDCRequest.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   CompileDDCRequest clone() => CompileDDCRequest()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CompileDDCRequest copyWith(void Function(CompileDDCRequest) updates) => super.copyWith((message) => updates(message as CompileDDCRequest)) as CompileDDCRequest; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CompileDDCRequest copyWith(void Function(CompileDDCRequest) updates) =>
+      super.copyWith((message) => updates(message as CompileDDCRequest))
+          as CompileDDCRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileDDCRequest create() => CompileDDCRequest._();
   CompileDDCRequest createEmptyInstance() => create();
-  static $pb.PbList<CompileDDCRequest> createRepeated() => $pb.PbList<CompileDDCRequest>();
+  static $pb.PbList<CompileDDCRequest> createRepeated() =>
+      $pb.PbList<CompileDDCRequest>();
   @$core.pragma('dart2js:noInline')
-  static CompileDDCRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileDDCRequest>(create);
+  static CompileDDCRequest getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<CompileDDCRequest>(create);
   static CompileDDCRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get source => $_getSZ(0);
   @$pb.TagNumber(1)
-  set source($core.String v) { $_setString(0, v); }
+  set source($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasSource() => $_has(0);
   @$pb.TagNumber(1)
@@ -118,11 +166,27 @@
 }
 
 class SourceRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SourceRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'SourceRequest',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'source')
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'offset',
+        $pb.PbFieldType.O3)
+    ..hasRequiredFields = false;
 
   SourceRequest._() : super();
   factory SourceRequest({
@@ -138,31 +202,40 @@
     }
     return _result;
   }
-  factory SourceRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory SourceRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory SourceRequest.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory SourceRequest.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   SourceRequest clone() => SourceRequest()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  SourceRequest copyWith(void Function(SourceRequest) updates) => super.copyWith((message) => updates(message as SourceRequest)) as SourceRequest; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  SourceRequest copyWith(void Function(SourceRequest) updates) =>
+      super.copyWith((message) => updates(message as SourceRequest))
+          as SourceRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static SourceRequest create() => SourceRequest._();
   SourceRequest createEmptyInstance() => create();
-  static $pb.PbList<SourceRequest> createRepeated() => $pb.PbList<SourceRequest>();
+  static $pb.PbList<SourceRequest> createRepeated() =>
+      $pb.PbList<SourceRequest>();
   @$core.pragma('dart2js:noInline')
-  static SourceRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SourceRequest>(create);
+  static SourceRequest getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<SourceRequest>(create);
   static SourceRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get source => $_getSZ(0);
   @$pb.TagNumber(1)
-  set source($core.String v) { $_setString(0, v); }
+  set source($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasSource() => $_has(0);
   @$pb.TagNumber(1)
@@ -171,7 +244,10 @@
   @$pb.TagNumber(2)
   $core.int get offset => $_getIZ(1);
   @$pb.TagNumber(2)
-  set offset($core.int v) { $_setSignedInt32(1, v); }
+  set offset($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasOffset() => $_has(1);
   @$pb.TagNumber(2)
@@ -179,12 +255,24 @@
 }
 
 class AnalysisResults extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnalysisResults', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..pc<AnalysisIssue>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'issues', $pb.PbFieldType.PM, subBuilder: AnalysisIssue.create)
-    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'packageImports', protoName: 'packageImports')
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'AnalysisResults',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..pc<AnalysisIssue>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'issues', $pb.PbFieldType.PM,
+        subBuilder: AnalysisIssue.create)
+    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'packageImports',
+        protoName: 'packageImports')
+    ..aOM<ErrorMessage>(
+        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   AnalysisResults._() : super();
   factory AnalysisResults({
@@ -204,25 +292,31 @@
     }
     return _result;
   }
-  factory AnalysisResults.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory AnalysisResults.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory AnalysisResults.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory AnalysisResults.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   AnalysisResults clone() => AnalysisResults()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  AnalysisResults copyWith(void Function(AnalysisResults) updates) => super.copyWith((message) => updates(message as AnalysisResults)) as AnalysisResults; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  AnalysisResults copyWith(void Function(AnalysisResults) updates) =>
+      super.copyWith((message) => updates(message as AnalysisResults))
+          as AnalysisResults; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static AnalysisResults create() => AnalysisResults._();
   AnalysisResults createEmptyInstance() => create();
-  static $pb.PbList<AnalysisResults> createRepeated() => $pb.PbList<AnalysisResults>();
+  static $pb.PbList<AnalysisResults> createRepeated() =>
+      $pb.PbList<AnalysisResults>();
   @$core.pragma('dart2js:noInline')
-  static AnalysisResults getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AnalysisResults>(create);
+  static AnalysisResults getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<AnalysisResults>(create);
   static AnalysisResults? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -234,7 +328,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -244,19 +341,39 @@
 }
 
 class AnalysisIssue extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnalysisIssue', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'line', $pb.PbFieldType.O3)
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
-    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceName', protoName: 'sourceName')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'AnalysisIssue',
+      package: const $pb.PackageName($core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'kind')
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'line',
+        $pb.PbFieldType.O3)
+    ..aOS(
+        3,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'message')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceName',
+        protoName: 'sourceName')
     ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hasFixes', protoName: 'hasFixes')
     ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charStart', $pb.PbFieldType.O3, protoName: 'charStart')
     ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charLength', $pb.PbFieldType.O3, protoName: 'charLength')
     ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'url')
     ..pc<DiagnosticMessage>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'diagnosticMessages', $pb.PbFieldType.PM, protoName: 'diagnosticMessages', subBuilder: DiagnosticMessage.create)
     ..aOS(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'correction')
-    ..hasRequiredFields = false
-  ;
+    ..hasRequiredFields = false;
 
   AnalysisIssue._() : super();
   factory AnalysisIssue({
@@ -304,31 +421,40 @@
     }
     return _result;
   }
-  factory AnalysisIssue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory AnalysisIssue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory AnalysisIssue.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory AnalysisIssue.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   AnalysisIssue clone() => AnalysisIssue()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  AnalysisIssue copyWith(void Function(AnalysisIssue) updates) => super.copyWith((message) => updates(message as AnalysisIssue)) as AnalysisIssue; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  AnalysisIssue copyWith(void Function(AnalysisIssue) updates) =>
+      super.copyWith((message) => updates(message as AnalysisIssue))
+          as AnalysisIssue; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static AnalysisIssue create() => AnalysisIssue._();
   AnalysisIssue createEmptyInstance() => create();
-  static $pb.PbList<AnalysisIssue> createRepeated() => $pb.PbList<AnalysisIssue>();
+  static $pb.PbList<AnalysisIssue> createRepeated() =>
+      $pb.PbList<AnalysisIssue>();
   @$core.pragma('dart2js:noInline')
-  static AnalysisIssue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AnalysisIssue>(create);
+  static AnalysisIssue getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<AnalysisIssue>(create);
   static AnalysisIssue? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get kind => $_getSZ(0);
   @$pb.TagNumber(1)
-  set kind($core.String v) { $_setString(0, v); }
+  set kind($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasKind() => $_has(0);
   @$pb.TagNumber(1)
@@ -337,7 +463,10 @@
   @$pb.TagNumber(2)
   $core.int get line => $_getIZ(1);
   @$pb.TagNumber(2)
-  set line($core.int v) { $_setSignedInt32(1, v); }
+  set line($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasLine() => $_has(1);
   @$pb.TagNumber(2)
@@ -346,7 +475,10 @@
   @$pb.TagNumber(3)
   $core.String get message => $_getSZ(2);
   @$pb.TagNumber(3)
-  set message($core.String v) { $_setString(2, v); }
+  set message($core.String v) {
+    $_setString(2, v);
+  }
+
   @$pb.TagNumber(3)
   $core.bool hasMessage() => $_has(2);
   @$pb.TagNumber(3)
@@ -355,7 +487,10 @@
   @$pb.TagNumber(4)
   $core.String get sourceName => $_getSZ(3);
   @$pb.TagNumber(4)
-  set sourceName($core.String v) { $_setString(3, v); }
+  set sourceName($core.String v) {
+    $_setString(3, v);
+  }
+
   @$pb.TagNumber(4)
   $core.bool hasSourceName() => $_has(3);
   @$pb.TagNumber(4)
@@ -364,7 +499,10 @@
   @$pb.TagNumber(5)
   $core.bool get hasFixes => $_getBF(4);
   @$pb.TagNumber(5)
-  set hasFixes($core.bool v) { $_setBool(4, v); }
+  set hasFixes($core.bool v) {
+    $_setBool(4, v);
+  }
+
   @$pb.TagNumber(5)
   $core.bool hasHasFixes() => $_has(4);
   @$pb.TagNumber(5)
@@ -373,7 +511,10 @@
   @$pb.TagNumber(6)
   $core.int get charStart => $_getIZ(5);
   @$pb.TagNumber(6)
-  set charStart($core.int v) { $_setSignedInt32(5, v); }
+  set charStart($core.int v) {
+    $_setSignedInt32(5, v);
+  }
+
   @$pb.TagNumber(6)
   $core.bool hasCharStart() => $_has(5);
   @$pb.TagNumber(6)
@@ -382,7 +523,10 @@
   @$pb.TagNumber(7)
   $core.int get charLength => $_getIZ(6);
   @$pb.TagNumber(7)
-  set charLength($core.int v) { $_setSignedInt32(6, v); }
+  set charLength($core.int v) {
+    $_setSignedInt32(6, v);
+  }
+
   @$pb.TagNumber(7)
   $core.bool hasCharLength() => $_has(6);
   @$pb.TagNumber(7)
@@ -391,7 +535,10 @@
   @$pb.TagNumber(8)
   $core.String get url => $_getSZ(7);
   @$pb.TagNumber(8)
-  set url($core.String v) { $_setString(7, v); }
+  set url($core.String v) {
+    $_setString(7, v);
+  }
+
   @$pb.TagNumber(8)
   $core.bool hasUrl() => $_has(7);
   @$pb.TagNumber(8)
@@ -403,7 +550,10 @@
   @$pb.TagNumber(10)
   $core.String get correction => $_getSZ(9);
   @$pb.TagNumber(10)
-  set correction($core.String v) { $_setString(9, v); }
+  set correction($core.String v) {
+    $_setString(9, v);
+  }
+
   @$pb.TagNumber(10)
   $core.bool hasCorrection() => $_has(9);
   @$pb.TagNumber(10)
@@ -411,13 +561,32 @@
 }
 
 class DiagnosticMessage extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DiagnosticMessage', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'line', $pb.PbFieldType.O3)
-    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charStart', $pb.PbFieldType.O3, protoName: 'charStart')
-    ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charLength', $pb.PbFieldType.O3, protoName: 'charLength')
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'DiagnosticMessage',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'message')
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'line',
+        $pb.PbFieldType.O3)
+    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charStart', $pb.PbFieldType.O3,
+        protoName: 'charStart')
+    ..a<$core.int>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charLength', $pb.PbFieldType.O3,
+        protoName: 'charLength')
+    ..hasRequiredFields = false;
 
   DiagnosticMessage._() : super();
   factory DiagnosticMessage({
@@ -441,31 +610,40 @@
     }
     return _result;
   }
-  factory DiagnosticMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory DiagnosticMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory DiagnosticMessage.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory DiagnosticMessage.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   DiagnosticMessage clone() => DiagnosticMessage()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  DiagnosticMessage copyWith(void Function(DiagnosticMessage) updates) => super.copyWith((message) => updates(message as DiagnosticMessage)) as DiagnosticMessage; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  DiagnosticMessage copyWith(void Function(DiagnosticMessage) updates) =>
+      super.copyWith((message) => updates(message as DiagnosticMessage))
+          as DiagnosticMessage; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static DiagnosticMessage create() => DiagnosticMessage._();
   DiagnosticMessage createEmptyInstance() => create();
-  static $pb.PbList<DiagnosticMessage> createRepeated() => $pb.PbList<DiagnosticMessage>();
+  static $pb.PbList<DiagnosticMessage> createRepeated() =>
+      $pb.PbList<DiagnosticMessage>();
   @$core.pragma('dart2js:noInline')
-  static DiagnosticMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DiagnosticMessage>(create);
+  static DiagnosticMessage getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<DiagnosticMessage>(create);
   static DiagnosticMessage? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get message => $_getSZ(0);
   @$pb.TagNumber(1)
-  set message($core.String v) { $_setString(0, v); }
+  set message($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
@@ -474,7 +652,10 @@
   @$pb.TagNumber(2)
   $core.int get line => $_getIZ(1);
   @$pb.TagNumber(2)
-  set line($core.int v) { $_setSignedInt32(1, v); }
+  set line($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasLine() => $_has(1);
   @$pb.TagNumber(2)
@@ -483,7 +664,10 @@
   @$pb.TagNumber(3)
   $core.int get charStart => $_getIZ(2);
   @$pb.TagNumber(3)
-  set charStart($core.int v) { $_setSignedInt32(2, v); }
+  set charStart($core.int v) {
+    $_setSignedInt32(2, v);
+  }
+
   @$pb.TagNumber(3)
   $core.bool hasCharStart() => $_has(2);
   @$pb.TagNumber(3)
@@ -492,7 +676,10 @@
   @$pb.TagNumber(4)
   $core.int get charLength => $_getIZ(3);
   @$pb.TagNumber(4)
-  set charLength($core.int v) { $_setSignedInt32(3, v); }
+  set charLength($core.int v) {
+    $_setSignedInt32(3, v);
+  }
+
   @$pb.TagNumber(4)
   $core.bool hasCharLength() => $_has(3);
   @$pb.TagNumber(4)
@@ -500,41 +687,71 @@
 }
 
 class VersionRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'VersionRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'VersionRequest',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..hasRequiredFields = false;
 
   VersionRequest._() : super();
   factory VersionRequest() => create();
-  factory VersionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory VersionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory VersionRequest.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory VersionRequest.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   VersionRequest clone() => VersionRequest()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  VersionRequest copyWith(void Function(VersionRequest) updates) => super.copyWith((message) => updates(message as VersionRequest)) as VersionRequest; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  VersionRequest copyWith(void Function(VersionRequest) updates) =>
+      super.copyWith((message) => updates(message as VersionRequest))
+          as VersionRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static VersionRequest create() => VersionRequest._();
   VersionRequest createEmptyInstance() => create();
-  static $pb.PbList<VersionRequest> createRepeated() => $pb.PbList<VersionRequest>();
+  static $pb.PbList<VersionRequest> createRepeated() =>
+      $pb.PbList<VersionRequest>();
   @$core.pragma('dart2js:noInline')
-  static VersionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VersionRequest>(create);
+  static VersionRequest getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<VersionRequest>(create);
   static VersionRequest? _defaultInstance;
 }
 
 class CompileResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'result')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceMap', protoName: 'sourceMap')
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'CompileResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'result')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceMap',
+        protoName: 'sourceMap')
+    ..aOM<ErrorMessage>(
+        99,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   CompileResponse._() : super();
   factory CompileResponse({
@@ -554,31 +771,40 @@
     }
     return _result;
   }
-  factory CompileResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CompileResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory CompileResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CompileResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   CompileResponse clone() => CompileResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CompileResponse copyWith(void Function(CompileResponse) updates) => super.copyWith((message) => updates(message as CompileResponse)) as CompileResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CompileResponse copyWith(void Function(CompileResponse) updates) =>
+      super.copyWith((message) => updates(message as CompileResponse))
+          as CompileResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileResponse create() => CompileResponse._();
   CompileResponse createEmptyInstance() => create();
-  static $pb.PbList<CompileResponse> createRepeated() => $pb.PbList<CompileResponse>();
+  static $pb.PbList<CompileResponse> createRepeated() =>
+      $pb.PbList<CompileResponse>();
   @$core.pragma('dart2js:noInline')
-  static CompileResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileResponse>(create);
+  static CompileResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<CompileResponse>(create);
   static CompileResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get result => $_getSZ(0);
   @$pb.TagNumber(1)
-  set result($core.String v) { $_setString(0, v); }
+  set result($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasResult() => $_has(0);
   @$pb.TagNumber(1)
@@ -587,7 +813,10 @@
   @$pb.TagNumber(2)
   $core.String get sourceMap => $_getSZ(1);
   @$pb.TagNumber(2)
-  set sourceMap($core.String v) { $_setString(1, v); }
+  set sourceMap($core.String v) {
+    $_setString(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasSourceMap() => $_has(1);
   @$pb.TagNumber(2)
@@ -596,7 +825,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -606,12 +838,29 @@
 }
 
 class CompileDDCResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileDDCResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'result')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modulesBaseUrl', protoName: 'modulesBaseUrl')
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'CompileDDCResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'result')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modulesBaseUrl',
+        protoName: 'modulesBaseUrl')
+    ..aOM<ErrorMessage>(
+        99,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   CompileDDCResponse._() : super();
   factory CompileDDCResponse({
@@ -631,31 +880,40 @@
     }
     return _result;
   }
-  factory CompileDDCResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CompileDDCResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory CompileDDCResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CompileDDCResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   CompileDDCResponse clone() => CompileDDCResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CompileDDCResponse copyWith(void Function(CompileDDCResponse) updates) => super.copyWith((message) => updates(message as CompileDDCResponse)) as CompileDDCResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CompileDDCResponse copyWith(void Function(CompileDDCResponse) updates) =>
+      super.copyWith((message) => updates(message as CompileDDCResponse))
+          as CompileDDCResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileDDCResponse create() => CompileDDCResponse._();
   CompileDDCResponse createEmptyInstance() => create();
-  static $pb.PbList<CompileDDCResponse> createRepeated() => $pb.PbList<CompileDDCResponse>();
+  static $pb.PbList<CompileDDCResponse> createRepeated() =>
+      $pb.PbList<CompileDDCResponse>();
   @$core.pragma('dart2js:noInline')
-  static CompileDDCResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileDDCResponse>(create);
+  static CompileDDCResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<CompileDDCResponse>(create);
   static CompileDDCResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get result => $_getSZ(0);
   @$pb.TagNumber(1)
-  set result($core.String v) { $_setString(0, v); }
+  set result($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasResult() => $_has(0);
   @$pb.TagNumber(1)
@@ -664,7 +922,10 @@
   @$pb.TagNumber(2)
   $core.String get modulesBaseUrl => $_getSZ(1);
   @$pb.TagNumber(2)
-  set modulesBaseUrl($core.String v) { $_setString(1, v); }
+  set modulesBaseUrl($core.String v) {
+    $_setString(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasModulesBaseUrl() => $_has(1);
   @$pb.TagNumber(2)
@@ -673,7 +934,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -683,11 +947,28 @@
 }
 
 class DocumentResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DocumentResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..m<$core.String, $core.String>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'info', entryClassName: 'DocumentResponse.InfoEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('dart_services.api'))
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'DocumentResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..m<$core.String, $core.String>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'info',
+        entryClassName: 'DocumentResponse.InfoEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OS,
+        packageName: const $pb.PackageName('dart_services.api'))
+    ..aOM<ErrorMessage>(
+        99,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   DocumentResponse._() : super();
   factory DocumentResponse({
@@ -703,25 +984,31 @@
     }
     return _result;
   }
-  factory DocumentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory DocumentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory DocumentResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory DocumentResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   DocumentResponse clone() => DocumentResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  DocumentResponse copyWith(void Function(DocumentResponse) updates) => super.copyWith((message) => updates(message as DocumentResponse)) as DocumentResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  DocumentResponse copyWith(void Function(DocumentResponse) updates) =>
+      super.copyWith((message) => updates(message as DocumentResponse))
+          as DocumentResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static DocumentResponse create() => DocumentResponse._();
   DocumentResponse createEmptyInstance() => create();
-  static $pb.PbList<DocumentResponse> createRepeated() => $pb.PbList<DocumentResponse>();
+  static $pb.PbList<DocumentResponse> createRepeated() =>
+      $pb.PbList<DocumentResponse>();
   @$core.pragma('dart2js:noInline')
-  static DocumentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DocumentResponse>(create);
+  static DocumentResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<DocumentResponse>(create);
   static DocumentResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -730,7 +1017,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(1);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(1);
   @$pb.TagNumber(99)
@@ -740,13 +1030,26 @@
 }
 
 class CompleteResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompleteResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementOffset', $pb.PbFieldType.O3, protoName: 'replacementOffset')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementLength', $pb.PbFieldType.O3, protoName: 'replacementLength')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'CompleteResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..a<$core.int>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementOffset', $pb.PbFieldType.O3,
+        protoName: 'replacementOffset')
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementLength',
+        $pb.PbFieldType.O3,
+        protoName: 'replacementLength')
     ..pc<Completion>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'completions', $pb.PbFieldType.PM, subBuilder: Completion.create)
     ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+    ..hasRequiredFields = false;
 
   CompleteResponse._() : super();
   factory CompleteResponse({
@@ -770,31 +1073,40 @@
     }
     return _result;
   }
-  factory CompleteResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CompleteResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory CompleteResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CompleteResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   CompleteResponse clone() => CompleteResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CompleteResponse copyWith(void Function(CompleteResponse) updates) => super.copyWith((message) => updates(message as CompleteResponse)) as CompleteResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CompleteResponse copyWith(void Function(CompleteResponse) updates) =>
+      super.copyWith((message) => updates(message as CompleteResponse))
+          as CompleteResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompleteResponse create() => CompleteResponse._();
   CompleteResponse createEmptyInstance() => create();
-  static $pb.PbList<CompleteResponse> createRepeated() => $pb.PbList<CompleteResponse>();
+  static $pb.PbList<CompleteResponse> createRepeated() =>
+      $pb.PbList<CompleteResponse>();
   @$core.pragma('dart2js:noInline')
-  static CompleteResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompleteResponse>(create);
+  static CompleteResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<CompleteResponse>(create);
   static CompleteResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.int get replacementOffset => $_getIZ(0);
   @$pb.TagNumber(1)
-  set replacementOffset($core.int v) { $_setSignedInt32(0, v); }
+  set replacementOffset($core.int v) {
+    $_setSignedInt32(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasReplacementOffset() => $_has(0);
   @$pb.TagNumber(1)
@@ -803,7 +1115,10 @@
   @$pb.TagNumber(2)
   $core.int get replacementLength => $_getIZ(1);
   @$pb.TagNumber(2)
-  set replacementLength($core.int v) { $_setSignedInt32(1, v); }
+  set replacementLength($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasReplacementLength() => $_has(1);
   @$pb.TagNumber(2)
@@ -815,7 +1130,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(3);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(3);
   @$pb.TagNumber(99)
@@ -825,10 +1143,25 @@
 }
 
 class Completion extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Completion', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..m<$core.String, $core.String>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'completion', entryClassName: 'Completion.CompletionEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('dart_services.api'))
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'Completion',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..m<$core.String, $core.String>(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'completion',
+        entryClassName: 'Completion.CompletionEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OS,
+        packageName: const $pb.PackageName('dart_services.api'))
+    ..hasRequiredFields = false;
 
   Completion._() : super();
   factory Completion({
@@ -840,25 +1173,30 @@
     }
     return _result;
   }
-  factory Completion.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory Completion.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory Completion.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Completion.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   Completion clone() => Completion()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  Completion copyWith(void Function(Completion) updates) => super.copyWith((message) => updates(message as Completion)) as Completion; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Completion copyWith(void Function(Completion) updates) =>
+      super.copyWith((message) => updates(message as Completion))
+          as Completion; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static Completion create() => Completion._();
   Completion createEmptyInstance() => create();
   static $pb.PbList<Completion> createRepeated() => $pb.PbList<Completion>();
   @$core.pragma('dart2js:noInline')
-  static Completion getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Completion>(create);
+  static Completion getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<Completion>(create);
   static Completion? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -866,11 +1204,26 @@
 }
 
 class FixesResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FixesResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..pc<ProblemAndFixes>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fixes', $pb.PbFieldType.PM, subBuilder: ProblemAndFixes.create)
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'FixesResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..pc<ProblemAndFixes>(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'fixes',
+        $pb.PbFieldType.PM,
+        subBuilder: ProblemAndFixes.create)
+    ..aOM<ErrorMessage>(
+        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   FixesResponse._() : super();
   factory FixesResponse({
@@ -886,25 +1239,31 @@
     }
     return _result;
   }
-  factory FixesResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory FixesResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory FixesResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory FixesResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   FixesResponse clone() => FixesResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  FixesResponse copyWith(void Function(FixesResponse) updates) => super.copyWith((message) => updates(message as FixesResponse)) as FixesResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  FixesResponse copyWith(void Function(FixesResponse) updates) =>
+      super.copyWith((message) => updates(message as FixesResponse))
+          as FixesResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static FixesResponse create() => FixesResponse._();
   FixesResponse createEmptyInstance() => create();
-  static $pb.PbList<FixesResponse> createRepeated() => $pb.PbList<FixesResponse>();
+  static $pb.PbList<FixesResponse> createRepeated() =>
+      $pb.PbList<FixesResponse>();
   @$core.pragma('dart2js:noInline')
-  static FixesResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FixesResponse>(create);
+  static FixesResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<FixesResponse>(create);
   static FixesResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -913,7 +1272,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(1);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(1);
   @$pb.TagNumber(99)
@@ -923,13 +1285,27 @@
 }
 
 class ProblemAndFixes extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ProblemAndFixes', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..pc<CandidateFix>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fixes', $pb.PbFieldType.PM, subBuilder: CandidateFix.create)
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'problemMessage', protoName: 'problemMessage')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'ProblemAndFixes',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..pc<CandidateFix>(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'fixes',
+        $pb.PbFieldType.PM,
+        subBuilder: CandidateFix.create)
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'problemMessage',
+        protoName: 'problemMessage')
     ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
     ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'length', $pb.PbFieldType.O3)
-    ..hasRequiredFields = false
-  ;
+    ..hasRequiredFields = false;
 
   ProblemAndFixes._() : super();
   factory ProblemAndFixes({
@@ -953,25 +1329,31 @@
     }
     return _result;
   }
-  factory ProblemAndFixes.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory ProblemAndFixes.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory ProblemAndFixes.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ProblemAndFixes.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   ProblemAndFixes clone() => ProblemAndFixes()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  ProblemAndFixes copyWith(void Function(ProblemAndFixes) updates) => super.copyWith((message) => updates(message as ProblemAndFixes)) as ProblemAndFixes; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ProblemAndFixes copyWith(void Function(ProblemAndFixes) updates) =>
+      super.copyWith((message) => updates(message as ProblemAndFixes))
+          as ProblemAndFixes; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static ProblemAndFixes create() => ProblemAndFixes._();
   ProblemAndFixes createEmptyInstance() => create();
-  static $pb.PbList<ProblemAndFixes> createRepeated() => $pb.PbList<ProblemAndFixes>();
+  static $pb.PbList<ProblemAndFixes> createRepeated() =>
+      $pb.PbList<ProblemAndFixes>();
   @$core.pragma('dart2js:noInline')
-  static ProblemAndFixes getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ProblemAndFixes>(create);
+  static ProblemAndFixes getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<ProblemAndFixes>(create);
   static ProblemAndFixes? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -980,7 +1362,10 @@
   @$pb.TagNumber(2)
   $core.String get problemMessage => $_getSZ(1);
   @$pb.TagNumber(2)
-  set problemMessage($core.String v) { $_setString(1, v); }
+  set problemMessage($core.String v) {
+    $_setString(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasProblemMessage() => $_has(1);
   @$pb.TagNumber(2)
@@ -989,7 +1374,10 @@
   @$pb.TagNumber(3)
   $core.int get offset => $_getIZ(2);
   @$pb.TagNumber(3)
-  set offset($core.int v) { $_setSignedInt32(2, v); }
+  set offset($core.int v) {
+    $_setSignedInt32(2, v);
+  }
+
   @$pb.TagNumber(3)
   $core.bool hasOffset() => $_has(2);
   @$pb.TagNumber(3)
@@ -998,7 +1386,10 @@
   @$pb.TagNumber(4)
   $core.int get length => $_getIZ(3);
   @$pb.TagNumber(4)
-  set length($core.int v) { $_setSignedInt32(3, v); }
+  set length($core.int v) {
+    $_setSignedInt32(3, v);
+  }
+
   @$pb.TagNumber(4)
   $core.bool hasLength() => $_has(3);
   @$pb.TagNumber(4)
@@ -1006,13 +1397,30 @@
 }
 
 class CandidateFix extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CandidateFix', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
-    ..pc<SourceEdit>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'edits', $pb.PbFieldType.PM, subBuilder: SourceEdit.create)
-    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'selectionOffset', $pb.PbFieldType.O3, protoName: 'selectionOffset')
-    ..pc<LinkedEditGroup>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'linkedEditGroups', $pb.PbFieldType.PM, protoName: 'linkedEditGroups', subBuilder: LinkedEditGroup.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CandidateFix',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'message')
+    ..pc<SourceEdit>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'edits', $pb.PbFieldType.PM,
+        subBuilder: SourceEdit.create)
+    ..a<$core.int>(
+        3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'selectionOffset', $pb.PbFieldType.O3,
+        protoName: 'selectionOffset')
+    ..pc<LinkedEditGroup>(
+        4,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'linkedEditGroups',
+        $pb.PbFieldType.PM,
+        protoName: 'linkedEditGroups',
+        subBuilder: LinkedEditGroup.create)
+    ..hasRequiredFields = false;
 
   CandidateFix._() : super();
   factory CandidateFix({
@@ -1036,31 +1444,40 @@
     }
     return _result;
   }
-  factory CandidateFix.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory CandidateFix.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory CandidateFix.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CandidateFix.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   CandidateFix clone() => CandidateFix()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  CandidateFix copyWith(void Function(CandidateFix) updates) => super.copyWith((message) => updates(message as CandidateFix)) as CandidateFix; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CandidateFix copyWith(void Function(CandidateFix) updates) =>
+      super.copyWith((message) => updates(message as CandidateFix))
+          as CandidateFix; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CandidateFix create() => CandidateFix._();
   CandidateFix createEmptyInstance() => create();
-  static $pb.PbList<CandidateFix> createRepeated() => $pb.PbList<CandidateFix>();
+  static $pb.PbList<CandidateFix> createRepeated() =>
+      $pb.PbList<CandidateFix>();
   @$core.pragma('dart2js:noInline')
-  static CandidateFix getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CandidateFix>(create);
+  static CandidateFix getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<CandidateFix>(create);
   static CandidateFix? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get message => $_getSZ(0);
   @$pb.TagNumber(1)
-  set message($core.String v) { $_setString(0, v); }
+  set message($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
@@ -1072,7 +1489,10 @@
   @$pb.TagNumber(3)
   $core.int get selectionOffset => $_getIZ(2);
   @$pb.TagNumber(3)
-  set selectionOffset($core.int v) { $_setSignedInt32(2, v); }
+  set selectionOffset($core.int v) {
+    $_setSignedInt32(2, v);
+  }
+
   @$pb.TagNumber(3)
   $core.bool hasSelectionOffset() => $_has(2);
   @$pb.TagNumber(3)
@@ -1083,12 +1503,30 @@
 }
 
 class SourceEdit extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SourceEdit', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'length', $pb.PbFieldType.O3)
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacement')
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'SourceEdit',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..a<$core.int>(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'offset',
+        $pb.PbFieldType.O3)
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'length',
+        $pb.PbFieldType.O3)
+    ..aOS(3,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacement')
+    ..hasRequiredFields = false;
 
   SourceEdit._() : super();
   factory SourceEdit({
@@ -1108,31 +1546,39 @@
     }
     return _result;
   }
-  factory SourceEdit.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory SourceEdit.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory SourceEdit.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory SourceEdit.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   SourceEdit clone() => SourceEdit()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  SourceEdit copyWith(void Function(SourceEdit) updates) => super.copyWith((message) => updates(message as SourceEdit)) as SourceEdit; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  SourceEdit copyWith(void Function(SourceEdit) updates) =>
+      super.copyWith((message) => updates(message as SourceEdit))
+          as SourceEdit; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static SourceEdit create() => SourceEdit._();
   SourceEdit createEmptyInstance() => create();
   static $pb.PbList<SourceEdit> createRepeated() => $pb.PbList<SourceEdit>();
   @$core.pragma('dart2js:noInline')
-  static SourceEdit getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SourceEdit>(create);
+  static SourceEdit getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<SourceEdit>(create);
   static SourceEdit? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.int get offset => $_getIZ(0);
   @$pb.TagNumber(1)
-  set offset($core.int v) { $_setSignedInt32(0, v); }
+  set offset($core.int v) {
+    $_setSignedInt32(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasOffset() => $_has(0);
   @$pb.TagNumber(1)
@@ -1141,7 +1587,10 @@
   @$pb.TagNumber(2)
   $core.int get length => $_getIZ(1);
   @$pb.TagNumber(2)
-  set length($core.int v) { $_setSignedInt32(1, v); }
+  set length($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasLength() => $_has(1);
   @$pb.TagNumber(2)
@@ -1150,7 +1599,10 @@
   @$pb.TagNumber(3)
   $core.String get replacement => $_getSZ(2);
   @$pb.TagNumber(3)
-  set replacement($core.String v) { $_setString(2, v); }
+  set replacement($core.String v) {
+    $_setString(2, v);
+  }
+
   @$pb.TagNumber(3)
   $core.bool hasReplacement() => $_has(2);
   @$pb.TagNumber(3)
@@ -1158,12 +1610,32 @@
 }
 
 class LinkedEditGroup extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LinkedEditGroup', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..p<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'positions', $pb.PbFieldType.P3)
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'length', $pb.PbFieldType.O3)
-    ..pc<LinkedEditSuggestion>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'suggestions', $pb.PbFieldType.PM, subBuilder: LinkedEditSuggestion.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'LinkedEditGroup',
+      package: const $pb.PackageName($core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..p<$core.int>(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'positions',
+        $pb.PbFieldType.P3)
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'length',
+        $pb.PbFieldType.O3)
+    ..pc<LinkedEditSuggestion>(
+        3,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'suggestions',
+        $pb.PbFieldType.PM,
+        subBuilder: LinkedEditSuggestion.create)
+    ..hasRequiredFields = false;
 
   LinkedEditGroup._() : super();
   factory LinkedEditGroup({
@@ -1183,25 +1655,31 @@
     }
     return _result;
   }
-  factory LinkedEditGroup.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory LinkedEditGroup.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory LinkedEditGroup.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory LinkedEditGroup.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   LinkedEditGroup clone() => LinkedEditGroup()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  LinkedEditGroup copyWith(void Function(LinkedEditGroup) updates) => super.copyWith((message) => updates(message as LinkedEditGroup)) as LinkedEditGroup; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  LinkedEditGroup copyWith(void Function(LinkedEditGroup) updates) =>
+      super.copyWith((message) => updates(message as LinkedEditGroup))
+          as LinkedEditGroup; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static LinkedEditGroup create() => LinkedEditGroup._();
   LinkedEditGroup createEmptyInstance() => create();
-  static $pb.PbList<LinkedEditGroup> createRepeated() => $pb.PbList<LinkedEditGroup>();
+  static $pb.PbList<LinkedEditGroup> createRepeated() =>
+      $pb.PbList<LinkedEditGroup>();
   @$core.pragma('dart2js:noInline')
-  static LinkedEditGroup getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LinkedEditGroup>(create);
+  static LinkedEditGroup getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<LinkedEditGroup>(create);
   static LinkedEditGroup? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -1210,7 +1688,10 @@
   @$pb.TagNumber(2)
   $core.int get length => $_getIZ(1);
   @$pb.TagNumber(2)
-  set length($core.int v) { $_setSignedInt32(1, v); }
+  set length($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasLength() => $_has(1);
   @$pb.TagNumber(2)
@@ -1221,11 +1702,26 @@
 }
 
 class LinkedEditSuggestion extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LinkedEditSuggestion', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind')
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'LinkedEditSuggestion',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'value')
+    ..aOS(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'kind')
+    ..hasRequiredFields = false;
 
   LinkedEditSuggestion._() : super();
   factory LinkedEditSuggestion({
@@ -1241,31 +1737,41 @@
     }
     return _result;
   }
-  factory LinkedEditSuggestion.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory LinkedEditSuggestion.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
-  LinkedEditSuggestion clone() => LinkedEditSuggestion()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  LinkedEditSuggestion copyWith(void Function(LinkedEditSuggestion) updates) => super.copyWith((message) => updates(message as LinkedEditSuggestion)) as LinkedEditSuggestion; // ignore: deprecated_member_use
+  factory LinkedEditSuggestion.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory LinkedEditSuggestion.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  LinkedEditSuggestion clone() =>
+      LinkedEditSuggestion()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  LinkedEditSuggestion copyWith(void Function(LinkedEditSuggestion) updates) =>
+      super.copyWith((message) => updates(message as LinkedEditSuggestion))
+          as LinkedEditSuggestion; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static LinkedEditSuggestion create() => LinkedEditSuggestion._();
   LinkedEditSuggestion createEmptyInstance() => create();
-  static $pb.PbList<LinkedEditSuggestion> createRepeated() => $pb.PbList<LinkedEditSuggestion>();
+  static $pb.PbList<LinkedEditSuggestion> createRepeated() =>
+      $pb.PbList<LinkedEditSuggestion>();
   @$core.pragma('dart2js:noInline')
-  static LinkedEditSuggestion getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LinkedEditSuggestion>(create);
+  static LinkedEditSuggestion getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<LinkedEditSuggestion>(create);
   static LinkedEditSuggestion? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get value => $_getSZ(0);
   @$pb.TagNumber(1)
-  set value($core.String v) { $_setString(0, v); }
+  set value($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasValue() => $_has(0);
   @$pb.TagNumber(1)
@@ -1274,7 +1780,10 @@
   @$pb.TagNumber(2)
   $core.String get kind => $_getSZ(1);
   @$pb.TagNumber(2)
-  set kind($core.String v) { $_setString(1, v); }
+  set kind($core.String v) {
+    $_setString(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasKind() => $_has(1);
   @$pb.TagNumber(2)
@@ -1282,12 +1791,28 @@
 }
 
 class FormatResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FormatResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'newString', protoName: 'newString')
-    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'FormatResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'newString',
+        protoName: 'newString')
+    ..a<$core.int>(
+        2,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'offset',
+        $pb.PbFieldType.O3)
+    ..aOM<ErrorMessage>(
+        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   FormatResponse._() : super();
   factory FormatResponse({
@@ -1307,31 +1832,40 @@
     }
     return _result;
   }
-  factory FormatResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory FormatResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory FormatResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory FormatResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   FormatResponse clone() => FormatResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  FormatResponse copyWith(void Function(FormatResponse) updates) => super.copyWith((message) => updates(message as FormatResponse)) as FormatResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  FormatResponse copyWith(void Function(FormatResponse) updates) =>
+      super.copyWith((message) => updates(message as FormatResponse))
+          as FormatResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static FormatResponse create() => FormatResponse._();
   FormatResponse createEmptyInstance() => create();
-  static $pb.PbList<FormatResponse> createRepeated() => $pb.PbList<FormatResponse>();
+  static $pb.PbList<FormatResponse> createRepeated() =>
+      $pb.PbList<FormatResponse>();
   @$core.pragma('dart2js:noInline')
-  static FormatResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FormatResponse>(create);
+  static FormatResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<FormatResponse>(create);
   static FormatResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get newString => $_getSZ(0);
   @$pb.TagNumber(1)
-  set newString($core.String v) { $_setString(0, v); }
+  set newString($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasNewString() => $_has(0);
   @$pb.TagNumber(1)
@@ -1340,7 +1874,10 @@
   @$pb.TagNumber(2)
   $core.int get offset => $_getIZ(1);
   @$pb.TagNumber(2)
-  set offset($core.int v) { $_setSignedInt32(1, v); }
+  set offset($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasOffset() => $_has(1);
   @$pb.TagNumber(2)
@@ -1349,7 +1886,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -1359,11 +1899,26 @@
 }
 
 class AssistsResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AssistsResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..pc<CandidateFix>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'assists', $pb.PbFieldType.PM, subBuilder: CandidateFix.create)
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'AssistsResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..pc<CandidateFix>(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'assists',
+        $pb.PbFieldType.PM,
+        subBuilder: CandidateFix.create)
+    ..aOM<ErrorMessage>(
+        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   AssistsResponse._() : super();
   factory AssistsResponse({
@@ -1379,25 +1934,31 @@
     }
     return _result;
   }
-  factory AssistsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory AssistsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory AssistsResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory AssistsResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   AssistsResponse clone() => AssistsResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  AssistsResponse copyWith(void Function(AssistsResponse) updates) => super.copyWith((message) => updates(message as AssistsResponse)) as AssistsResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  AssistsResponse copyWith(void Function(AssistsResponse) updates) =>
+      super.copyWith((message) => updates(message as AssistsResponse))
+          as AssistsResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static AssistsResponse create() => AssistsResponse._();
   AssistsResponse createEmptyInstance() => create();
-  static $pb.PbList<AssistsResponse> createRepeated() => $pb.PbList<AssistsResponse>();
+  static $pb.PbList<AssistsResponse> createRepeated() =>
+      $pb.PbList<AssistsResponse>();
   @$core.pragma('dart2js:noInline')
-  static AssistsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AssistsResponse>(create);
+  static AssistsResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<AssistsResponse>(create);
   static AssistsResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
@@ -1406,7 +1967,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(1);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(1);
   @$pb.TagNumber(99)
@@ -1416,18 +1980,29 @@
 }
 
 class VersionResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'VersionResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersion', protoName: 'sdkVersion')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersionFull', protoName: 'sdkVersionFull')
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'runtimeVersion', protoName: 'runtimeVersion')
-    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appEngineVersion', protoName: 'appEngineVersion')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'VersionResponse',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersion',
+        protoName: 'sdkVersion')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersionFull',
+        protoName: 'sdkVersionFull')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'runtimeVersion',
+        protoName: 'runtimeVersion')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appEngineVersion',
+        protoName: 'appEngineVersion')
     ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'servicesVersion', protoName: 'servicesVersion')
     ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'flutterVersion', protoName: 'flutterVersion')
     ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'flutterDartVersion', protoName: 'flutterDartVersion')
     ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'flutterDartVersionFull', protoName: 'flutterDartVersionFull')
     ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+    ..hasRequiredFields = false;
 
   VersionResponse._() : super();
   factory VersionResponse({
@@ -1471,31 +2046,40 @@
     }
     return _result;
   }
-  factory VersionResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory VersionResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory VersionResponse.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory VersionResponse.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   VersionResponse clone() => VersionResponse()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  VersionResponse copyWith(void Function(VersionResponse) updates) => super.copyWith((message) => updates(message as VersionResponse)) as VersionResponse; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  VersionResponse copyWith(void Function(VersionResponse) updates) =>
+      super.copyWith((message) => updates(message as VersionResponse))
+          as VersionResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static VersionResponse create() => VersionResponse._();
   VersionResponse createEmptyInstance() => create();
-  static $pb.PbList<VersionResponse> createRepeated() => $pb.PbList<VersionResponse>();
+  static $pb.PbList<VersionResponse> createRepeated() =>
+      $pb.PbList<VersionResponse>();
   @$core.pragma('dart2js:noInline')
-  static VersionResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VersionResponse>(create);
+  static VersionResponse getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<VersionResponse>(create);
   static VersionResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get sdkVersion => $_getSZ(0);
   @$pb.TagNumber(1)
-  set sdkVersion($core.String v) { $_setString(0, v); }
+  set sdkVersion($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasSdkVersion() => $_has(0);
   @$pb.TagNumber(1)
@@ -1504,7 +2088,10 @@
   @$pb.TagNumber(2)
   $core.String get sdkVersionFull => $_getSZ(1);
   @$pb.TagNumber(2)
-  set sdkVersionFull($core.String v) { $_setString(1, v); }
+  set sdkVersionFull($core.String v) {
+    $_setString(1, v);
+  }
+
   @$pb.TagNumber(2)
   $core.bool hasSdkVersionFull() => $_has(1);
   @$pb.TagNumber(2)
@@ -1513,7 +2100,10 @@
   @$pb.TagNumber(3)
   $core.String get runtimeVersion => $_getSZ(2);
   @$pb.TagNumber(3)
-  set runtimeVersion($core.String v) { $_setString(2, v); }
+  set runtimeVersion($core.String v) {
+    $_setString(2, v);
+  }
+
   @$pb.TagNumber(3)
   $core.bool hasRuntimeVersion() => $_has(2);
   @$pb.TagNumber(3)
@@ -1522,7 +2112,10 @@
   @$pb.TagNumber(4)
   $core.String get appEngineVersion => $_getSZ(3);
   @$pb.TagNumber(4)
-  set appEngineVersion($core.String v) { $_setString(3, v); }
+  set appEngineVersion($core.String v) {
+    $_setString(3, v);
+  }
+
   @$pb.TagNumber(4)
   $core.bool hasAppEngineVersion() => $_has(3);
   @$pb.TagNumber(4)
@@ -1531,7 +2124,10 @@
   @$pb.TagNumber(5)
   $core.String get servicesVersion => $_getSZ(4);
   @$pb.TagNumber(5)
-  set servicesVersion($core.String v) { $_setString(4, v); }
+  set servicesVersion($core.String v) {
+    $_setString(4, v);
+  }
+
   @$pb.TagNumber(5)
   $core.bool hasServicesVersion() => $_has(4);
   @$pb.TagNumber(5)
@@ -1540,7 +2136,10 @@
   @$pb.TagNumber(6)
   $core.String get flutterVersion => $_getSZ(5);
   @$pb.TagNumber(6)
-  set flutterVersion($core.String v) { $_setString(5, v); }
+  set flutterVersion($core.String v) {
+    $_setString(5, v);
+  }
+
   @$pb.TagNumber(6)
   $core.bool hasFlutterVersion() => $_has(5);
   @$pb.TagNumber(6)
@@ -1549,7 +2148,10 @@
   @$pb.TagNumber(7)
   $core.String get flutterDartVersion => $_getSZ(6);
   @$pb.TagNumber(7)
-  set flutterDartVersion($core.String v) { $_setString(6, v); }
+  set flutterDartVersion($core.String v) {
+    $_setString(6, v);
+  }
+
   @$pb.TagNumber(7)
   $core.bool hasFlutterDartVersion() => $_has(6);
   @$pb.TagNumber(7)
@@ -1558,7 +2160,10 @@
   @$pb.TagNumber(8)
   $core.String get flutterDartVersionFull => $_getSZ(7);
   @$pb.TagNumber(8)
-  set flutterDartVersionFull($core.String v) { $_setString(7, v); }
+  set flutterDartVersionFull($core.String v) {
+    $_setString(7, v);
+  }
+
   @$pb.TagNumber(8)
   $core.bool hasFlutterDartVersionFull() => $_has(7);
   @$pb.TagNumber(8)
@@ -1567,7 +2172,10 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(8);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(8);
   @$pb.TagNumber(99)
@@ -1577,10 +2185,22 @@
 }
 
 class BadRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BadRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'BadRequest',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOM<ErrorMessage>(
+        99,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'error',
+        subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false;
 
   BadRequest._() : super();
   factory BadRequest({
@@ -1592,31 +2212,39 @@
     }
     return _result;
   }
-  factory BadRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory BadRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory BadRequest.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BadRequest.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   BadRequest clone() => BadRequest()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  BadRequest copyWith(void Function(BadRequest) updates) => super.copyWith((message) => updates(message as BadRequest)) as BadRequest; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BadRequest copyWith(void Function(BadRequest) updates) =>
+      super.copyWith((message) => updates(message as BadRequest))
+          as BadRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static BadRequest create() => BadRequest._();
   BadRequest createEmptyInstance() => create();
   static $pb.PbList<BadRequest> createRepeated() => $pb.PbList<BadRequest>();
   @$core.pragma('dart2js:noInline')
-  static BadRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BadRequest>(create);
+  static BadRequest getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<BadRequest>(create);
   static BadRequest? _defaultInstance;
 
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(0);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) { setField(99, v); }
+  set error(ErrorMessage v) {
+    setField(99, v);
+  }
+
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(0);
   @$pb.TagNumber(99)
@@ -1626,10 +2254,21 @@
 }
 
 class ErrorMessage extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ErrorMessage', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
-    ..hasRequiredFields = false
-  ;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names')
+          ? ''
+          : 'ErrorMessage',
+      package: const $pb.PackageName(
+          $core.bool.fromEnvironment('protobuf.omit_message_names')
+              ? ''
+              : 'dart_services.api'),
+      createEmptyInstance: create)
+    ..aOS(
+        1,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names')
+            ? ''
+            : 'message')
+    ..hasRequiredFields = false;
 
   ErrorMessage._() : super();
   factory ErrorMessage({
@@ -1641,34 +2280,42 @@
     }
     return _result;
   }
-  factory ErrorMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
-  factory ErrorMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-  'Will be removed in next major version')
+  factory ErrorMessage.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ErrorMessage.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
   ErrorMessage clone() => ErrorMessage()..mergeFromMessage(this);
-  @$core.Deprecated(
-  'Using this can add significant overhead to your binary. '
-  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-  'Will be removed in next major version')
-  ErrorMessage copyWith(void Function(ErrorMessage) updates) => super.copyWith((message) => updates(message as ErrorMessage)) as ErrorMessage; // ignore: deprecated_member_use
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ErrorMessage copyWith(void Function(ErrorMessage) updates) =>
+      super.copyWith((message) => updates(message as ErrorMessage))
+          as ErrorMessage; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static ErrorMessage create() => ErrorMessage._();
   ErrorMessage createEmptyInstance() => create();
-  static $pb.PbList<ErrorMessage> createRepeated() => $pb.PbList<ErrorMessage>();
+  static $pb.PbList<ErrorMessage> createRepeated() =>
+      $pb.PbList<ErrorMessage>();
   @$core.pragma('dart2js:noInline')
-  static ErrorMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ErrorMessage>(create);
+  static ErrorMessage getDefault() => _defaultInstance ??=
+      $pb.GeneratedMessage.$_defaultFor<ErrorMessage>(create);
   static ErrorMessage? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get message => $_getSZ(0);
   @$pb.TagNumber(1)
-  set message($core.String v) { $_setString(0, v); }
+  set message($core.String v) {
+    $_setString(0, v);
+  }
+
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
   void clearMessage() => clearField(1);
 }
-
diff --git a/lib/src/protos/dart_services.pbenum.dart b/lib/src/protos/dart_services.pbenum.dart
index 34dd349..6fee60f 100644
--- a/lib/src/protos/dart_services.pbenum.dart
+++ b/lib/src/protos/dart_services.pbenum.dart
@@ -4,4 +4,3 @@
 //
 // @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
-
diff --git a/lib/src/protos/dart_services.pbjson.dart b/lib/src/protos/dart_services.pbjson.dart
index d7d7e78..50cc753 100644
--- a/lib/src/protos/dart_services.pbjson.dart
+++ b/lib/src/protos/dart_services.pbjson.dart
@@ -8,299 +8,494 @@
 import 'dart:core' as $core;
 import 'dart:convert' as $convert;
 import 'dart:typed_data' as $typed_data;
+
 @$core.Deprecated('Use compileRequestDescriptor instead')
-const CompileRequest$json = const {
+const CompileRequest$json = {
   '1': 'CompileRequest',
-  '2': const [
-    const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
-    const {'1': 'returnSourceMap', '3': 2, '4': 1, '5': 8, '10': 'returnSourceMap'},
+  '2': [
+    {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
+    {'1': 'returnSourceMap', '3': 2, '4': 1, '5': 8, '10': 'returnSourceMap'},
   ],
 };
 
 /// Descriptor for `CompileRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileRequestDescriptor = $convert.base64Decode('Cg5Db21waWxlUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZRIoCg9yZXR1cm5Tb3VyY2VNYXAYAiABKAhSD3JldHVyblNvdXJjZU1hcA==');
+final $typed_data.Uint8List compileRequestDescriptor = $convert.base64Decode(
+    'Cg5Db21waWxlUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZRIoCg9yZXR1cm5Tb3VyY2VNYXAYAiABKAhSD3JldHVyblNvdXJjZU1hcA==');
 @$core.Deprecated('Use compileDDCRequestDescriptor instead')
-const CompileDDCRequest$json = const {
+const CompileDDCRequest$json = {
   '1': 'CompileDDCRequest',
-  '2': const [
-    const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
+  '2': [
+    {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
   ],
 };
 
 /// Descriptor for `CompileDDCRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileDDCRequestDescriptor = $convert.base64Decode('ChFDb21waWxlRERDUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZQ==');
+final $typed_data.Uint8List compileDDCRequestDescriptor = $convert.base64Decode(
+    'ChFDb21waWxlRERDUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZQ==');
 @$core.Deprecated('Use sourceRequestDescriptor instead')
-const SourceRequest$json = const {
+const SourceRequest$json = {
   '1': 'SourceRequest',
-  '2': const [
-    const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
-    const {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
+  '2': [
+    {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
+    {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
   ],
 };
 
 /// Descriptor for `SourceRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List sourceRequestDescriptor = $convert.base64Decode('Cg1Tb3VyY2VSZXF1ZXN0EhYKBnNvdXJjZRgBIAEoCVIGc291cmNlEhYKBm9mZnNldBgCIAEoBVIGb2Zmc2V0');
+final $typed_data.Uint8List sourceRequestDescriptor = $convert.base64Decode(
+    'Cg1Tb3VyY2VSZXF1ZXN0EhYKBnNvdXJjZRgBIAEoCVIGc291cmNlEhYKBm9mZnNldBgCIAEoBVIGb2Zmc2V0');
 @$core.Deprecated('Use analysisResultsDescriptor instead')
-const AnalysisResults$json = const {
+const AnalysisResults$json = {
   '1': 'AnalysisResults',
-  '2': const [
-    const {'1': 'issues', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.AnalysisIssue', '10': 'issues'},
-    const {'1': 'packageImports', '3': 2, '4': 3, '5': 9, '10': 'packageImports'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {
+      '1': 'issues',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.AnalysisIssue',
+      '10': 'issues'
+    },
+    {'1': 'packageImports', '3': 2, '4': 3, '5': 9, '10': 'packageImports'},
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `AnalysisResults`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List analysisResultsDescriptor = $convert.base64Decode('Cg9BbmFseXNpc1Jlc3VsdHMSOAoGaXNzdWVzGAEgAygLMiAuZGFydF9zZXJ2aWNlcy5hcGkuQW5hbHlzaXNJc3N1ZVIGaXNzdWVzEiYKDnBhY2thZ2VJbXBvcnRzGAIgAygJUg5wYWNrYWdlSW1wb3J0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List analysisResultsDescriptor = $convert.base64Decode(
+    'Cg9BbmFseXNpc1Jlc3VsdHMSOAoGaXNzdWVzGAEgAygLMiAuZGFydF9zZXJ2aWNlcy5hcGkuQW5hbHlzaXNJc3N1ZVIGaXNzdWVzEiYKDnBhY2thZ2VJbXBvcnRzGAIgAygJUg5wYWNrYWdlSW1wb3J0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use analysisIssueDescriptor instead')
-const AnalysisIssue$json = const {
+const AnalysisIssue$json = {
   '1': 'AnalysisIssue',
-  '2': const [
-    const {'1': 'kind', '3': 1, '4': 1, '5': 9, '10': 'kind'},
-    const {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
-    const {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},
-    const {'1': 'sourceName', '3': 4, '4': 1, '5': 9, '10': 'sourceName'},
-    const {'1': 'hasFixes', '3': 5, '4': 1, '5': 8, '10': 'hasFixes'},
-    const {'1': 'charStart', '3': 6, '4': 1, '5': 5, '10': 'charStart'},
-    const {'1': 'charLength', '3': 7, '4': 1, '5': 5, '10': 'charLength'},
-    const {'1': 'url', '3': 8, '4': 1, '5': 9, '10': 'url'},
-    const {'1': 'diagnosticMessages', '3': 9, '4': 3, '5': 11, '6': '.dart_services.api.DiagnosticMessage', '10': 'diagnosticMessages'},
-    const {'1': 'correction', '3': 10, '4': 1, '5': 9, '10': 'correction'},
+  '2': [
+    {'1': 'kind', '3': 1, '4': 1, '5': 9, '10': 'kind'},
+    {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
+    {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},
+    {'1': 'sourceName', '3': 4, '4': 1, '5': 9, '10': 'sourceName'},
+    {'1': 'hasFixes', '3': 5, '4': 1, '5': 8, '10': 'hasFixes'},
+    {'1': 'charStart', '3': 6, '4': 1, '5': 5, '10': 'charStart'},
+    {'1': 'charLength', '3': 7, '4': 1, '5': 5, '10': 'charLength'},
+    {'1': 'url', '3': 8, '4': 1, '5': 9, '10': 'url'},
+    {
+      '1': 'diagnosticMessages',
+      '3': 9,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.DiagnosticMessage',
+      '10': 'diagnosticMessages'
+    },
+    {'1': 'correction', '3': 10, '4': 1, '5': 9, '10': 'correction'},
   ],
 };
 
 /// Descriptor for `AnalysisIssue`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List analysisIssueDescriptor = $convert.base64Decode('Cg1BbmFseXNpc0lzc3VlEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEbGluZRgCIAEoBVIEbGluZRIYCgdtZXNzYWdlGAMgASgJUgdtZXNzYWdlEh4KCnNvdXJjZU5hbWUYBCABKAlSCnNvdXJjZU5hbWUSGgoIaGFzRml4ZXMYBSABKAhSCGhhc0ZpeGVzEhwKCWNoYXJTdGFydBgGIAEoBVIJY2hhclN0YXJ0Eh4KCmNoYXJMZW5ndGgYByABKAVSCmNoYXJMZW5ndGgSEAoDdXJsGAggASgJUgN1cmwSVAoSZGlhZ25vc3RpY01lc3NhZ2VzGAkgAygLMiQuZGFydF9zZXJ2aWNlcy5hcGkuRGlhZ25vc3RpY01lc3NhZ2VSEmRpYWdub3N0aWNNZXNzYWdlcxIeCgpjb3JyZWN0aW9uGAogASgJUgpjb3JyZWN0aW9u');
+final $typed_data.Uint8List analysisIssueDescriptor = $convert.base64Decode(
+    'Cg1BbmFseXNpc0lzc3VlEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEbGluZRgCIAEoBVIEbGluZRIYCgdtZXNzYWdlGAMgASgJUgdtZXNzYWdlEh4KCnNvdXJjZU5hbWUYBCABKAlSCnNvdXJjZU5hbWUSGgoIaGFzRml4ZXMYBSABKAhSCGhhc0ZpeGVzEhwKCWNoYXJTdGFydBgGIAEoBVIJY2hhclN0YXJ0Eh4KCmNoYXJMZW5ndGgYByABKAVSCmNoYXJMZW5ndGgSEAoDdXJsGAggASgJUgN1cmwSVAoSZGlhZ25vc3RpY01lc3NhZ2VzGAkgAygLMiQuZGFydF9zZXJ2aWNlcy5hcGkuRGlhZ25vc3RpY01lc3NhZ2VSEmRpYWdub3N0aWNNZXNzYWdlcxIeCgpjb3JyZWN0aW9uGAogASgJUgpjb3JyZWN0aW9u');
 @$core.Deprecated('Use diagnosticMessageDescriptor instead')
-const DiagnosticMessage$json = const {
+const DiagnosticMessage$json = {
   '1': 'DiagnosticMessage',
-  '2': const [
-    const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
-    const {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
-    const {'1': 'charStart', '3': 3, '4': 1, '5': 5, '10': 'charStart'},
-    const {'1': 'charLength', '3': 4, '4': 1, '5': 5, '10': 'charLength'},
+  '2': [
+    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
+    {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
+    {'1': 'charStart', '3': 3, '4': 1, '5': 5, '10': 'charStart'},
+    {'1': 'charLength', '3': 4, '4': 1, '5': 5, '10': 'charLength'},
   ],
 };
 
 /// Descriptor for `DiagnosticMessage`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List diagnosticMessageDescriptor = $convert.base64Decode('ChFEaWFnbm9zdGljTWVzc2FnZRIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdlEhIKBGxpbmUYAiABKAVSBGxpbmUSHAoJY2hhclN0YXJ0GAMgASgFUgljaGFyU3RhcnQSHgoKY2hhckxlbmd0aBgEIAEoBVIKY2hhckxlbmd0aA==');
+final $typed_data.Uint8List diagnosticMessageDescriptor = $convert.base64Decode(
+    'ChFEaWFnbm9zdGljTWVzc2FnZRIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdlEhIKBGxpbmUYAiABKAVSBGxpbmUSHAoJY2hhclN0YXJ0GAMgASgFUgljaGFyU3RhcnQSHgoKY2hhckxlbmd0aBgEIAEoBVIKY2hhckxlbmd0aA==');
 @$core.Deprecated('Use versionRequestDescriptor instead')
-const VersionRequest$json = const {
+const VersionRequest$json = {
   '1': 'VersionRequest',
 };
 
 /// Descriptor for `VersionRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List versionRequestDescriptor = $convert.base64Decode('Cg5WZXJzaW9uUmVxdWVzdA==');
+final $typed_data.Uint8List versionRequestDescriptor =
+    $convert.base64Decode('Cg5WZXJzaW9uUmVxdWVzdA==');
 @$core.Deprecated('Use compileResponseDescriptor instead')
-const CompileResponse$json = const {
+const CompileResponse$json = {
   '1': 'CompileResponse',
-  '2': const [
-    const {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
-    const {'1': 'sourceMap', '3': 2, '4': 1, '5': 9, '10': 'sourceMap'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
+    {'1': 'sourceMap', '3': 2, '4': 1, '5': 9, '10': 'sourceMap'},
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `CompileResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileResponseDescriptor = $convert.base64Decode('Cg9Db21waWxlUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSHAoJc291cmNlTWFwGAIgASgJUglzb3VyY2VNYXASNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
+final $typed_data.Uint8List compileResponseDescriptor = $convert.base64Decode(
+    'Cg9Db21waWxlUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSHAoJc291cmNlTWFwGAIgASgJUglzb3VyY2VNYXASNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
 @$core.Deprecated('Use compileDDCResponseDescriptor instead')
-const CompileDDCResponse$json = const {
+const CompileDDCResponse$json = {
   '1': 'CompileDDCResponse',
-  '2': const [
-    const {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
-    const {'1': 'modulesBaseUrl', '3': 2, '4': 1, '5': 9, '10': 'modulesBaseUrl'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
+    {'1': 'modulesBaseUrl', '3': 2, '4': 1, '5': 9, '10': 'modulesBaseUrl'},
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `CompileDDCResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileDDCResponseDescriptor = $convert.base64Decode('ChJDb21waWxlRERDUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSJgoObW9kdWxlc0Jhc2VVcmwYAiABKAlSDm1vZHVsZXNCYXNlVXJsEjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
+final $typed_data.Uint8List compileDDCResponseDescriptor = $convert.base64Decode(
+    'ChJDb21waWxlRERDUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSJgoObW9kdWxlc0Jhc2VVcmwYAiABKAlSDm1vZHVsZXNCYXNlVXJsEjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
 @$core.Deprecated('Use documentResponseDescriptor instead')
-const DocumentResponse$json = const {
+const DocumentResponse$json = {
   '1': 'DocumentResponse',
-  '2': const [
-    const {'1': 'info', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.DocumentResponse.InfoEntry', '10': 'info'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {
+      '1': 'info',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.DocumentResponse.InfoEntry',
+      '10': 'info'
+    },
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
-  '3': const [DocumentResponse_InfoEntry$json],
+  '3': [DocumentResponse_InfoEntry$json],
 };
 
 @$core.Deprecated('Use documentResponseDescriptor instead')
-const DocumentResponse_InfoEntry$json = const {
+const DocumentResponse_InfoEntry$json = {
   '1': 'InfoEntry',
-  '2': const [
-    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  '2': [
+    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
   ],
-  '7': const {'7': true},
+  '7': {'7': true},
 };
 
 /// Descriptor for `DocumentResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List documentResponseDescriptor = $convert.base64Decode('ChBEb2N1bWVudFJlc3BvbnNlEkEKBGluZm8YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Eb2N1bWVudFJlc3BvbnNlLkluZm9FbnRyeVIEaW5mbxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3IaNwoJSW5mb0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');
+final $typed_data.Uint8List documentResponseDescriptor = $convert.base64Decode(
+    'ChBEb2N1bWVudFJlc3BvbnNlEkEKBGluZm8YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Eb2N1bWVudFJlc3BvbnNlLkluZm9FbnRyeVIEaW5mbxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3IaNwoJSW5mb0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');
 @$core.Deprecated('Use completeResponseDescriptor instead')
-const CompleteResponse$json = const {
+const CompleteResponse$json = {
   '1': 'CompleteResponse',
-  '2': const [
-    const {'1': 'replacementOffset', '3': 1, '4': 1, '5': 5, '10': 'replacementOffset'},
-    const {'1': 'replacementLength', '3': 2, '4': 1, '5': 5, '10': 'replacementLength'},
-    const {'1': 'completions', '3': 3, '4': 3, '5': 11, '6': '.dart_services.api.Completion', '10': 'completions'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {
+      '1': 'replacementOffset',
+      '3': 1,
+      '4': 1,
+      '5': 5,
+      '10': 'replacementOffset'
+    },
+    {
+      '1': 'replacementLength',
+      '3': 2,
+      '4': 1,
+      '5': 5,
+      '10': 'replacementLength'
+    },
+    {
+      '1': 'completions',
+      '3': 3,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.Completion',
+      '10': 'completions'
+    },
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `CompleteResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List completeResponseDescriptor = $convert.base64Decode('ChBDb21wbGV0ZVJlc3BvbnNlEiwKEXJlcGxhY2VtZW50T2Zmc2V0GAEgASgFUhFyZXBsYWNlbWVudE9mZnNldBIsChFyZXBsYWNlbWVudExlbmd0aBgCIAEoBVIRcmVwbGFjZW1lbnRMZW5ndGgSPwoLY29tcGxldGlvbnMYAyADKAsyHS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uUgtjb21wbGV0aW9ucxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List completeResponseDescriptor = $convert.base64Decode(
+    'ChBDb21wbGV0ZVJlc3BvbnNlEiwKEXJlcGxhY2VtZW50T2Zmc2V0GAEgASgFUhFyZXBsYWNlbWVudE9mZnNldBIsChFyZXBsYWNlbWVudExlbmd0aBgCIAEoBVIRcmVwbGFjZW1lbnRMZW5ndGgSPwoLY29tcGxldGlvbnMYAyADKAsyHS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uUgtjb21wbGV0aW9ucxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use completionDescriptor instead')
-const Completion$json = const {
+const Completion$json = {
   '1': 'Completion',
-  '2': const [
-    const {'1': 'completion', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.Completion.CompletionEntry', '10': 'completion'},
+  '2': [
+    {
+      '1': 'completion',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.Completion.CompletionEntry',
+      '10': 'completion'
+    },
   ],
-  '3': const [Completion_CompletionEntry$json],
+  '3': [Completion_CompletionEntry$json],
 };
 
 @$core.Deprecated('Use completionDescriptor instead')
-const Completion_CompletionEntry$json = const {
+const Completion_CompletionEntry$json = {
   '1': 'CompletionEntry',
-  '2': const [
-    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  '2': [
+    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
   ],
-  '7': const {'7': true},
+  '7': {'7': true},
 };
 
 /// Descriptor for `Completion`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List completionDescriptor = $convert.base64Decode('CgpDb21wbGV0aW9uEk0KCmNvbXBsZXRpb24YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uLkNvbXBsZXRpb25FbnRyeVIKY29tcGxldGlvbho9Cg9Db21wbGV0aW9uRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');
+final $typed_data.Uint8List completionDescriptor = $convert.base64Decode(
+    'CgpDb21wbGV0aW9uEk0KCmNvbXBsZXRpb24YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uLkNvbXBsZXRpb25FbnRyeVIKY29tcGxldGlvbho9Cg9Db21wbGV0aW9uRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');
 @$core.Deprecated('Use fixesResponseDescriptor instead')
-const FixesResponse$json = const {
+const FixesResponse$json = {
   '1': 'FixesResponse',
-  '2': const [
-    const {'1': 'fixes', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.ProblemAndFixes', '10': 'fixes'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {
+      '1': 'fixes',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.ProblemAndFixes',
+      '10': 'fixes'
+    },
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `FixesResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List fixesResponseDescriptor = $convert.base64Decode('Cg1GaXhlc1Jlc3BvbnNlEjgKBWZpeGVzGAEgAygLMiIuZGFydF9zZXJ2aWNlcy5hcGkuUHJvYmxlbUFuZEZpeGVzUgVmaXhlcxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List fixesResponseDescriptor = $convert.base64Decode(
+    'Cg1GaXhlc1Jlc3BvbnNlEjgKBWZpeGVzGAEgAygLMiIuZGFydF9zZXJ2aWNlcy5hcGkuUHJvYmxlbUFuZEZpeGVzUgVmaXhlcxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use problemAndFixesDescriptor instead')
-const ProblemAndFixes$json = const {
+const ProblemAndFixes$json = {
   '1': 'ProblemAndFixes',
-  '2': const [
-    const {'1': 'fixes', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.CandidateFix', '10': 'fixes'},
-    const {'1': 'problemMessage', '3': 2, '4': 1, '5': 9, '10': 'problemMessage'},
-    const {'1': 'offset', '3': 3, '4': 1, '5': 5, '10': 'offset'},
-    const {'1': 'length', '3': 4, '4': 1, '5': 5, '10': 'length'},
+  '2': [
+    {
+      '1': 'fixes',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.CandidateFix',
+      '10': 'fixes'
+    },
+    {'1': 'problemMessage', '3': 2, '4': 1, '5': 9, '10': 'problemMessage'},
+    {'1': 'offset', '3': 3, '4': 1, '5': 5, '10': 'offset'},
+    {'1': 'length', '3': 4, '4': 1, '5': 5, '10': 'length'},
   ],
 };
 
 /// Descriptor for `ProblemAndFixes`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List problemAndFixesDescriptor = $convert.base64Decode('Cg9Qcm9ibGVtQW5kRml4ZXMSNQoFZml4ZXMYASADKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5DYW5kaWRhdGVGaXhSBWZpeGVzEiYKDnByb2JsZW1NZXNzYWdlGAIgASgJUg5wcm9ibGVtTWVzc2FnZRIWCgZvZmZzZXQYAyABKAVSBm9mZnNldBIWCgZsZW5ndGgYBCABKAVSBmxlbmd0aA==');
+final $typed_data.Uint8List problemAndFixesDescriptor = $convert.base64Decode(
+    'Cg9Qcm9ibGVtQW5kRml4ZXMSNQoFZml4ZXMYASADKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5DYW5kaWRhdGVGaXhSBWZpeGVzEiYKDnByb2JsZW1NZXNzYWdlGAIgASgJUg5wcm9ibGVtTWVzc2FnZRIWCgZvZmZzZXQYAyABKAVSBm9mZnNldBIWCgZsZW5ndGgYBCABKAVSBmxlbmd0aA==');
 @$core.Deprecated('Use candidateFixDescriptor instead')
-const CandidateFix$json = const {
+const CandidateFix$json = {
   '1': 'CandidateFix',
-  '2': const [
-    const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
-    const {'1': 'edits', '3': 2, '4': 3, '5': 11, '6': '.dart_services.api.SourceEdit', '10': 'edits'},
-    const {'1': 'selectionOffset', '3': 3, '4': 1, '5': 5, '10': 'selectionOffset'},
-    const {'1': 'linkedEditGroups', '3': 4, '4': 3, '5': 11, '6': '.dart_services.api.LinkedEditGroup', '10': 'linkedEditGroups'},
+  '2': [
+    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
+    {
+      '1': 'edits',
+      '3': 2,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.SourceEdit',
+      '10': 'edits'
+    },
+    {'1': 'selectionOffset', '3': 3, '4': 1, '5': 5, '10': 'selectionOffset'},
+    {
+      '1': 'linkedEditGroups',
+      '3': 4,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.LinkedEditGroup',
+      '10': 'linkedEditGroups'
+    },
   ],
 };
 
 /// Descriptor for `CandidateFix`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List candidateFixDescriptor = $convert.base64Decode('CgxDYW5kaWRhdGVGaXgSGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZRIzCgVlZGl0cxgCIAMoCzIdLmRhcnRfc2VydmljZXMuYXBpLlNvdXJjZUVkaXRSBWVkaXRzEigKD3NlbGVjdGlvbk9mZnNldBgDIAEoBVIPc2VsZWN0aW9uT2Zmc2V0Ek4KEGxpbmtlZEVkaXRHcm91cHMYBCADKAsyIi5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0R3JvdXBSEGxpbmtlZEVkaXRHcm91cHM=');
+final $typed_data.Uint8List candidateFixDescriptor = $convert.base64Decode(
+    'CgxDYW5kaWRhdGVGaXgSGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZRIzCgVlZGl0cxgCIAMoCzIdLmRhcnRfc2VydmljZXMuYXBpLlNvdXJjZUVkaXRSBWVkaXRzEigKD3NlbGVjdGlvbk9mZnNldBgDIAEoBVIPc2VsZWN0aW9uT2Zmc2V0Ek4KEGxpbmtlZEVkaXRHcm91cHMYBCADKAsyIi5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0R3JvdXBSEGxpbmtlZEVkaXRHcm91cHM=');
 @$core.Deprecated('Use sourceEditDescriptor instead')
-const SourceEdit$json = const {
+const SourceEdit$json = {
   '1': 'SourceEdit',
-  '2': const [
-    const {'1': 'offset', '3': 1, '4': 1, '5': 5, '10': 'offset'},
-    const {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
-    const {'1': 'replacement', '3': 3, '4': 1, '5': 9, '10': 'replacement'},
+  '2': [
+    {'1': 'offset', '3': 1, '4': 1, '5': 5, '10': 'offset'},
+    {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
+    {'1': 'replacement', '3': 3, '4': 1, '5': 9, '10': 'replacement'},
   ],
 };
 
 /// Descriptor for `SourceEdit`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List sourceEditDescriptor = $convert.base64Decode('CgpTb3VyY2VFZGl0EhYKBm9mZnNldBgBIAEoBVIGb2Zmc2V0EhYKBmxlbmd0aBgCIAEoBVIGbGVuZ3RoEiAKC3JlcGxhY2VtZW50GAMgASgJUgtyZXBsYWNlbWVudA==');
+final $typed_data.Uint8List sourceEditDescriptor = $convert.base64Decode(
+    'CgpTb3VyY2VFZGl0EhYKBm9mZnNldBgBIAEoBVIGb2Zmc2V0EhYKBmxlbmd0aBgCIAEoBVIGbGVuZ3RoEiAKC3JlcGxhY2VtZW50GAMgASgJUgtyZXBsYWNlbWVudA==');
 @$core.Deprecated('Use linkedEditGroupDescriptor instead')
-const LinkedEditGroup$json = const {
+const LinkedEditGroup$json = {
   '1': 'LinkedEditGroup',
-  '2': const [
-    const {'1': 'positions', '3': 1, '4': 3, '5': 5, '10': 'positions'},
-    const {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
-    const {'1': 'suggestions', '3': 3, '4': 3, '5': 11, '6': '.dart_services.api.LinkedEditSuggestion', '10': 'suggestions'},
+  '2': [
+    {'1': 'positions', '3': 1, '4': 3, '5': 5, '10': 'positions'},
+    {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
+    {
+      '1': 'suggestions',
+      '3': 3,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.LinkedEditSuggestion',
+      '10': 'suggestions'
+    },
   ],
 };
 
 /// Descriptor for `LinkedEditGroup`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List linkedEditGroupDescriptor = $convert.base64Decode('Cg9MaW5rZWRFZGl0R3JvdXASHAoJcG9zaXRpb25zGAEgAygFUglwb3NpdGlvbnMSFgoGbGVuZ3RoGAIgASgFUgZsZW5ndGgSSQoLc3VnZ2VzdGlvbnMYAyADKAsyJy5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0U3VnZ2VzdGlvblILc3VnZ2VzdGlvbnM=');
+final $typed_data.Uint8List linkedEditGroupDescriptor = $convert.base64Decode(
+    'Cg9MaW5rZWRFZGl0R3JvdXASHAoJcG9zaXRpb25zGAEgAygFUglwb3NpdGlvbnMSFgoGbGVuZ3RoGAIgASgFUgZsZW5ndGgSSQoLc3VnZ2VzdGlvbnMYAyADKAsyJy5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0U3VnZ2VzdGlvblILc3VnZ2VzdGlvbnM=');
 @$core.Deprecated('Use linkedEditSuggestionDescriptor instead')
-const LinkedEditSuggestion$json = const {
+const LinkedEditSuggestion$json = {
   '1': 'LinkedEditSuggestion',
-  '2': const [
-    const {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'},
-    const {'1': 'kind', '3': 2, '4': 1, '5': 9, '10': 'kind'},
+  '2': [
+    {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'},
+    {'1': 'kind', '3': 2, '4': 1, '5': 9, '10': 'kind'},
   ],
 };
 
 /// Descriptor for `LinkedEditSuggestion`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List linkedEditSuggestionDescriptor = $convert.base64Decode('ChRMaW5rZWRFZGl0U3VnZ2VzdGlvbhIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEa2luZBgCIAEoCVIEa2luZA==');
+final $typed_data.Uint8List linkedEditSuggestionDescriptor = $convert.base64Decode(
+    'ChRMaW5rZWRFZGl0U3VnZ2VzdGlvbhIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEa2luZBgCIAEoCVIEa2luZA==');
 @$core.Deprecated('Use formatResponseDescriptor instead')
-const FormatResponse$json = const {
+const FormatResponse$json = {
   '1': 'FormatResponse',
-  '2': const [
-    const {'1': 'newString', '3': 1, '4': 1, '5': 9, '10': 'newString'},
-    const {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {'1': 'newString', '3': 1, '4': 1, '5': 9, '10': 'newString'},
+    {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `FormatResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List formatResponseDescriptor = $convert.base64Decode('Cg5Gb3JtYXRSZXNwb25zZRIcCgluZXdTdHJpbmcYASABKAlSCW5ld1N0cmluZxIWCgZvZmZzZXQYAiABKAVSBm9mZnNldBI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List formatResponseDescriptor = $convert.base64Decode(
+    'Cg5Gb3JtYXRSZXNwb25zZRIcCgluZXdTdHJpbmcYASABKAlSCW5ld1N0cmluZxIWCgZvZmZzZXQYAiABKAVSBm9mZnNldBI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use assistsResponseDescriptor instead')
-const AssistsResponse$json = const {
+const AssistsResponse$json = {
   '1': 'AssistsResponse',
-  '2': const [
-    const {'1': 'assists', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.CandidateFix', '10': 'assists'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {
+      '1': 'assists',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.dart_services.api.CandidateFix',
+      '10': 'assists'
+    },
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `AssistsResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List assistsResponseDescriptor = $convert.base64Decode('Cg9Bc3Npc3RzUmVzcG9uc2USOQoHYXNzaXN0cxgBIAMoCzIfLmRhcnRfc2VydmljZXMuYXBpLkNhbmRpZGF0ZUZpeFIHYXNzaXN0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List assistsResponseDescriptor = $convert.base64Decode(
+    'Cg9Bc3Npc3RzUmVzcG9uc2USOQoHYXNzaXN0cxgBIAMoCzIfLmRhcnRfc2VydmljZXMuYXBpLkNhbmRpZGF0ZUZpeFIHYXNzaXN0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use versionResponseDescriptor instead')
-const VersionResponse$json = const {
+const VersionResponse$json = {
   '1': 'VersionResponse',
-  '2': const [
-    const {'1': 'sdkVersion', '3': 1, '4': 1, '5': 9, '10': 'sdkVersion'},
-    const {'1': 'sdkVersionFull', '3': 2, '4': 1, '5': 9, '10': 'sdkVersionFull'},
-    const {'1': 'runtimeVersion', '3': 3, '4': 1, '5': 9, '10': 'runtimeVersion'},
-    const {'1': 'appEngineVersion', '3': 4, '4': 1, '5': 9, '10': 'appEngineVersion'},
-    const {'1': 'servicesVersion', '3': 5, '4': 1, '5': 9, '10': 'servicesVersion'},
-    const {'1': 'flutterVersion', '3': 6, '4': 1, '5': 9, '10': 'flutterVersion'},
-    const {'1': 'flutterDartVersion', '3': 7, '4': 1, '5': 9, '10': 'flutterDartVersion'},
-    const {'1': 'flutterDartVersionFull', '3': 8, '4': 1, '5': 9, '10': 'flutterDartVersionFull'},
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {'1': 'sdkVersion', '3': 1, '4': 1, '5': 9, '10': 'sdkVersion'},
+    {'1': 'sdkVersionFull', '3': 2, '4': 1, '5': 9, '10': 'sdkVersionFull'},
+    {'1': 'runtimeVersion', '3': 3, '4': 1, '5': 9, '10': 'runtimeVersion'},
+    {'1': 'appEngineVersion', '3': 4, '4': 1, '5': 9, '10': 'appEngineVersion'},
+    {'1': 'servicesVersion', '3': 5, '4': 1, '5': 9, '10': 'servicesVersion'},
+    {'1': 'flutterVersion', '3': 6, '4': 1, '5': 9, '10': 'flutterVersion'},
+    {
+      '1': 'flutterDartVersion',
+      '3': 7,
+      '4': 1,
+      '5': 9,
+      '10': 'flutterDartVersion'
+    },
+    {
+      '1': 'flutterDartVersionFull',
+      '3': 8,
+      '4': 1,
+      '5': 9,
+      '10': 'flutterDartVersionFull'
+    },
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `VersionResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List versionResponseDescriptor = $convert.base64Decode('Cg9WZXJzaW9uUmVzcG9uc2USHgoKc2RrVmVyc2lvbhgBIAEoCVIKc2RrVmVyc2lvbhImCg5zZGtWZXJzaW9uRnVsbBgCIAEoCVIOc2RrVmVyc2lvbkZ1bGwSJgoOcnVudGltZVZlcnNpb24YAyABKAlSDnJ1bnRpbWVWZXJzaW9uEioKEGFwcEVuZ2luZVZlcnNpb24YBCABKAlSEGFwcEVuZ2luZVZlcnNpb24SKAoPc2VydmljZXNWZXJzaW9uGAUgASgJUg9zZXJ2aWNlc1ZlcnNpb24SJgoOZmx1dHRlclZlcnNpb24YBiABKAlSDmZsdXR0ZXJWZXJzaW9uEi4KEmZsdXR0ZXJEYXJ0VmVyc2lvbhgHIAEoCVISZmx1dHRlckRhcnRWZXJzaW9uEjYKFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwYCCABKAlSFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwSNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
+final $typed_data.Uint8List versionResponseDescriptor = $convert.base64Decode(
+    'Cg9WZXJzaW9uUmVzcG9uc2USHgoKc2RrVmVyc2lvbhgBIAEoCVIKc2RrVmVyc2lvbhImCg5zZGtWZXJzaW9uRnVsbBgCIAEoCVIOc2RrVmVyc2lvbkZ1bGwSJgoOcnVudGltZVZlcnNpb24YAyABKAlSDnJ1bnRpbWVWZXJzaW9uEioKEGFwcEVuZ2luZVZlcnNpb24YBCABKAlSEGFwcEVuZ2luZVZlcnNpb24SKAoPc2VydmljZXNWZXJzaW9uGAUgASgJUg9zZXJ2aWNlc1ZlcnNpb24SJgoOZmx1dHRlclZlcnNpb24YBiABKAlSDmZsdXR0ZXJWZXJzaW9uEi4KEmZsdXR0ZXJEYXJ0VmVyc2lvbhgHIAEoCVISZmx1dHRlckRhcnRWZXJzaW9uEjYKFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwYCCABKAlSFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwSNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
 @$core.Deprecated('Use badRequestDescriptor instead')
-const BadRequest$json = const {
+const BadRequest$json = {
   '1': 'BadRequest',
-  '2': const [
-    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
+  '2': [
+    {
+      '1': 'error',
+      '3': 99,
+      '4': 1,
+      '5': 11,
+      '6': '.dart_services.api.ErrorMessage',
+      '10': 'error'
+    },
   ],
 };
 
 /// Descriptor for `BadRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List badRequestDescriptor = $convert.base64Decode('CgpCYWRSZXF1ZXN0EjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
+final $typed_data.Uint8List badRequestDescriptor = $convert.base64Decode(
+    'CgpCYWRSZXF1ZXN0EjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
 @$core.Deprecated('Use errorMessageDescriptor instead')
-const ErrorMessage$json = const {
+const ErrorMessage$json = {
   '1': 'ErrorMessage',
-  '2': const [
-    const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
+  '2': [
+    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
   ],
 };
 
 /// Descriptor for `ErrorMessage`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List errorMessageDescriptor = $convert.base64Decode('CgxFcnJvck1lc3NhZ2USGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZQ==');
+final $typed_data.Uint8List errorMessageDescriptor = $convert
+    .base64Decode('CgxFcnJvck1lc3NhZ2USGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZQ==');
diff --git a/lib/src/protos/dart_services.pbserver.dart b/lib/src/protos/dart_services.pbserver.dart
index d48ef42..7d2c16b 100644
--- a/lib/src/protos/dart_services.pbserver.dart
+++ b/lib/src/protos/dart_services.pbserver.dart
@@ -6,4 +6,3 @@
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
 
 export 'dart_services.pb.dart';
-
diff --git a/lib/src/sdk_manager.dart b/lib/src/sdk_manager.dart
index 1e38eae..99e078e 100644
--- a/lib/src/sdk_manager.dart
+++ b/lib/src/sdk_manager.dart
@@ -12,24 +12,14 @@
 
 /// Generally, this should be a singleton instance (it's a heavy-weight object).
 class SdkManager {
-  static Sdk get sdk => _sdk ?? (_sdk = PlatformSdk());
+  static FlutterSdk get sdk => _sdk ?? (_sdk = FlutterSdk(flutterSdkPath));
 
-  static FlutterSdk get flutterSdk =>
-      _flutterSdk ?? (_flutterSdk = FlutterSdk(flutterSdkPath));
-
-  static void setSdk(Sdk value) {
+  static void setSdk(FlutterSdk sdk) {
     _sdk = sdk;
   }
 
-  static void setFlutterSdk(FlutterSdk value) {
-    _flutterSdk = value;
-  }
-
-  // The installed Dart SDK.
-  static Sdk _sdk;
-
   // The installed Flutter SDK.
-  static FlutterSdk _flutterSdk;
+  static FlutterSdk _sdk;
 }
 
 abstract class Sdk {
@@ -51,19 +41,6 @@
   String get sdkPath;
 }
 
-/// Represents a Dart SDK present on the server.
-class PlatformSdk extends Sdk {
-  @override
-  Future<void> init() => Future.value();
-
-  @override
-  String get versionFull =>
-      File(path.join(sdkPath, 'version')).readAsStringSync().trim();
-
-  @override
-  String get sdkPath => path.dirname(path.dirname(Platform.resolvedExecutable));
-}
-
 String get flutterSdkPath => path.join(Directory.current.path, 'flutter-sdk');
 
 /// Represents a Flutter SDK installation (which includes its own version of the
diff --git a/lib/src/server_cache.dart b/lib/src/server_cache.dart
index 198cc1c..e7785d9 100644
--- a/lib/src/server_cache.dart
+++ b/lib/src/server_cache.dart
@@ -137,7 +137,7 @@
   /// We don't use the existing key directly so that different AppEngine
   /// versions using the same redis cache do not have collisions.
   String _genKey(String key) =>
-      'server:$serverVersion:dart:${SdkManager.sdk.versionFull}:flutter:${SdkManager.flutterSdk.versionFull}+$key';
+      'server:$serverVersion:dart:${SdkManager.sdk.versionFull}:flutter:${SdkManager.sdk.flutterVersion}+$key';
 
   @override
   Future<String> get(String key) async {
diff --git a/test/analysis_server_test.dart b/test/analysis_server_test.dart
index ca0218d..7b5be14 100644
--- a/test/analysis_server_test.dart
+++ b/test/analysis_server_test.dart
@@ -209,7 +209,7 @@
     FlutterWebManager flutterWebManager;
 
     setUp(() async {
-      flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+      flutterWebManager = FlutterWebManager(SdkManager.sdk);
       analysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
       await analysisServer.init();
     });
diff --git a/test/compiler_test.dart b/test/compiler_test.dart
index 8a5cecf..003eaf9 100644
--- a/test/compiler_test.dart
+++ b/test/compiler_test.dart
@@ -17,9 +17,8 @@
   group('compiler', () {
     setUpAll(() async {
       await SdkManager.sdk.init();
-      await SdkManager.flutterSdk.init();
 
-      compiler = Compiler(SdkManager.sdk, SdkManager.flutterSdk);
+      compiler = Compiler(SdkManager.sdk);
       await compiler.warmup();
     });
 
diff --git a/test/flutter_analysis_server_test.dart b/test/flutter_analysis_server_test.dart
index 99e3628..08788d1 100644
--- a/test/flutter_analysis_server_test.dart
+++ b/test/flutter_analysis_server_test.dart
@@ -208,8 +208,8 @@
     FlutterWebManager flutterWebManager;
 
     setUp(() async {
-      await SdkManager.flutterSdk.init();
-      flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+      await SdkManager.sdk.init();
+      flutterWebManager = FlutterWebManager(SdkManager.sdk);
       analysisServer = FlutterAnalysisServerWrapper(flutterWebManager);
       await analysisServer.init();
       await analysisServer.warmup();
@@ -234,7 +234,7 @@
     AnalysisServersWrapper analysisServersWrapper;
 
     setUp(() async {
-      await SdkManager.flutterSdk.init();
+      await SdkManager.sdk.init();
 
       analysisServersWrapper = AnalysisServersWrapper();
       await analysisServersWrapper.warmup();
@@ -263,7 +263,7 @@
     _MockCache cache;
 
     setUp(() async {
-      await SdkManager.flutterSdk.init();
+      await SdkManager.sdk.init();
       container = _MockContainer();
       cache = _MockCache();
       commonServerImpl = CommonServerImpl(container, cache);
diff --git a/test/flutter_web_test.dart b/test/flutter_web_test.dart
index 89b7561..b5aa79b 100644
--- a/test/flutter_web_test.dart
+++ b/test/flutter_web_test.dart
@@ -18,8 +18,7 @@
 
     setUp(() async {
       await SdkManager.sdk.init();
-      await SdkManager.flutterSdk.init();
-      flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+      flutterWebManager = FlutterWebManager(SdkManager.sdk);
     });
 
     test('inited', () async {
@@ -57,8 +56,7 @@
 
     setUpAll(() async {
       await SdkManager.sdk.init();
-      await SdkManager.flutterSdk.init();
-      flutterWebManager = FlutterWebManager(SdkManager.flutterSdk);
+      flutterWebManager = FlutterWebManager(SdkManager.sdk);
     });
 
     test('packagesFilePath', () async {
diff --git a/tool/fuzz_driver.dart b/tool/fuzz_driver.dart
index 5f918f6..3d19fa0 100644
--- a/tool/fuzz_driver.dart
+++ b/tool/fuzz_driver.dart
@@ -133,7 +133,7 @@
   await analysisServer.warmup();
 
   print('Warming up compiler');
-  compiler = comp.Compiler(SdkManager.sdk, SdkManager.flutterSdk);
+  compiler = comp.Compiler(SdkManager.sdk);
   await compiler.warmup();
   print('SetupTools done');
 }
diff --git a/tool/grind.dart b/tool/grind.dart
index dbf6c0f..1215584 100644
--- a/tool/grind.dart
+++ b/tool/grind.dart
@@ -23,7 +23,6 @@
 @Depends(setupFlutterSdk)
 void sdkInit() async {
   await SdkManager.sdk.init();
-  await SdkManager.flutterSdk.init();
 }
 
 @Task()
@@ -83,7 +82,7 @@
     'google storage')
 @Depends(sdkInit)
 void validateStorageArtifacts() async {
-  final version = SdkManager.flutterSdk.versionFull;
+  final version = SdkManager.sdk.versionFull;
 
   const urlBase = 'https://storage.googleapis.com/compilation_artifacts/';
 
@@ -143,7 +142,7 @@
   log('running flutter pub get (${dir.path})');
 
   await runWithLogging(
-    path.join(SdkManager.flutterSdk.flutterBinPath, 'flutter'),
+    path.join(SdkManager.sdk.flutterBinPath, 'flutter'),
     arguments: ['pub', 'get'],
     workingDirectory: dir.path,
   );
@@ -244,7 +243,7 @@
   copy(joinFile(dir, ['flutter_web.dill']), artifactsDir);
 
   // Emit some good google storage upload instructions.
-  final version = SdkManager.flutterSdk.versionFull;
+  final version = SdkManager.sdk.versionFull;
   log('\nFrom the dart-services project root dir, run:');
   log('  gsutil -h "Cache-Control:public, max-age=86400" cp -z js '
       'artifacts/*.js gs://compilation_artifacts/$version/');
