diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce00d95..10a7ae0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,27 @@
 - Add `connectionState` attribute and `connectionstatechange` listener to
   `RtcPeerConnection`.
 
+### Tools
+
+#### Linter
+
+Updated the Linter to `1.23.0`, which includes changes that
+
+- fixes `no_leading_underscores_for_local_identifiers`
+  to lint local function declarations.
+- fixes `avoid_init_to_null` to correctly handle super
+  initializing defaults that are non-null.
+- updates `no_leading_underscores_for_local_identifiers`
+  to allow identifiers with just underscores.
+- fixes `flutter_style_todos` to support usernames that
+  start with a digit.
+- updates `require_trailing_commas` to handle functions
+  in asserts and multi-line strings.
+- updates `unsafe_html` to allow assignments to
+  `img.src`.
+- fixes `unnecessary_null_checks` to properly handle map
+  literal entries.
+
 ## 2.17.0
 
 ### Language
@@ -274,22 +295,8 @@
 
 #### Linter
 
-Updated the Linter to `1.23.0`, which includes changes that
+Updated the Linter to `1.22.0`, which includes changes that
 
-- fixes `no_leading_underscores_for_local_identifiers`
-  to lint local function declarations.
-- fixes `avoid_init_to_null` to correctly handle super
-  initializing defaults that are non-null.
-- updates `no_leading_underscores_for_local_identifiers`
-  to allow identifiers with just underscores.
-- fixes `flutter_style_todos` to support usernames that
-  start with a digit.
-- updates `require_trailing_commas` to handle functions
-  in asserts and multi-line strings.
-- updates `unsafe_html` to allow assignments to 
-  `img.src`.
-- fixes `unnecessary_null_checks` to properly handle map
-  literal entries.
 - fixes null-safe variance exceptions in `invariant_booleans`.
 - updates `depend_on_referenced_packages` to treat `flutter_gen` as a virtual
   package, not needing an explicit dependency.
diff --git a/DEPS b/DEPS
index 2075bbb..75ce990 100644
--- a/DEPS
+++ b/DEPS
@@ -144,7 +144,7 @@
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
   "shelf_packages_handler_rev": "78302e67c035047e6348e692b0c1182131f0fe35",
   "shelf_proxy_rev": "124615d0614b38814970aa9638725d9d6b435268",
-  "shelf_rev": "78ac724a7944700340a3cef28c84bccbe62e9367",
+  "shelf_rev": "6d1f24da2f85ba221dda3cfaadb4d3fc043e8eec",
   "shelf_static_rev": "202ec1a53c9a830c17cf3b718d089cf7eba568ad",
   "shelf_web_socket_rev": "24fb8a04befa75a94ac63a27047b231d1a22aab4",
   "source_map_stack_trace_rev": "8eabd96b1811e30a11d3c54c9b4afae4fb72e98f",
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index cf3476b..437ae8a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -282,6 +282,17 @@
   }
 
   @override
+  void beginLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {
+    listener?.beginLibraryAugmentation(libraryKeyword, augmentKeyword);
+  }
+
+  @override
+  void endLibraryAugmentation(
+      Token libraryKeyword, Token augmentKeyword, Token semicolon) {
+    listener?.endLibraryAugmentation(libraryKeyword, augmentKeyword, semicolon);
+  }
+
+  @override
   void beginLibraryName(Token token) {
     listener?.beginLibraryName(token);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index d31bac8b..f72d10b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -953,6 +953,16 @@
     logEvent("LabeledStatement");
   }
 
+  void beginLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {}
+
+  /// Handle the end of a library augmentation directive.  Substructures:
+  /// - metadata
+  /// - uri
+  void endLibraryAugmentation(
+      Token libraryKeyword, Token augmentKeyword, Token semicolon) {
+    logEvent("LibraryAugmentation");
+  }
+
   void beginLibraryName(Token token) {}
 
   /// Handle the end of a library directive.  Substructures:
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index 4359e27..89a8755 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -617,7 +617,13 @@
         } else if (identical(value, 'library')) {
           context.parseTopLevelKeywordModifiers(start, keyword);
           directiveState?.checkLibrary(this, keyword);
-          return parseLibraryName(keyword);
+          final Token tokenAfterKeyword = keyword.next!;
+          if (tokenAfterKeyword.isIdentifier &&
+              tokenAfterKeyword.lexeme == 'augment') {
+            return parseLibraryAugmentation(keyword, tokenAfterKeyword);
+          } else {
+            return parseLibraryName(keyword);
+          }
         }
       }
     }
@@ -626,6 +632,23 @@
   }
 
   /// ```
+  /// libraryAugmentationDirective:
+  ///   'library' 'augment' uri ';'
+  /// ;
+  /// ```
+  Token parseLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {
+    assert(optional('library', libraryKeyword));
+    assert(optional('augment', augmentKeyword));
+    listener.beginUncategorizedTopLevelDeclaration(libraryKeyword);
+    listener.beginLibraryAugmentation(libraryKeyword, augmentKeyword);
+    Token start = augmentKeyword;
+    Token token = ensureLiteralString(start);
+    Token semicolon = ensureSemicolon(token);
+    listener.endLibraryAugmentation(libraryKeyword, augmentKeyword, semicolon);
+    return semicolon;
+  }
+
+  /// ```
   /// libraryDirective:
   ///   'library' qualified ';'
   /// ;
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index 7836814..c751542 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -6,7 +6,7 @@
 import 'dart:convert' show jsonDecode, jsonEncode;
 import 'dart:io';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -209,7 +209,7 @@
 class LspAnalysisServerMemoryUsageTest
     extends AbstractLspAnalysisServerIntegrationTest
     with ServerMemoryUsageMixin {
-  Map<String, List<Diagnostic>> currentAnalysisErrors = {};
+  Map<String, List<lsp.Diagnostic>> currentAnalysisErrors = {};
 
   @override
   void expect(Object? actual, Matcher matcher, {String? reason}) =>
@@ -227,7 +227,7 @@
     ]);
     await super.setUp();
 
-    errorNotificationsFromServer.listen((NotificationMessage error) {
+    errorNotificationsFromServer.listen((lsp.NotificationMessage error) {
       // A server error should never happen during an integration test.
       fail('${error.toJson()}');
     });
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol.dart b/pkg/analysis_server/lib/lsp_protocol/protocol.dart
new file mode 100644
index 0000000..7243549
--- /dev/null
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart'
+    hide jsonEncoder;
+export 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+export 'package:analysis_server/lsp_protocol/protocol_special.dart';
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
index 6ba59ff..e3c0fe5 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -96,17 +96,17 @@
   );
 
   ClosingLabel({
-    required this.range,
     required this.label,
+    required this.range,
   });
   static ClosingLabel fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final labelJson = json['label'];
     final label = labelJson as String;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return ClosingLabel(
-      range: range,
       label: label,
+      range: range,
     );
   }
 
@@ -115,31 +115,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     __result['label'] = label;
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
-      try {
-        if (!obj.containsKey('range')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final range = obj['range'];
-        if (range == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
@@ -158,6 +140,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ClosingLabel');
@@ -168,15 +168,15 @@
   @override
   bool operator ==(Object other) {
     if (other is ClosingLabel && other.runtimeType == ClosingLabel) {
-      return range == other.range && label == other.label && true;
+      return label == other.label && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         label,
+        range,
       );
 
   @override
@@ -307,38 +307,38 @@
   );
 
   DartSuggestionSetCompletionItemResolutionInfo({
-    required this.file,
-    required this.offset,
-    required this.libId,
     required this.displayUri,
-    required this.rOffset,
+    required this.file,
     required this.iLength,
+    required this.libId,
+    required this.offset,
     required this.rLength,
+    required this.rOffset,
   });
   static DartSuggestionSetCompletionItemResolutionInfo fromJson(
       Map<String, Object?> json) {
-    final fileJson = json['file'];
-    final file = fileJson as String;
-    final offsetJson = json['offset'];
-    final offset = offsetJson as int;
-    final libIdJson = json['libId'];
-    final libId = libIdJson as int;
     final displayUriJson = json['displayUri'];
     final displayUri = displayUriJson as String;
-    final rOffsetJson = json['rOffset'];
-    final rOffset = rOffsetJson as int;
+    final fileJson = json['file'];
+    final file = fileJson as String;
     final iLengthJson = json['iLength'];
     final iLength = iLengthJson as int;
+    final libIdJson = json['libId'];
+    final libId = libIdJson as int;
+    final offsetJson = json['offset'];
+    final offset = offsetJson as int;
     final rLengthJson = json['rLength'];
     final rLength = rLengthJson as int;
+    final rOffsetJson = json['rOffset'];
+    final rOffset = rOffsetJson as int;
     return DartSuggestionSetCompletionItemResolutionInfo(
-      file: file,
-      offset: offset,
-      libId: libId,
       displayUri: displayUri,
-      rOffset: rOffset,
+      file: file,
       iLength: iLength,
+      libId: libId,
+      offset: offset,
       rLength: rLength,
+      rOffset: rOffset,
     );
   }
 
@@ -352,18 +352,36 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['file'] = file;
-    __result['offset'] = offset;
-    __result['libId'] = libId;
     __result['displayUri'] = displayUri;
-    __result['rOffset'] = rOffset;
+    __result['file'] = file;
     __result['iLength'] = iLength;
+    __result['libId'] = libId;
+    __result['offset'] = offset;
     __result['rLength'] = rLength;
+    __result['rOffset'] = rOffset;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('displayUri');
+      try {
+        if (!obj.containsKey('displayUri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final displayUri = obj['displayUri'];
+        if (displayUri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(displayUri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('file');
       try {
         if (!obj.containsKey('file')) {
@@ -382,18 +400,18 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('offset');
+      reporter.push('iLength');
       try {
-        if (!obj.containsKey('offset')) {
+        if (!obj.containsKey('iLength')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final offset = obj['offset'];
-        if (offset == null) {
+        final iLength = obj['iLength'];
+        if (iLength == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(offset is int)) {
+        if (!(iLength is int)) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -418,54 +436,18 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('displayUri');
+      reporter.push('offset');
       try {
-        if (!obj.containsKey('displayUri')) {
+        if (!obj.containsKey('offset')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final displayUri = obj['displayUri'];
-        if (displayUri == null) {
+        final offset = obj['offset'];
+        if (offset == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(displayUri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('rOffset');
-      try {
-        if (!obj.containsKey('rOffset')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final rOffset = obj['rOffset'];
-        if (rOffset == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(rOffset is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('iLength');
-      try {
-        if (!obj.containsKey('iLength')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final iLength = obj['iLength'];
-        if (iLength == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(iLength is int)) {
+        if (!(offset is int)) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -490,6 +472,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('rOffset');
+      try {
+        if (!obj.containsKey('rOffset')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final rOffset = obj['rOffset'];
+        if (rOffset == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(rOffset is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -502,13 +502,13 @@
   bool operator ==(Object other) {
     if (other is DartSuggestionSetCompletionItemResolutionInfo &&
         other.runtimeType == DartSuggestionSetCompletionItemResolutionInfo) {
-      return file == other.file &&
-          offset == other.offset &&
-          libId == other.libId &&
-          displayUri == other.displayUri &&
-          rOffset == other.rOffset &&
+      return displayUri == other.displayUri &&
+          file == other.file &&
           iLength == other.iLength &&
+          libId == other.libId &&
+          offset == other.offset &&
           rLength == other.rLength &&
+          rOffset == other.rOffset &&
           true;
     }
     return false;
@@ -516,13 +516,13 @@
 
   @override
   int get hashCode => Object.hash(
-        file,
-        offset,
-        libId,
         displayUri,
-        rOffset,
+        file,
         iLength,
+        libId,
+        offset,
         rLength,
+        rOffset,
       );
 
   @override
@@ -536,35 +536,35 @@
   );
 
   Element({
-    this.range,
-    required this.name,
     required this.kind,
+    required this.name,
     this.parameters,
-    this.typeParameters,
+    this.range,
     this.returnType,
+    this.typeParameters,
   });
   static Element fromJson(Map<String, Object?> json) {
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final nameJson = json['name'];
+    final name = nameJson as String;
+    final parametersJson = json['parameters'];
+    final parameters = parametersJson as String?;
     final rangeJson = json['range'];
     final range = rangeJson != null
         ? Range.fromJson(rangeJson as Map<String, Object?>)
         : null;
-    final nameJson = json['name'];
-    final name = nameJson as String;
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
-    final parametersJson = json['parameters'];
-    final parameters = parametersJson as String?;
-    final typeParametersJson = json['typeParameters'];
-    final typeParameters = typeParametersJson as String?;
     final returnTypeJson = json['returnType'];
     final returnType = returnTypeJson as String?;
+    final typeParametersJson = json['typeParameters'];
+    final typeParameters = typeParametersJson as String?;
     return Element(
-      range: range,
-      name: name,
       kind: kind,
+      name: name,
       parameters: parameters,
-      typeParameters: typeParameters,
+      range: range,
       returnType: returnType,
+      typeParameters: typeParameters,
     );
   }
 
@@ -577,30 +577,38 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (range != null) {
-      __result['range'] = range?.toJson();
-    }
-    __result['name'] = name;
     __result['kind'] = kind;
+    __result['name'] = name;
     if (parameters != null) {
       __result['parameters'] = parameters;
     }
-    if (typeParameters != null) {
-      __result['typeParameters'] = typeParameters;
+    if (range != null) {
+      __result['range'] = range?.toJson();
     }
     if (returnType != null) {
       __result['returnType'] = returnType;
     }
+    if (typeParameters != null) {
+      __result['typeParameters'] = typeParameters;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
+      reporter.push('kind');
       try {
-        final range = obj['range'];
-        if (range != null && !(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -624,28 +632,30 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('kind');
+      reporter.push('parameters');
       try {
-        if (!obj.containsKey('kind')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final kind = obj['kind'];
-        if (kind == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(kind is String)) {
+        final parameters = obj['parameters'];
+        if (parameters != null && !(parameters is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('parameters');
+      reporter.push('range');
       try {
-        final parameters = obj['parameters'];
-        if (parameters != null && !(parameters is String)) {
+        final range = obj['range'];
+        if (range != null && !(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('returnType');
+      try {
+        final returnType = obj['returnType'];
+        if (returnType != null && !(returnType is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -662,16 +672,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('returnType');
-      try {
-        final returnType = obj['returnType'];
-        if (returnType != null && !(returnType is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type Element');
@@ -682,12 +682,12 @@
   @override
   bool operator ==(Object other) {
     if (other is Element && other.runtimeType == Element) {
-      return range == other.range &&
+      return kind == other.kind &&
           name == other.name &&
-          kind == other.kind &&
           parameters == other.parameters &&
-          typeParameters == other.typeParameters &&
+          range == other.range &&
           returnType == other.returnType &&
+          typeParameters == other.typeParameters &&
           true;
     }
     return false;
@@ -695,12 +695,12 @@
 
   @override
   int get hashCode => Object.hash(
-        range,
-        name,
         kind,
+        name,
         parameters,
-        typeParameters,
+        range,
         returnType,
+        typeParameters,
       );
 
   @override
@@ -714,52 +714,52 @@
   );
 
   FlutterOutline({
+    this.attributes,
+    this.children,
+    this.className,
+    required this.codeRange,
+    this.dartElement,
     required this.kind,
     this.label,
-    this.className,
-    this.variableName,
-    this.attributes,
-    this.dartElement,
     required this.range,
-    required this.codeRange,
-    this.children,
+    this.variableName,
   });
   static FlutterOutline fromJson(Map<String, Object?> json) {
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
-    final labelJson = json['label'];
-    final label = labelJson as String?;
-    final classNameJson = json['className'];
-    final className = classNameJson as String?;
-    final variableNameJson = json['variableName'];
-    final variableName = variableNameJson as String?;
     final attributesJson = json['attributes'];
     final attributes = (attributesJson as List<Object?>?)
         ?.map((item) =>
             FlutterOutlineAttribute.fromJson(item as Map<String, Object?>))
         .toList();
-    final dartElementJson = json['dartElement'];
-    final dartElement = dartElementJson != null
-        ? Element.fromJson(dartElementJson as Map<String, Object?>)
-        : null;
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
-    final codeRangeJson = json['codeRange'];
-    final codeRange = Range.fromJson(codeRangeJson as Map<String, Object?>);
     final childrenJson = json['children'];
     final children = (childrenJson as List<Object?>?)
         ?.map((item) => FlutterOutline.fromJson(item as Map<String, Object?>))
         .toList();
+    final classNameJson = json['className'];
+    final className = classNameJson as String?;
+    final codeRangeJson = json['codeRange'];
+    final codeRange = Range.fromJson(codeRangeJson as Map<String, Object?>);
+    final dartElementJson = json['dartElement'];
+    final dartElement = dartElementJson != null
+        ? Element.fromJson(dartElementJson as Map<String, Object?>)
+        : null;
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final labelJson = json['label'];
+    final label = labelJson as String?;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final variableNameJson = json['variableName'];
+    final variableName = variableNameJson as String?;
     return FlutterOutline(
+      attributes: attributes,
+      children: children,
+      className: className,
+      codeRange: codeRange,
+      dartElement: dartElement,
       kind: kind,
       label: label,
-      className: className,
-      variableName: variableName,
-      attributes: attributes,
-      dartElement: dartElement,
       range: range,
-      codeRange: codeRange,
-      children: children,
+      variableName: variableName,
     );
   }
 
@@ -775,33 +775,97 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind;
-    if (label != null) {
-      __result['label'] = label;
-    }
-    if (className != null) {
-      __result['className'] = className;
-    }
-    if (variableName != null) {
-      __result['variableName'] = variableName;
-    }
     if (attributes != null) {
       __result['attributes'] =
           attributes?.map((item) => item.toJson()).toList();
     }
+    if (children != null) {
+      __result['children'] = children?.map((item) => item.toJson()).toList();
+    }
+    if (className != null) {
+      __result['className'] = className;
+    }
+    __result['codeRange'] = codeRange.toJson();
     if (dartElement != null) {
       __result['dartElement'] = dartElement?.toJson();
     }
+    __result['kind'] = kind;
+    if (label != null) {
+      __result['label'] = label;
+    }
     __result['range'] = range.toJson();
-    __result['codeRange'] = codeRange.toJson();
-    if (children != null) {
-      __result['children'] = children?.map((item) => item.toJson()).toList();
+    if (variableName != null) {
+      __result['variableName'] = variableName;
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('attributes');
+      try {
+        final attributes = obj['attributes'];
+        if (attributes != null &&
+            !((attributes is List<Object?> &&
+                (attributes.every((item) =>
+                    FlutterOutlineAttribute.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<FlutterOutlineAttribute>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('children');
+      try {
+        final children = obj['children'];
+        if (children != null &&
+            !((children is List<Object?> &&
+                (children.every(
+                    (item) => FlutterOutline.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<FlutterOutline>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('className');
+      try {
+        final className = obj['className'];
+        if (className != null && !(className is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('codeRange');
+      try {
+        if (!obj.containsKey('codeRange')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final codeRange = obj['codeRange'];
+        if (codeRange == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(codeRange, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('dartElement');
+      try {
+        final dartElement = obj['dartElement'];
+        if (dartElement != null && !(Element.canParse(dartElement, reporter))) {
+          reporter.reportError('must be of type Element');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -830,49 +894,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('className');
-      try {
-        final className = obj['className'];
-        if (className != null && !(className is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('variableName');
-      try {
-        final variableName = obj['variableName'];
-        if (variableName != null && !(variableName is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('attributes');
-      try {
-        final attributes = obj['attributes'];
-        if (attributes != null &&
-            !((attributes is List<Object?> &&
-                (attributes.every((item) =>
-                    FlutterOutlineAttribute.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<FlutterOutlineAttribute>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('dartElement');
-      try {
-        final dartElement = obj['dartElement'];
-        if (dartElement != null && !(Element.canParse(dartElement, reporter))) {
-          reporter.reportError('must be of type Element');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -891,32 +912,11 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('codeRange');
+      reporter.push('variableName');
       try {
-        if (!obj.containsKey('codeRange')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final codeRange = obj['codeRange'];
-        if (codeRange == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(codeRange, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('children');
-      try {
-        final children = obj['children'];
-        if (children != null &&
-            !((children is List<Object?> &&
-                (children.every(
-                    (item) => FlutterOutline.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<FlutterOutline>');
+        final variableName = obj['variableName'];
+        if (variableName != null && !(variableName is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -932,20 +932,20 @@
   @override
   bool operator ==(Object other) {
     if (other is FlutterOutline && other.runtimeType == FlutterOutline) {
-      return kind == other.kind &&
-          label == other.label &&
-          className == other.className &&
-          variableName == other.variableName &&
-          listEqual(
+      return listEqual(
               attributes,
               other.attributes,
               (FlutterOutlineAttribute a, FlutterOutlineAttribute b) =>
                   a == b) &&
-          dartElement == other.dartElement &&
-          range == other.range &&
-          codeRange == other.codeRange &&
           listEqual(children, other.children,
               (FlutterOutline a, FlutterOutline b) => a == b) &&
+          className == other.className &&
+          codeRange == other.codeRange &&
+          dartElement == other.dartElement &&
+          kind == other.kind &&
+          label == other.label &&
+          range == other.range &&
+          variableName == other.variableName &&
           true;
     }
     return false;
@@ -953,15 +953,15 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(attributes),
+        lspHashCode(children),
+        className,
+        codeRange,
+        dartElement,
         kind,
         label,
-        className,
-        variableName,
-        lspHashCode(attributes),
-        dartElement,
         range,
-        codeRange,
-        lspHashCode(children),
+        variableName,
       );
 
   @override
@@ -975,22 +975,22 @@
   );
 
   FlutterOutlineAttribute({
-    required this.name,
     required this.label,
+    required this.name,
     this.valueRange,
   });
   static FlutterOutlineAttribute fromJson(Map<String, Object?> json) {
-    final nameJson = json['name'];
-    final name = nameJson as String;
     final labelJson = json['label'];
     final label = labelJson as String;
+    final nameJson = json['name'];
+    final name = nameJson as String;
     final valueRangeJson = json['valueRange'];
     final valueRange = valueRangeJson != null
         ? Range.fromJson(valueRangeJson as Map<String, Object?>)
         : null;
     return FlutterOutlineAttribute(
-      name: name,
       label: label,
+      name: name,
       valueRange: valueRange,
     );
   }
@@ -1001,8 +1001,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['name'] = name;
     __result['label'] = label;
+    __result['name'] = name;
     if (valueRange != null) {
       __result['valueRange'] = valueRange?.toJson();
     }
@@ -1011,24 +1011,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('name');
-      try {
-        if (!obj.containsKey('name')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final name = obj['name'];
-        if (name == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(name is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
@@ -1047,6 +1029,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('name');
+      try {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final name = obj['name'];
+        if (name == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(name is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('valueRange');
       try {
         final valueRange = obj['valueRange'];
@@ -1068,8 +1068,8 @@
   bool operator ==(Object other) {
     if (other is FlutterOutlineAttribute &&
         other.runtimeType == FlutterOutlineAttribute) {
-      return name == other.name &&
-          label == other.label &&
+      return label == other.label &&
+          name == other.name &&
           valueRange == other.valueRange &&
           true;
     }
@@ -1078,8 +1078,8 @@
 
   @override
   int get hashCode => Object.hash(
-        name,
         label,
+        name,
         valueRange,
       );
 
@@ -1094,27 +1094,27 @@
   );
 
   Outline({
+    this.children,
+    required this.codeRange,
     required this.element,
     required this.range,
-    required this.codeRange,
-    this.children,
   });
   static Outline fromJson(Map<String, Object?> json) {
-    final elementJson = json['element'];
-    final element = Element.fromJson(elementJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
-    final codeRangeJson = json['codeRange'];
-    final codeRange = Range.fromJson(codeRangeJson as Map<String, Object?>);
     final childrenJson = json['children'];
     final children = (childrenJson as List<Object?>?)
         ?.map((item) => Outline.fromJson(item as Map<String, Object?>))
         .toList();
+    final codeRangeJson = json['codeRange'];
+    final codeRange = Range.fromJson(codeRangeJson as Map<String, Object?>);
+    final elementJson = json['element'];
+    final element = Element.fromJson(elementJson as Map<String, Object?>);
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return Outline(
+      children: children,
+      codeRange: codeRange,
       element: element,
       range: range,
-      codeRange: codeRange,
-      children: children,
     );
   }
 
@@ -1125,17 +1125,48 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['element'] = element.toJson();
-    __result['range'] = range.toJson();
-    __result['codeRange'] = codeRange.toJson();
     if (children != null) {
       __result['children'] = children?.map((item) => item.toJson()).toList();
     }
+    __result['codeRange'] = codeRange.toJson();
+    __result['element'] = element.toJson();
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('children');
+      try {
+        final children = obj['children'];
+        if (children != null &&
+            !((children is List<Object?> &&
+                (children
+                    .every((item) => Outline.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Outline>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('codeRange');
+      try {
+        if (!obj.containsKey('codeRange')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final codeRange = obj['codeRange'];
+        if (codeRange == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(codeRange, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('element');
       try {
         if (!obj.containsKey('element')) {
@@ -1172,37 +1203,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('codeRange');
-      try {
-        if (!obj.containsKey('codeRange')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final codeRange = obj['codeRange'];
-        if (codeRange == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(codeRange, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('children');
-      try {
-        final children = obj['children'];
-        if (children != null &&
-            !((children is List<Object?> &&
-                (children
-                    .every((item) => Outline.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<Outline>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type Outline');
@@ -1213,11 +1213,11 @@
   @override
   bool operator ==(Object other) {
     if (other is Outline && other.runtimeType == Outline) {
-      return element == other.element &&
-          range == other.range &&
-          codeRange == other.codeRange &&
-          listEqual(
+      return listEqual(
               children, other.children, (Outline a, Outline b) => a == b) &&
+          codeRange == other.codeRange &&
+          element == other.element &&
+          range == other.range &&
           true;
     }
     return false;
@@ -1225,10 +1225,10 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(children),
+        codeRange,
         element,
         range,
-        codeRange,
-        lspHashCode(children),
       );
 
   @override
@@ -1313,19 +1313,19 @@
   );
 
   PublishClosingLabelsParams({
-    required this.uri,
     required this.labels,
+    required this.uri,
   });
   static PublishClosingLabelsParams fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final labelsJson = json['labels'];
     final labels = (labelsJson as List<Object?>)
         .map((item) => ClosingLabel.fromJson(item as Map<String, Object?>))
         .toList();
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return PublishClosingLabelsParams(
-      uri: uri,
       labels: labels,
+      uri: uri,
     );
   }
 
@@ -1334,31 +1334,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
     __result['labels'] = labels.map((item) => item.toJson()).toList();
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final uri = obj['uri'];
-        if (uri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('labels');
       try {
         if (!obj.containsKey('labels')) {
@@ -1378,69 +1360,6 @@
       } finally {
         reporter.pop();
       }
-      return true;
-    } else {
-      reporter.reportError('must be of type PublishClosingLabelsParams');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is PublishClosingLabelsParams &&
-        other.runtimeType == PublishClosingLabelsParams) {
-      return uri == other.uri &&
-          listEqual(labels, other.labels,
-              (ClosingLabel a, ClosingLabel b) => a == b) &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        uri,
-        lspHashCode(labels),
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class PublishFlutterOutlineParams implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    PublishFlutterOutlineParams.canParse,
-    PublishFlutterOutlineParams.fromJson,
-  );
-
-  PublishFlutterOutlineParams({
-    required this.uri,
-    required this.outline,
-  });
-  static PublishFlutterOutlineParams fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
-    final outlineJson = json['outline'];
-    final outline =
-        FlutterOutline.fromJson(outlineJson as Map<String, Object?>);
-    return PublishFlutterOutlineParams(
-      uri: uri,
-      outline: outline,
-    );
-  }
-
-  final FlutterOutline outline;
-  final String uri;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['uri'] = uri;
-    __result['outline'] = outline.toJson();
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -1459,6 +1378,69 @@
       } finally {
         reporter.pop();
       }
+      return true;
+    } else {
+      reporter.reportError('must be of type PublishClosingLabelsParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PublishClosingLabelsParams &&
+        other.runtimeType == PublishClosingLabelsParams) {
+      return listEqual(labels, other.labels,
+              (ClosingLabel a, ClosingLabel b) => a == b) &&
+          uri == other.uri &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        lspHashCode(labels),
+        uri,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class PublishFlutterOutlineParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    PublishFlutterOutlineParams.canParse,
+    PublishFlutterOutlineParams.fromJson,
+  );
+
+  PublishFlutterOutlineParams({
+    required this.outline,
+    required this.uri,
+  });
+  static PublishFlutterOutlineParams fromJson(Map<String, Object?> json) {
+    final outlineJson = json['outline'];
+    final outline =
+        FlutterOutline.fromJson(outlineJson as Map<String, Object?>);
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    return PublishFlutterOutlineParams(
+      outline: outline,
+      uri: uri,
+    );
+  }
+
+  final FlutterOutline outline;
+  final String uri;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['outline'] = outline.toJson();
+    __result['uri'] = uri;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
       reporter.push('outline');
       try {
         if (!obj.containsKey('outline')) {
@@ -1477,65 +1459,6 @@
       } finally {
         reporter.pop();
       }
-      return true;
-    } else {
-      reporter.reportError('must be of type PublishFlutterOutlineParams');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is PublishFlutterOutlineParams &&
-        other.runtimeType == PublishFlutterOutlineParams) {
-      return uri == other.uri && outline == other.outline && true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        uri,
-        outline,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class PublishOutlineParams implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    PublishOutlineParams.canParse,
-    PublishOutlineParams.fromJson,
-  );
-
-  PublishOutlineParams({
-    required this.uri,
-    required this.outline,
-  });
-  static PublishOutlineParams fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
-    final outlineJson = json['outline'];
-    final outline = Outline.fromJson(outlineJson as Map<String, Object?>);
-    return PublishOutlineParams(
-      uri: uri,
-      outline: outline,
-    );
-  }
-
-  final Outline outline;
-  final String uri;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    __result['uri'] = uri;
-    __result['outline'] = outline.toJson();
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -1554,6 +1477,65 @@
       } finally {
         reporter.pop();
       }
+      return true;
+    } else {
+      reporter.reportError('must be of type PublishFlutterOutlineParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PublishFlutterOutlineParams &&
+        other.runtimeType == PublishFlutterOutlineParams) {
+      return outline == other.outline && uri == other.uri && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        outline,
+        uri,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class PublishOutlineParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    PublishOutlineParams.canParse,
+    PublishOutlineParams.fromJson,
+  );
+
+  PublishOutlineParams({
+    required this.outline,
+    required this.uri,
+  });
+  static PublishOutlineParams fromJson(Map<String, Object?> json) {
+    final outlineJson = json['outline'];
+    final outline = Outline.fromJson(outlineJson as Map<String, Object?>);
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    return PublishOutlineParams(
+      outline: outline,
+      uri: uri,
+    );
+  }
+
+  final Outline outline;
+  final String uri;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    __result['outline'] = outline.toJson();
+    __result['uri'] = uri;
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
       reporter.push('outline');
       try {
         if (!obj.containsKey('outline')) {
@@ -1572,6 +1554,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type PublishOutlineParams');
@@ -1583,15 +1583,15 @@
   bool operator ==(Object other) {
     if (other is PublishOutlineParams &&
         other.runtimeType == PublishOutlineParams) {
-      return uri == other.uri && outline == other.outline && true;
+      return outline == other.outline && uri == other.uri && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        uri,
         outline,
+        uri,
       );
 
   @override
@@ -1606,21 +1606,21 @@
 
   SnippetTextEdit({
     required this.insertTextFormat,
-    required this.range,
     required this.newText,
+    required this.range,
   });
   static SnippetTextEdit fromJson(Map<String, Object?> json) {
     final insertTextFormatJson = json['insertTextFormat'];
     final insertTextFormat =
         InsertTextFormat.fromJson(insertTextFormatJson as int);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final newTextJson = json['newText'];
     final newText = newTextJson as String;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return SnippetTextEdit(
       insertTextFormat: insertTextFormat,
-      range: range,
       newText: newText,
+      range: range,
     );
   }
 
@@ -1636,8 +1636,8 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['insertTextFormat'] = insertTextFormat.toJson();
-    __result['range'] = range.toJson();
     __result['newText'] = newText;
+    __result['range'] = range.toJson();
     return __result;
   }
 
@@ -1661,24 +1661,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('range');
-      try {
-        if (!obj.containsKey('range')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final range = obj['range'];
-        if (range == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('newText');
       try {
         if (!obj.containsKey('newText')) {
@@ -1697,6 +1679,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SnippetTextEdit');
@@ -1708,8 +1708,8 @@
   bool operator ==(Object other) {
     if (other is SnippetTextEdit && other.runtimeType == SnippetTextEdit) {
       return insertTextFormat == other.insertTextFormat &&
-          range == other.range &&
           newText == other.newText &&
+          range == other.range &&
           true;
     }
     return false;
@@ -1718,8 +1718,8 @@
   @override
   int get hashCode => Object.hash(
         insertTextFormat,
-        range,
         newText,
+        range,
       );
 
   @override
@@ -1733,17 +1733,17 @@
   );
 
   ValidateRefactorResult({
-    required this.valid,
     this.message,
+    required this.valid,
   });
   static ValidateRefactorResult fromJson(Map<String, Object?> json) {
-    final validJson = json['valid'];
-    final valid = validJson as bool;
     final messageJson = json['message'];
     final message = messageJson as String?;
+    final validJson = json['valid'];
+    final valid = validJson as bool;
     return ValidateRefactorResult(
-      valid: valid,
       message: message,
+      valid: valid,
     );
   }
 
@@ -1752,15 +1752,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['valid'] = valid;
     if (message != null) {
       __result['message'] = message;
     }
+    __result['valid'] = valid;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('message');
+      try {
+        final message = obj['message'];
+        if (message != null && !(message is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('valid');
       try {
         if (!obj.containsKey('valid')) {
@@ -1779,16 +1789,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('message');
-      try {
-        final message = obj['message'];
-        if (message != null && !(message is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ValidateRefactorResult');
@@ -1800,15 +1800,15 @@
   bool operator ==(Object other) {
     if (other is ValidateRefactorResult &&
         other.runtimeType == ValidateRefactorResult) {
-      return valid == other.valid && message == other.message && true;
+      return message == other.message && valid == other.valid && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        valid,
         message,
+        valid,
       );
 
   @override
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 0eb4484..699d04e 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -31,20 +31,20 @@
 
   AnnotatedTextEdit({
     required this.annotationId,
-    required this.range,
     required this.newText,
+    required this.range,
   });
   static AnnotatedTextEdit fromJson(Map<String, Object?> json) {
     final annotationIdJson = json['annotationId'];
     final annotationId = annotationIdJson as String;
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final newTextJson = json['newText'];
     final newText = newTextJson as String;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return AnnotatedTextEdit(
       annotationId: annotationId,
-      range: range,
       newText: newText,
+      range: range,
     );
   }
 
@@ -61,8 +61,8 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['annotationId'] = annotationId;
-    __result['range'] = range.toJson();
     __result['newText'] = newText;
+    __result['range'] = range.toJson();
     return __result;
   }
 
@@ -86,6 +86,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('newText');
+      try {
+        if (!obj.containsKey('newText')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final newText = obj['newText'];
+        if (newText == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(newText is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -104,24 +122,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('newText');
-      try {
-        if (!obj.containsKey('newText')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final newText = obj['newText'];
-        if (newText == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(newText is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type AnnotatedTextEdit');
@@ -133,8 +133,8 @@
   bool operator ==(Object other) {
     if (other is AnnotatedTextEdit && other.runtimeType == AnnotatedTextEdit) {
       return annotationId == other.annotationId &&
-          range == other.range &&
           newText == other.newText &&
+          range == other.range &&
           true;
     }
     return false;
@@ -143,8 +143,8 @@
   @override
   int get hashCode => Object.hash(
         annotationId,
-        range,
         newText,
+        range,
       );
 
   @override
@@ -158,17 +158,17 @@
   );
 
   ApplyWorkspaceEditParams({
-    this.label,
     required this.edit,
+    this.label,
   });
   static ApplyWorkspaceEditParams fromJson(Map<String, Object?> json) {
-    final labelJson = json['label'];
-    final label = labelJson as String?;
     final editJson = json['edit'];
     final edit = WorkspaceEdit.fromJson(editJson as Map<String, Object?>);
+    final labelJson = json['label'];
+    final label = labelJson as String?;
     return ApplyWorkspaceEditParams(
-      label: label,
       edit: edit,
+      label: label,
     );
   }
 
@@ -181,25 +181,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['edit'] = edit.toJson();
     if (label != null) {
       __result['label'] = label;
     }
-    __result['edit'] = edit.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('label');
-      try {
-        final label = obj['label'];
-        if (label != null && !(label is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('edit');
       try {
         if (!obj.containsKey('edit')) {
@@ -218,6 +208,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('label');
+      try {
+        final label = obj['label'];
+        if (label != null && !(label is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ApplyWorkspaceEditParams');
@@ -229,15 +229,15 @@
   bool operator ==(Object other) {
     if (other is ApplyWorkspaceEditParams &&
         other.runtimeType == ApplyWorkspaceEditParams) {
-      return label == other.label && edit == other.edit && true;
+      return edit == other.edit && label == other.label && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        label,
         edit,
+        label,
       );
 
   @override
@@ -252,20 +252,20 @@
 
   ApplyWorkspaceEditResult({
     required this.applied,
-    this.failureReason,
     this.failedChange,
+    this.failureReason,
   });
   static ApplyWorkspaceEditResult fromJson(Map<String, Object?> json) {
     final appliedJson = json['applied'];
     final applied = appliedJson as bool;
-    final failureReasonJson = json['failureReason'];
-    final failureReason = failureReasonJson as String?;
     final failedChangeJson = json['failedChange'];
     final failedChange = failedChangeJson as int?;
+    final failureReasonJson = json['failureReason'];
+    final failureReason = failureReasonJson as String?;
     return ApplyWorkspaceEditResult(
       applied: applied,
-      failureReason: failureReason,
       failedChange: failedChange,
+      failureReason: failureReason,
     );
   }
 
@@ -286,12 +286,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['applied'] = applied;
-    if (failureReason != null) {
-      __result['failureReason'] = failureReason;
-    }
     if (failedChange != null) {
       __result['failedChange'] = failedChange;
     }
+    if (failureReason != null) {
+      __result['failureReason'] = failureReason;
+    }
     return __result;
   }
 
@@ -315,16 +315,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('failureReason');
-      try {
-        final failureReason = obj['failureReason'];
-        if (failureReason != null && !(failureReason is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('failedChange');
       try {
         final failedChange = obj['failedChange'];
@@ -335,6 +325,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('failureReason');
+      try {
+        final failureReason = obj['failureReason'];
+        if (failureReason != null && !(failureReason is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ApplyWorkspaceEditResult');
@@ -347,8 +347,8 @@
     if (other is ApplyWorkspaceEditResult &&
         other.runtimeType == ApplyWorkspaceEditResult) {
       return applied == other.applied &&
-          failureReason == other.failureReason &&
           failedChange == other.failedChange &&
+          failureReason == other.failureReason &&
           true;
     }
     return false;
@@ -357,8 +357,8 @@
   @override
   int get hashCode => Object.hash(
         applied,
-        failureReason,
         failedChange,
+        failureReason,
       );
 
   @override
@@ -545,20 +545,12 @@
 
   CallHierarchyIncomingCallsParams({
     required this.item,
-    this.workDoneToken,
     this.partialResultToken,
+    this.workDoneToken,
   });
   static CallHierarchyIncomingCallsParams fromJson(Map<String, Object?> json) {
     final itemJson = json['item'];
     final item = CallHierarchyItem.fromJson(itemJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -567,10 +559,18 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return CallHierarchyIncomingCallsParams(
       item: item,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -586,12 +586,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['item'] = item.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -615,22 +615,22 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('partialResultToken');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -649,8 +649,8 @@
     if (other is CallHierarchyIncomingCallsParams &&
         other.runtimeType == CallHierarchyIncomingCallsParams) {
       return item == other.item &&
-          workDoneToken == other.workDoneToken &&
           partialResultToken == other.partialResultToken &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -659,8 +659,8 @@
   @override
   int get hashCode => Object.hash(
         item,
-        workDoneToken,
         partialResultToken,
+        workDoneToken,
       );
 
   @override
@@ -674,44 +674,44 @@
   );
 
   CallHierarchyItem({
-    required this.name,
-    required this.kind,
-    this.tags,
+    this.data,
     this.detail,
-    required this.uri,
+    required this.kind,
+    required this.name,
     required this.range,
     required this.selectionRange,
-    this.data,
+    this.tags,
+    required this.uri,
   });
   static CallHierarchyItem fromJson(Map<String, Object?> json) {
-    final nameJson = json['name'];
-    final name = nameJson as String;
-    final kindJson = json['kind'];
-    final kind = SymbolKind.fromJson(kindJson as int);
-    final tagsJson = json['tags'];
-    final tags = (tagsJson as List<Object?>?)
-        ?.map((item) => SymbolTag.fromJson(item as int))
-        .toList();
+    final dataJson = json['data'];
+    final data = dataJson;
     final detailJson = json['detail'];
     final detail = detailJson as String?;
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
+    final kindJson = json['kind'];
+    final kind = SymbolKind.fromJson(kindJson as int);
+    final nameJson = json['name'];
+    final name = nameJson as String;
     final rangeJson = json['range'];
     final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final selectionRangeJson = json['selectionRange'];
     final selectionRange =
         Range.fromJson(selectionRangeJson as Map<String, Object?>);
-    final dataJson = json['data'];
-    final data = dataJson;
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => SymbolTag.fromJson(item as int))
+        .toList();
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return CallHierarchyItem(
-      name: name,
-      kind: kind,
-      tags: tags,
+      data: data,
       detail: detail,
-      uri: uri,
+      kind: kind,
+      name: name,
       range: range,
       selectionRange: selectionRange,
-      data: data,
+      tags: tags,
+      uri: uri,
     );
   }
 
@@ -745,37 +745,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['name'] = name;
-    __result['kind'] = kind.toJson();
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    if (data != null) {
+      __result['data'] = data;
     }
     if (detail != null) {
       __result['detail'] = detail;
     }
-    __result['uri'] = uri;
+    __result['kind'] = kind.toJson();
+    __result['name'] = name;
     __result['range'] = range.toJson();
     __result['selectionRange'] = selectionRange.toJson();
-    if (data != null) {
-      __result['data'] = data;
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
     }
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('name');
+      reporter.push('detail');
       try {
-        if (!obj.containsKey('name')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final name = obj['name'];
-        if (name == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(name is String)) {
+        final detail = obj['detail'];
+        if (detail != null && !(detail is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -800,40 +792,18 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
+      reporter.push('name');
       try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<SymbolTag>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('detail');
-      try {
-        final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
+        if (!obj.containsKey('name')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final uri = obj['uri'];
-        if (uri == null) {
+        final name = obj['name'];
+        if (name == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (!(name is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -876,6 +846,36 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CallHierarchyItem');
@@ -886,14 +886,14 @@
   @override
   bool operator ==(Object other) {
     if (other is CallHierarchyItem && other.runtimeType == CallHierarchyItem) {
-      return name == other.name &&
-          kind == other.kind &&
-          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+      return data == other.data &&
           detail == other.detail &&
-          uri == other.uri &&
+          kind == other.kind &&
+          name == other.name &&
           range == other.range &&
           selectionRange == other.selectionRange &&
-          data == other.data &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+          uri == other.uri &&
           true;
     }
     return false;
@@ -901,14 +901,14 @@
 
   @override
   int get hashCode => Object.hash(
-        name,
-        kind,
-        lspHashCode(tags),
+        data,
         detail,
-        uri,
+        kind,
+        name,
         range,
         selectionRange,
-        data,
+        lspHashCode(tags),
+        uri,
       );
 
   @override
@@ -987,19 +987,19 @@
   );
 
   CallHierarchyOutgoingCall({
-    required this.to,
     required this.fromRanges,
+    required this.to,
   });
   static CallHierarchyOutgoingCall fromJson(Map<String, Object?> json) {
-    final toJson = json['to'];
-    final to = CallHierarchyItem.fromJson(toJson as Map<String, Object?>);
     final fromRangesJson = json['fromRanges'];
     final fromRanges = (fromRangesJson as List<Object?>)
         .map((item) => Range.fromJson(item as Map<String, Object?>))
         .toList();
+    final toJson = json['to'];
+    final to = CallHierarchyItem.fromJson(toJson as Map<String, Object?>);
     return CallHierarchyOutgoingCall(
-      to: to,
       fromRanges: fromRanges,
+      to: to,
     );
   }
 
@@ -1012,31 +1012,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['to'] = to.toJson();
     __result['fromRanges'] = fromRanges.map((item) => item.toJson()).toList();
+    __result['to'] = to.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('to');
-      try {
-        if (!obj.containsKey('to')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final to = obj['to'];
-        if (to == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(CallHierarchyItem.canParse(to, reporter))) {
-          reporter.reportError('must be of type CallHierarchyItem');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('fromRanges');
       try {
         if (!obj.containsKey('fromRanges')) {
@@ -1056,6 +1038,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('to');
+      try {
+        if (!obj.containsKey('to')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final to = obj['to'];
+        if (to == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(CallHierarchyItem.canParse(to, reporter))) {
+          reporter.reportError('must be of type CallHierarchyItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CallHierarchyOutgoingCall');
@@ -1067,9 +1067,9 @@
   bool operator ==(Object other) {
     if (other is CallHierarchyOutgoingCall &&
         other.runtimeType == CallHierarchyOutgoingCall) {
-      return to == other.to &&
-          listEqual(
+      return listEqual(
               fromRanges, other.fromRanges, (Range a, Range b) => a == b) &&
+          to == other.to &&
           true;
     }
     return false;
@@ -1077,8 +1077,8 @@
 
   @override
   int get hashCode => Object.hash(
-        to,
         lspHashCode(fromRanges),
+        to,
       );
 
   @override
@@ -1094,20 +1094,12 @@
 
   CallHierarchyOutgoingCallsParams({
     required this.item,
-    this.workDoneToken,
     this.partialResultToken,
+    this.workDoneToken,
   });
   static CallHierarchyOutgoingCallsParams fromJson(Map<String, Object?> json) {
     final itemJson = json['item'];
     final item = CallHierarchyItem.fromJson(itemJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -1116,10 +1108,18 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return CallHierarchyOutgoingCallsParams(
       item: item,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -1135,12 +1135,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['item'] = item.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -1164,22 +1164,22 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('partialResultToken');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -1198,8 +1198,8 @@
     if (other is CallHierarchyOutgoingCallsParams &&
         other.runtimeType == CallHierarchyOutgoingCallsParams) {
       return item == other.item &&
-          workDoneToken == other.workDoneToken &&
           partialResultToken == other.partialResultToken &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -1208,8 +1208,8 @@
   @override
   int get hashCode => Object.hash(
         item,
-        workDoneToken,
         partialResultToken,
+        workDoneToken,
       );
 
   @override
@@ -1224,16 +1224,16 @@
   );
 
   CallHierarchyPrepareParams({
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
     this.workDoneToken,
   });
   static CallHierarchyPrepareParams fromJson(Map<String, Object?> json) {
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -1243,8 +1243,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return CallHierarchyPrepareParams(
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -1260,8 +1260,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -1270,24 +1270,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -1306,6 +1288,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -1328,8 +1328,8 @@
   bool operator ==(Object other) {
     if (other is CallHierarchyPrepareParams &&
         other.runtimeType == CallHierarchyPrepareParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
+      return position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -1338,8 +1338,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         position,
+        textDocument,
         workDoneToken,
       );
 
@@ -1360,28 +1360,29 @@
 
   CallHierarchyRegistrationOptions({
     this.documentSelector,
-    this.workDoneProgress,
     this.id,
+    this.workDoneProgress,
   });
   static CallHierarchyRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return CallHierarchyRegistrationOptions(
       documentSelector: documentSelector,
-      workDoneProgress: workDoneProgress,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -1391,12 +1392,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -1412,18 +1413,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -1439,6 +1430,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CallHierarchyRegistrationOptions');
@@ -1451,9 +1452,9 @@
     if (other is CallHierarchyRegistrationOptions &&
         other.runtimeType == CallHierarchyRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          workDoneProgress == other.workDoneProgress &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -1462,8 +1463,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        workDoneProgress,
         id,
+        workDoneProgress,
       );
 
   @override
@@ -1551,21 +1552,21 @@
   );
 
   ChangeAnnotation({
+    this.description,
     required this.label,
     this.needsConfirmation,
-    this.description,
   });
   static ChangeAnnotation fromJson(Map<String, Object?> json) {
+    final descriptionJson = json['description'];
+    final description = descriptionJson as String?;
     final labelJson = json['label'];
     final label = labelJson as String;
     final needsConfirmationJson = json['needsConfirmation'];
     final needsConfirmation = needsConfirmationJson as bool?;
-    final descriptionJson = json['description'];
-    final description = descriptionJson as String?;
     return ChangeAnnotation(
+      description: description,
       label: label,
       needsConfirmation: needsConfirmation,
-      description: description,
     );
   }
 
@@ -1583,18 +1584,28 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (description != null) {
+      __result['description'] = description;
+    }
     __result['label'] = label;
     if (needsConfirmation != null) {
       __result['needsConfirmation'] = needsConfirmation;
     }
-    if (description != null) {
-      __result['description'] = description;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('description');
+      try {
+        final description = obj['description'];
+        if (description != null && !(description is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
@@ -1623,16 +1634,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('description');
-      try {
-        final description = obj['description'];
-        if (description != null && !(description is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ChangeAnnotation');
@@ -1643,9 +1644,9 @@
   @override
   bool operator ==(Object other) {
     if (other is ChangeAnnotation && other.runtimeType == ChangeAnnotation) {
-      return label == other.label &&
+      return description == other.description &&
+          label == other.label &&
           needsConfirmation == other.needsConfirmation &&
-          description == other.description &&
           true;
     }
     return false;
@@ -1653,9 +1654,9 @@
 
   @override
   int get hashCode => Object.hash(
+        description,
         label,
         needsConfirmation,
-        description,
       );
 
   @override
@@ -1669,47 +1670,47 @@
   );
 
   ClientCapabilities({
-    this.workspace,
-    this.textDocument,
-    this.notebookDocument,
-    this.window,
-    this.general,
     this.experimental,
+    this.general,
+    this.notebookDocument,
+    this.textDocument,
+    this.window,
+    this.workspace,
   });
   static ClientCapabilities fromJson(Map<String, Object?> json) {
-    final workspaceJson = json['workspace'];
-    final workspace = workspaceJson != null
-        ? ClientCapabilitiesWorkspace.fromJson(
-            workspaceJson as Map<String, Object?>)
-        : null;
-    final textDocumentJson = json['textDocument'];
-    final textDocument = textDocumentJson != null
-        ? TextDocumentClientCapabilities.fromJson(
-            textDocumentJson as Map<String, Object?>)
+    final experimentalJson = json['experimental'];
+    final experimental = experimentalJson;
+    final generalJson = json['general'];
+    final general = generalJson != null
+        ? ClientCapabilitiesGeneral.fromJson(
+            generalJson as Map<String, Object?>)
         : null;
     final notebookDocumentJson = json['notebookDocument'];
     final notebookDocument = notebookDocumentJson != null
         ? NotebookDocumentClientCapabilities.fromJson(
             notebookDocumentJson as Map<String, Object?>)
         : null;
+    final textDocumentJson = json['textDocument'];
+    final textDocument = textDocumentJson != null
+        ? TextDocumentClientCapabilities.fromJson(
+            textDocumentJson as Map<String, Object?>)
+        : null;
     final windowJson = json['window'];
     final window = windowJson != null
-        ? ClientCapabilitiesWindow.fromJson(windowJson as Map<String, Object?>)
+        ? WindowClientCapabilities.fromJson(windowJson as Map<String, Object?>)
         : null;
-    final generalJson = json['general'];
-    final general = generalJson != null
-        ? ClientCapabilitiesGeneral.fromJson(
-            generalJson as Map<String, Object?>)
+    final workspaceJson = json['workspace'];
+    final workspace = workspaceJson != null
+        ? WorkspaceClientCapabilities.fromJson(
+            workspaceJson as Map<String, Object?>)
         : null;
-    final experimentalJson = json['experimental'];
-    final experimental = experimentalJson;
     return ClientCapabilities(
-      workspace: workspace,
-      textDocument: textDocument,
-      notebookDocument: notebookDocument,
-      window: window,
-      general: general,
       experimental: experimental,
+      general: general,
+      notebookDocument: notebookDocument,
+      textDocument: textDocument,
+      window: window,
+      workspace: workspace,
     );
   }
 
@@ -1728,55 +1729,42 @@
   final TextDocumentClientCapabilities? textDocument;
 
   /// Window specific client capabilities.
-  final ClientCapabilitiesWindow? window;
+  final WindowClientCapabilities? window;
 
   /// Workspace specific client capabilities.
-  final ClientCapabilitiesWorkspace? workspace;
+  final WorkspaceClientCapabilities? workspace;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (workspace != null) {
-      __result['workspace'] = workspace?.toJson();
-    }
-    if (textDocument != null) {
-      __result['textDocument'] = textDocument?.toJson();
-    }
-    if (notebookDocument != null) {
-      __result['notebookDocument'] = notebookDocument?.toJson();
-    }
-    if (window != null) {
-      __result['window'] = window?.toJson();
+    if (experimental != null) {
+      __result['experimental'] = experimental;
     }
     if (general != null) {
       __result['general'] = general?.toJson();
     }
-    if (experimental != null) {
-      __result['experimental'] = experimental;
+    if (notebookDocument != null) {
+      __result['notebookDocument'] = notebookDocument?.toJson();
+    }
+    if (textDocument != null) {
+      __result['textDocument'] = textDocument?.toJson();
+    }
+    if (window != null) {
+      __result['window'] = window?.toJson();
+    }
+    if (workspace != null) {
+      __result['workspace'] = workspace?.toJson();
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('workspace');
+      reporter.push('general');
       try {
-        final workspace = obj['workspace'];
-        if (workspace != null &&
-            !(ClientCapabilitiesWorkspace.canParse(workspace, reporter))) {
-          reporter.reportError('must be of type ClientCapabilitiesWorkspace');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('textDocument');
-      try {
-        final textDocument = obj['textDocument'];
-        if (textDocument != null &&
-            !(TextDocumentClientCapabilities.canParse(
-                textDocument, reporter))) {
-          reporter
-              .reportError('must be of type TextDocumentClientCapabilities');
+        final general = obj['general'];
+        if (general != null &&
+            !(ClientCapabilitiesGeneral.canParse(general, reporter))) {
+          reporter.reportError('must be of type ClientCapabilitiesGeneral');
           return false;
         }
       } finally {
@@ -1795,23 +1783,36 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('window');
+      reporter.push('textDocument');
       try {
-        final window = obj['window'];
-        if (window != null &&
-            !(ClientCapabilitiesWindow.canParse(window, reporter))) {
-          reporter.reportError('must be of type ClientCapabilitiesWindow');
+        final textDocument = obj['textDocument'];
+        if (textDocument != null &&
+            !(TextDocumentClientCapabilities.canParse(
+                textDocument, reporter))) {
+          reporter
+              .reportError('must be of type TextDocumentClientCapabilities');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('general');
+      reporter.push('window');
       try {
-        final general = obj['general'];
-        if (general != null &&
-            !(ClientCapabilitiesGeneral.canParse(general, reporter))) {
-          reporter.reportError('must be of type ClientCapabilitiesGeneral');
+        final window = obj['window'];
+        if (window != null &&
+            !(WindowClientCapabilities.canParse(window, reporter))) {
+          reporter.reportError('must be of type WindowClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspace');
+      try {
+        final workspace = obj['workspace'];
+        if (workspace != null &&
+            !(WorkspaceClientCapabilities.canParse(workspace, reporter))) {
+          reporter.reportError('must be of type WorkspaceClientCapabilities');
           return false;
         }
       } finally {
@@ -1828,12 +1829,12 @@
   bool operator ==(Object other) {
     if (other is ClientCapabilities &&
         other.runtimeType == ClientCapabilities) {
-      return workspace == other.workspace &&
-          textDocument == other.textDocument &&
-          notebookDocument == other.notebookDocument &&
-          window == other.window &&
+      return experimental == other.experimental &&
           general == other.general &&
-          experimental == other.experimental &&
+          notebookDocument == other.notebookDocument &&
+          textDocument == other.textDocument &&
+          window == other.window &&
+          workspace == other.workspace &&
           true;
     }
     return false;
@@ -1841,12 +1842,12 @@
 
   @override
   int get hashCode => Object.hash(
-        workspace,
-        textDocument,
-        notebookDocument,
-        window,
-        general,
         experimental,
+        general,
+        notebookDocument,
+        textDocument,
+        window,
+        workspace,
       );
 
   @override
@@ -1860,37 +1861,37 @@
   );
 
   ClientCapabilitiesFileOperations({
-    this.dynamicRegistration,
     this.didCreate,
-    this.willCreate,
-    this.didRename,
-    this.willRename,
     this.didDelete,
+    this.didRename,
+    this.dynamicRegistration,
+    this.willCreate,
     this.willDelete,
+    this.willRename,
   });
   static ClientCapabilitiesFileOperations fromJson(Map<String, Object?> json) {
-    final dynamicRegistrationJson = json['dynamicRegistration'];
-    final dynamicRegistration = dynamicRegistrationJson as bool?;
     final didCreateJson = json['didCreate'];
     final didCreate = didCreateJson as bool?;
-    final willCreateJson = json['willCreate'];
-    final willCreate = willCreateJson as bool?;
-    final didRenameJson = json['didRename'];
-    final didRename = didRenameJson as bool?;
-    final willRenameJson = json['willRename'];
-    final willRename = willRenameJson as bool?;
     final didDeleteJson = json['didDelete'];
     final didDelete = didDeleteJson as bool?;
+    final didRenameJson = json['didRename'];
+    final didRename = didRenameJson as bool?;
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final willCreateJson = json['willCreate'];
+    final willCreate = willCreateJson as bool?;
     final willDeleteJson = json['willDelete'];
     final willDelete = willDeleteJson as bool?;
+    final willRenameJson = json['willRename'];
+    final willRename = willRenameJson as bool?;
     return ClientCapabilitiesFileOperations(
-      dynamicRegistration: dynamicRegistration,
       didCreate: didCreate,
-      willCreate: willCreate,
-      didRename: didRename,
-      willRename: willRename,
       didDelete: didDelete,
+      didRename: didRename,
+      dynamicRegistration: dynamicRegistration,
+      willCreate: willCreate,
       willDelete: willDelete,
+      willRename: willRename,
     );
   }
 
@@ -1918,42 +1919,32 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (dynamicRegistration != null) {
-      __result['dynamicRegistration'] = dynamicRegistration;
-    }
     if (didCreate != null) {
       __result['didCreate'] = didCreate;
     }
-    if (willCreate != null) {
-      __result['willCreate'] = willCreate;
-    }
-    if (didRename != null) {
-      __result['didRename'] = didRename;
-    }
-    if (willRename != null) {
-      __result['willRename'] = willRename;
-    }
     if (didDelete != null) {
       __result['didDelete'] = didDelete;
     }
+    if (didRename != null) {
+      __result['didRename'] = didRename;
+    }
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (willCreate != null) {
+      __result['willCreate'] = willCreate;
+    }
     if (willDelete != null) {
       __result['willDelete'] = willDelete;
     }
+    if (willRename != null) {
+      __result['willRename'] = willRename;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('dynamicRegistration');
-      try {
-        final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('didCreate');
       try {
         final didCreate = obj['didCreate'];
@@ -1964,36 +1955,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('willCreate');
-      try {
-        final willCreate = obj['willCreate'];
-        if (willCreate != null && !(willCreate is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didRename');
-      try {
-        final didRename = obj['didRename'];
-        if (didRename != null && !(didRename is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willRename');
-      try {
-        final willRename = obj['willRename'];
-        if (willRename != null && !(willRename is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('didDelete');
       try {
         final didDelete = obj['didDelete'];
@@ -2004,6 +1965,36 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('didRename');
+      try {
+        final didRename = obj['didRename'];
+        if (didRename != null && !(didRename is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('dynamicRegistration');
+      try {
+        final dynamicRegistration = obj['dynamicRegistration'];
+        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('willCreate');
+      try {
+        final willCreate = obj['willCreate'];
+        if (willCreate != null && !(willCreate is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('willDelete');
       try {
         final willDelete = obj['willDelete'];
@@ -2014,6 +2005,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('willRename');
+      try {
+        final willRename = obj['willRename'];
+        if (willRename != null && !(willRename is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ClientCapabilitiesFileOperations');
@@ -2025,13 +2026,13 @@
   bool operator ==(Object other) {
     if (other is ClientCapabilitiesFileOperations &&
         other.runtimeType == ClientCapabilitiesFileOperations) {
-      return dynamicRegistration == other.dynamicRegistration &&
-          didCreate == other.didCreate &&
-          willCreate == other.willCreate &&
-          didRename == other.didRename &&
-          willRename == other.willRename &&
+      return didCreate == other.didCreate &&
           didDelete == other.didDelete &&
+          didRename == other.didRename &&
+          dynamicRegistration == other.dynamicRegistration &&
+          willCreate == other.willCreate &&
           willDelete == other.willDelete &&
+          willRename == other.willRename &&
           true;
     }
     return false;
@@ -2039,13 +2040,13 @@
 
   @override
   int get hashCode => Object.hash(
-        dynamicRegistration,
         didCreate,
-        willCreate,
-        didRename,
-        willRename,
         didDelete,
+        didRename,
+        dynamicRegistration,
+        willCreate,
         willDelete,
+        willRename,
       );
 
   @override
@@ -2059,22 +2060,12 @@
   );
 
   ClientCapabilitiesGeneral({
-    this.staleRequestSupport,
-    this.regularExpressions,
     this.markdown,
     this.positionEncodings,
+    this.regularExpressions,
+    this.staleRequestSupport,
   });
   static ClientCapabilitiesGeneral fromJson(Map<String, Object?> json) {
-    final staleRequestSupportJson = json['staleRequestSupport'];
-    final staleRequestSupport = staleRequestSupportJson != null
-        ? ClientCapabilitiesStaleRequestSupport.fromJson(
-            staleRequestSupportJson as Map<String, Object?>)
-        : null;
-    final regularExpressionsJson = json['regularExpressions'];
-    final regularExpressions = regularExpressionsJson != null
-        ? RegularExpressionsClientCapabilities.fromJson(
-            regularExpressionsJson as Map<String, Object?>)
-        : null;
     final markdownJson = json['markdown'];
     final markdown = markdownJson != null
         ? MarkdownClientCapabilities.fromJson(
@@ -2084,11 +2075,21 @@
     final positionEncodings = (positionEncodingsJson as List<Object?>?)
         ?.map((item) => PositionEncodingKind.fromJson(item as String))
         .toList();
+    final regularExpressionsJson = json['regularExpressions'];
+    final regularExpressions = regularExpressionsJson != null
+        ? RegularExpressionsClientCapabilities.fromJson(
+            regularExpressionsJson as Map<String, Object?>)
+        : null;
+    final staleRequestSupportJson = json['staleRequestSupport'];
+    final staleRequestSupport = staleRequestSupportJson != null
+        ? ClientCapabilitiesStaleRequestSupport.fromJson(
+            staleRequestSupportJson as Map<String, Object?>)
+        : null;
     return ClientCapabilitiesGeneral(
-      staleRequestSupport: staleRequestSupport,
-      regularExpressions: regularExpressions,
       markdown: markdown,
       positionEncodings: positionEncodings,
+      regularExpressions: regularExpressions,
+      staleRequestSupport: staleRequestSupport,
     );
   }
 
@@ -2125,12 +2126,6 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (staleRequestSupport != null) {
-      __result['staleRequestSupport'] = staleRequestSupport?.toJson();
-    }
-    if (regularExpressions != null) {
-      __result['regularExpressions'] = regularExpressions?.toJson();
-    }
     if (markdown != null) {
       __result['markdown'] = markdown?.toJson();
     }
@@ -2138,37 +2133,17 @@
       __result['positionEncodings'] =
           positionEncodings?.map((item) => item.toJson()).toList();
     }
+    if (regularExpressions != null) {
+      __result['regularExpressions'] = regularExpressions?.toJson();
+    }
+    if (staleRequestSupport != null) {
+      __result['staleRequestSupport'] = staleRequestSupport?.toJson();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('staleRequestSupport');
-      try {
-        final staleRequestSupport = obj['staleRequestSupport'];
-        if (staleRequestSupport != null &&
-            !(ClientCapabilitiesStaleRequestSupport.canParse(
-                staleRequestSupport, reporter))) {
-          reporter.reportError(
-              'must be of type ClientCapabilitiesStaleRequestSupport');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('regularExpressions');
-      try {
-        final regularExpressions = obj['regularExpressions'];
-        if (regularExpressions != null &&
-            !(RegularExpressionsClientCapabilities.canParse(
-                regularExpressions, reporter))) {
-          reporter.reportError(
-              'must be of type RegularExpressionsClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('markdown');
       try {
         final markdown = obj['markdown'];
@@ -2193,6 +2168,32 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('regularExpressions');
+      try {
+        final regularExpressions = obj['regularExpressions'];
+        if (regularExpressions != null &&
+            !(RegularExpressionsClientCapabilities.canParse(
+                regularExpressions, reporter))) {
+          reporter.reportError(
+              'must be of type RegularExpressionsClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('staleRequestSupport');
+      try {
+        final staleRequestSupport = obj['staleRequestSupport'];
+        if (staleRequestSupport != null &&
+            !(ClientCapabilitiesStaleRequestSupport.canParse(
+                staleRequestSupport, reporter))) {
+          reporter.reportError(
+              'must be of type ClientCapabilitiesStaleRequestSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ClientCapabilitiesGeneral');
@@ -2204,11 +2205,11 @@
   bool operator ==(Object other) {
     if (other is ClientCapabilitiesGeneral &&
         other.runtimeType == ClientCapabilitiesGeneral) {
-      return staleRequestSupport == other.staleRequestSupport &&
-          regularExpressions == other.regularExpressions &&
-          markdown == other.markdown &&
+      return markdown == other.markdown &&
           listEqual(positionEncodings, other.positionEncodings,
               (PositionEncodingKind a, PositionEncodingKind b) => a == b) &&
+          regularExpressions == other.regularExpressions &&
+          staleRequestSupport == other.staleRequestSupport &&
           true;
     }
     return false;
@@ -2216,10 +2217,10 @@
 
   @override
   int get hashCode => Object.hash(
-        staleRequestSupport,
-        regularExpressions,
         markdown,
         lspHashCode(positionEncodings),
+        regularExpressions,
+        staleRequestSupport,
       );
 
   @override
@@ -2333,565 +2334,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ClientCapabilitiesWindow implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    ClientCapabilitiesWindow.canParse,
-    ClientCapabilitiesWindow.fromJson,
-  );
-
-  ClientCapabilitiesWindow({
-    this.workDoneProgress,
-    this.showMessage,
-    this.showDocument,
-  });
-  static ClientCapabilitiesWindow fromJson(Map<String, Object?> json) {
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
-    final showMessageJson = json['showMessage'];
-    final showMessage = showMessageJson != null
-        ? ShowMessageRequestClientCapabilities.fromJson(
-            showMessageJson as Map<String, Object?>)
-        : null;
-    final showDocumentJson = json['showDocument'];
-    final showDocument = showDocumentJson != null
-        ? ShowDocumentClientCapabilities.fromJson(
-            showDocumentJson as Map<String, Object?>)
-        : null;
-    return ClientCapabilitiesWindow(
-      workDoneProgress: workDoneProgress,
-      showMessage: showMessage,
-      showDocument: showDocument,
-    );
-  }
-
-  /// Client capabilities for the show document request.
-  ///  @since 3.16.0
-  final ShowDocumentClientCapabilities? showDocument;
-
-  /// Capabilities specific to the showMessage request
-  ///  @since 3.16.0
-  final ShowMessageRequestClientCapabilities? showMessage;
-
-  /// It indicates whether the client supports server initiated progress using
-  /// the `window/workDoneProgress/create` request.
-  ///
-  /// The capability also controls Whether client supports handling of progress
-  /// notifications. If set servers are allowed to report a `workDoneProgress`
-  /// property in the request specific server capabilities.
-  ///  @since 3.15.0
-  final bool? workDoneProgress;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
-    if (showMessage != null) {
-      __result['showMessage'] = showMessage?.toJson();
-    }
-    if (showDocument != null) {
-      __result['showDocument'] = showDocument?.toJson();
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('showMessage');
-      try {
-        final showMessage = obj['showMessage'];
-        if (showMessage != null &&
-            !(ShowMessageRequestClientCapabilities.canParse(
-                showMessage, reporter))) {
-          reporter.reportError(
-              'must be of type ShowMessageRequestClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('showDocument');
-      try {
-        final showDocument = obj['showDocument'];
-        if (showDocument != null &&
-            !(ShowDocumentClientCapabilities.canParse(
-                showDocument, reporter))) {
-          reporter
-              .reportError('must be of type ShowDocumentClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type ClientCapabilitiesWindow');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ClientCapabilitiesWindow &&
-        other.runtimeType == ClientCapabilitiesWindow) {
-      return workDoneProgress == other.workDoneProgress &&
-          showMessage == other.showMessage &&
-          showDocument == other.showDocument &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        workDoneProgress,
-        showMessage,
-        showDocument,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-class ClientCapabilitiesWorkspace implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    ClientCapabilitiesWorkspace.canParse,
-    ClientCapabilitiesWorkspace.fromJson,
-  );
-
-  ClientCapabilitiesWorkspace({
-    this.applyEdit,
-    this.workspaceEdit,
-    this.didChangeConfiguration,
-    this.didChangeWatchedFiles,
-    this.symbol,
-    this.executeCommand,
-    this.workspaceFolders,
-    this.configuration,
-    this.semanticTokens,
-    this.codeLens,
-    this.fileOperations,
-    this.inlineValue,
-    this.inlayHint,
-    this.diagnostics,
-  });
-  static ClientCapabilitiesWorkspace fromJson(Map<String, Object?> json) {
-    final applyEditJson = json['applyEdit'];
-    final applyEdit = applyEditJson as bool?;
-    final workspaceEditJson = json['workspaceEdit'];
-    final workspaceEdit = workspaceEditJson != null
-        ? WorkspaceEditClientCapabilities.fromJson(
-            workspaceEditJson as Map<String, Object?>)
-        : null;
-    final didChangeConfigurationJson = json['didChangeConfiguration'];
-    final didChangeConfiguration = didChangeConfigurationJson != null
-        ? DidChangeConfigurationClientCapabilities.fromJson(
-            didChangeConfigurationJson as Map<String, Object?>)
-        : null;
-    final didChangeWatchedFilesJson = json['didChangeWatchedFiles'];
-    final didChangeWatchedFiles = didChangeWatchedFilesJson != null
-        ? DidChangeWatchedFilesClientCapabilities.fromJson(
-            didChangeWatchedFilesJson as Map<String, Object?>)
-        : null;
-    final symbolJson = json['symbol'];
-    final symbol = symbolJson != null
-        ? WorkspaceSymbolClientCapabilities.fromJson(
-            symbolJson as Map<String, Object?>)
-        : null;
-    final executeCommandJson = json['executeCommand'];
-    final executeCommand = executeCommandJson != null
-        ? ExecuteCommandClientCapabilities.fromJson(
-            executeCommandJson as Map<String, Object?>)
-        : null;
-    final workspaceFoldersJson = json['workspaceFolders'];
-    final workspaceFolders = workspaceFoldersJson as bool?;
-    final configurationJson = json['configuration'];
-    final configuration = configurationJson as bool?;
-    final semanticTokensJson = json['semanticTokens'];
-    final semanticTokens = semanticTokensJson != null
-        ? SemanticTokensWorkspaceClientCapabilities.fromJson(
-            semanticTokensJson as Map<String, Object?>)
-        : null;
-    final codeLensJson = json['codeLens'];
-    final codeLens = codeLensJson != null
-        ? CodeLensWorkspaceClientCapabilities.fromJson(
-            codeLensJson as Map<String, Object?>)
-        : null;
-    final fileOperationsJson = json['fileOperations'];
-    final fileOperations = fileOperationsJson != null
-        ? ClientCapabilitiesFileOperations.fromJson(
-            fileOperationsJson as Map<String, Object?>)
-        : null;
-    final inlineValueJson = json['inlineValue'];
-    final inlineValue = inlineValueJson != null
-        ? InlineValueWorkspaceClientCapabilities.fromJson(
-            inlineValueJson as Map<String, Object?>)
-        : null;
-    final inlayHintJson = json['inlayHint'];
-    final inlayHint = inlayHintJson != null
-        ? InlayHintWorkspaceClientCapabilities.fromJson(
-            inlayHintJson as Map<String, Object?>)
-        : null;
-    final diagnosticsJson = json['diagnostics'];
-    final diagnostics = diagnosticsJson != null
-        ? DiagnosticWorkspaceClientCapabilities.fromJson(
-            diagnosticsJson as Map<String, Object?>)
-        : null;
-    return ClientCapabilitiesWorkspace(
-      applyEdit: applyEdit,
-      workspaceEdit: workspaceEdit,
-      didChangeConfiguration: didChangeConfiguration,
-      didChangeWatchedFiles: didChangeWatchedFiles,
-      symbol: symbol,
-      executeCommand: executeCommand,
-      workspaceFolders: workspaceFolders,
-      configuration: configuration,
-      semanticTokens: semanticTokens,
-      codeLens: codeLens,
-      fileOperations: fileOperations,
-      inlineValue: inlineValue,
-      inlayHint: inlayHint,
-      diagnostics: diagnostics,
-    );
-  }
-
-  /// The client supports applying batch edits to the workspace by supporting
-  /// the request 'workspace/applyEdit'
-  final bool? applyEdit;
-
-  /// Capabilities specific to the code lens requests scoped to the workspace.
-  ///  @since 3.16.0
-  final CodeLensWorkspaceClientCapabilities? codeLens;
-
-  /// The client supports `workspace/configuration` requests.
-  ///  @since 3.6.0
-  final bool? configuration;
-
-  /// Client workspace capabilities specific to diagnostics.
-  ///  @since 3.17.0.
-  final DiagnosticWorkspaceClientCapabilities? diagnostics;
-
-  /// Capabilities specific to the `workspace/didChangeConfiguration`
-  /// notification.
-  final DidChangeConfigurationClientCapabilities? didChangeConfiguration;
-
-  /// Capabilities specific to the `workspace/didChangeWatchedFiles`
-  /// notification.
-  final DidChangeWatchedFilesClientCapabilities? didChangeWatchedFiles;
-
-  /// Capabilities specific to the `workspace/executeCommand` request.
-  final ExecuteCommandClientCapabilities? executeCommand;
-
-  /// The client has support for file requests/notifications.
-  ///  @since 3.16.0
-  final ClientCapabilitiesFileOperations? fileOperations;
-
-  /// Client workspace capabilities specific to inlay hints.
-  ///  @since 3.17.0
-  final InlayHintWorkspaceClientCapabilities? inlayHint;
-
-  /// Client workspace capabilities specific to inline values.
-  ///  @since 3.17.0
-  final InlineValueWorkspaceClientCapabilities? inlineValue;
-
-  /// Capabilities specific to the semantic token requests scoped to the
-  /// workspace.
-  ///  @since 3.16.0
-  final SemanticTokensWorkspaceClientCapabilities? semanticTokens;
-
-  /// Capabilities specific to the `workspace/symbol` request.
-  final WorkspaceSymbolClientCapabilities? symbol;
-
-  /// Capabilities specific to `WorkspaceEdit`s
-  final WorkspaceEditClientCapabilities? workspaceEdit;
-
-  /// The client has support for workspace folders.
-  ///  @since 3.6.0
-  final bool? workspaceFolders;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (applyEdit != null) {
-      __result['applyEdit'] = applyEdit;
-    }
-    if (workspaceEdit != null) {
-      __result['workspaceEdit'] = workspaceEdit?.toJson();
-    }
-    if (didChangeConfiguration != null) {
-      __result['didChangeConfiguration'] = didChangeConfiguration?.toJson();
-    }
-    if (didChangeWatchedFiles != null) {
-      __result['didChangeWatchedFiles'] = didChangeWatchedFiles?.toJson();
-    }
-    if (symbol != null) {
-      __result['symbol'] = symbol?.toJson();
-    }
-    if (executeCommand != null) {
-      __result['executeCommand'] = executeCommand?.toJson();
-    }
-    if (workspaceFolders != null) {
-      __result['workspaceFolders'] = workspaceFolders;
-    }
-    if (configuration != null) {
-      __result['configuration'] = configuration;
-    }
-    if (semanticTokens != null) {
-      __result['semanticTokens'] = semanticTokens?.toJson();
-    }
-    if (codeLens != null) {
-      __result['codeLens'] = codeLens?.toJson();
-    }
-    if (fileOperations != null) {
-      __result['fileOperations'] = fileOperations?.toJson();
-    }
-    if (inlineValue != null) {
-      __result['inlineValue'] = inlineValue?.toJson();
-    }
-    if (inlayHint != null) {
-      __result['inlayHint'] = inlayHint?.toJson();
-    }
-    if (diagnostics != null) {
-      __result['diagnostics'] = diagnostics?.toJson();
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('applyEdit');
-      try {
-        final applyEdit = obj['applyEdit'];
-        if (applyEdit != null && !(applyEdit is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workspaceEdit');
-      try {
-        final workspaceEdit = obj['workspaceEdit'];
-        if (workspaceEdit != null &&
-            !(WorkspaceEditClientCapabilities.canParse(
-                workspaceEdit, reporter))) {
-          reporter
-              .reportError('must be of type WorkspaceEditClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didChangeConfiguration');
-      try {
-        final didChangeConfiguration = obj['didChangeConfiguration'];
-        if (didChangeConfiguration != null &&
-            !(DidChangeConfigurationClientCapabilities.canParse(
-                didChangeConfiguration, reporter))) {
-          reporter.reportError(
-              'must be of type DidChangeConfigurationClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('didChangeWatchedFiles');
-      try {
-        final didChangeWatchedFiles = obj['didChangeWatchedFiles'];
-        if (didChangeWatchedFiles != null &&
-            !(DidChangeWatchedFilesClientCapabilities.canParse(
-                didChangeWatchedFiles, reporter))) {
-          reporter.reportError(
-              'must be of type DidChangeWatchedFilesClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('symbol');
-      try {
-        final symbol = obj['symbol'];
-        if (symbol != null &&
-            !(WorkspaceSymbolClientCapabilities.canParse(symbol, reporter))) {
-          reporter
-              .reportError('must be of type WorkspaceSymbolClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('executeCommand');
-      try {
-        final executeCommand = obj['executeCommand'];
-        if (executeCommand != null &&
-            !(ExecuteCommandClientCapabilities.canParse(
-                executeCommand, reporter))) {
-          reporter
-              .reportError('must be of type ExecuteCommandClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workspaceFolders');
-      try {
-        final workspaceFolders = obj['workspaceFolders'];
-        if (workspaceFolders != null && !(workspaceFolders is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('configuration');
-      try {
-        final configuration = obj['configuration'];
-        if (configuration != null && !(configuration is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('semanticTokens');
-      try {
-        final semanticTokens = obj['semanticTokens'];
-        if (semanticTokens != null &&
-            !(SemanticTokensWorkspaceClientCapabilities.canParse(
-                semanticTokens, reporter))) {
-          reporter.reportError(
-              'must be of type SemanticTokensWorkspaceClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('codeLens');
-      try {
-        final codeLens = obj['codeLens'];
-        if (codeLens != null &&
-            !(CodeLensWorkspaceClientCapabilities.canParse(
-                codeLens, reporter))) {
-          reporter.reportError(
-              'must be of type CodeLensWorkspaceClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('fileOperations');
-      try {
-        final fileOperations = obj['fileOperations'];
-        if (fileOperations != null &&
-            !(ClientCapabilitiesFileOperations.canParse(
-                fileOperations, reporter))) {
-          reporter
-              .reportError('must be of type ClientCapabilitiesFileOperations');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('inlineValue');
-      try {
-        final inlineValue = obj['inlineValue'];
-        if (inlineValue != null &&
-            !(InlineValueWorkspaceClientCapabilities.canParse(
-                inlineValue, reporter))) {
-          reporter.reportError(
-              'must be of type InlineValueWorkspaceClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('inlayHint');
-      try {
-        final inlayHint = obj['inlayHint'];
-        if (inlayHint != null &&
-            !(InlayHintWorkspaceClientCapabilities.canParse(
-                inlayHint, reporter))) {
-          reporter.reportError(
-              'must be of type InlayHintWorkspaceClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('diagnostics');
-      try {
-        final diagnostics = obj['diagnostics'];
-        if (diagnostics != null &&
-            !(DiagnosticWorkspaceClientCapabilities.canParse(
-                diagnostics, reporter))) {
-          reporter.reportError(
-              'must be of type DiagnosticWorkspaceClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type ClientCapabilitiesWorkspace');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ClientCapabilitiesWorkspace &&
-        other.runtimeType == ClientCapabilitiesWorkspace) {
-      return applyEdit == other.applyEdit &&
-          workspaceEdit == other.workspaceEdit &&
-          didChangeConfiguration == other.didChangeConfiguration &&
-          didChangeWatchedFiles == other.didChangeWatchedFiles &&
-          symbol == other.symbol &&
-          executeCommand == other.executeCommand &&
-          workspaceFolders == other.workspaceFolders &&
-          configuration == other.configuration &&
-          semanticTokens == other.semanticTokens &&
-          codeLens == other.codeLens &&
-          fileOperations == other.fileOperations &&
-          inlineValue == other.inlineValue &&
-          inlayHint == other.inlayHint &&
-          diagnostics == other.diagnostics &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        applyEdit,
-        workspaceEdit,
-        didChangeConfiguration,
-        didChangeWatchedFiles,
-        symbol,
-        executeCommand,
-        workspaceFolders,
-        configuration,
-        semanticTokens,
-        codeLens,
-        fileOperations,
-        inlineValue,
-        inlayHint,
-        diagnostics,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 /// A code action represents a change that can be performed in code, e.g. to fix
 /// a problem or to refactor code.
 ///
@@ -2904,27 +2346,26 @@
   );
 
   CodeAction({
-    required this.title,
-    this.kind,
-    this.diagnostics,
-    this.isPreferred,
-    this.disabled,
-    this.edit,
     this.command,
     this.data,
+    this.diagnostics,
+    this.disabled,
+    this.edit,
+    this.isPreferred,
+    this.kind,
+    required this.title,
   });
   static CodeAction fromJson(Map<String, Object?> json) {
-    final titleJson = json['title'];
-    final title = titleJson as String;
-    final kindJson = json['kind'];
-    final kind =
-        kindJson != null ? CodeActionKind.fromJson(kindJson as String) : null;
+    final commandJson = json['command'];
+    final command = commandJson != null
+        ? Command.fromJson(commandJson as Map<String, Object?>)
+        : null;
+    final dataJson = json['data'];
+    final data = dataJson;
     final diagnosticsJson = json['diagnostics'];
     final diagnostics = (diagnosticsJson as List<Object?>?)
         ?.map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
         .toList();
-    final isPreferredJson = json['isPreferred'];
-    final isPreferred = isPreferredJson as bool?;
     final disabledJson = json['disabled'];
     final disabled = disabledJson != null
         ? CodeActionDisabled.fromJson(disabledJson as Map<String, Object?>)
@@ -2933,21 +2374,22 @@
     final edit = editJson != null
         ? WorkspaceEdit.fromJson(editJson as Map<String, Object?>)
         : null;
-    final commandJson = json['command'];
-    final command = commandJson != null
-        ? Command.fromJson(commandJson as Map<String, Object?>)
-        : null;
-    final dataJson = json['data'];
-    final data = dataJson;
+    final isPreferredJson = json['isPreferred'];
+    final isPreferred = isPreferredJson as bool?;
+    final kindJson = json['kind'];
+    final kind =
+        kindJson != null ? CodeActionKind.fromJson(kindJson as String) : null;
+    final titleJson = json['title'];
+    final title = titleJson as String;
     return CodeAction(
-      title: title,
-      kind: kind,
-      diagnostics: diagnostics,
-      isPreferred: isPreferred,
-      disabled: disabled,
-      edit: edit,
       command: command,
       data: data,
+      diagnostics: diagnostics,
+      disabled: disabled,
+      edit: edit,
+      isPreferred: isPreferred,
+      kind: kind,
+      title: title,
     );
   }
 
@@ -3003,57 +2445,39 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['title'] = title;
-    if (kind != null) {
-      __result['kind'] = kind?.toJson();
+    if (command != null) {
+      __result['command'] = command?.toJson();
+    }
+    if (data != null) {
+      __result['data'] = data;
     }
     if (diagnostics != null) {
       __result['diagnostics'] =
           diagnostics?.map((item) => item.toJson()).toList();
     }
-    if (isPreferred != null) {
-      __result['isPreferred'] = isPreferred;
-    }
     if (disabled != null) {
       __result['disabled'] = disabled?.toJson();
     }
     if (edit != null) {
       __result['edit'] = edit?.toJson();
     }
-    if (command != null) {
-      __result['command'] = command?.toJson();
+    if (isPreferred != null) {
+      __result['isPreferred'] = isPreferred;
     }
-    if (data != null) {
-      __result['data'] = data;
+    if (kind != null) {
+      __result['kind'] = kind?.toJson();
     }
+    __result['title'] = title;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('title');
+      reporter.push('command');
       try {
-        if (!obj.containsKey('title')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final title = obj['title'];
-        if (title == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(title is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('kind');
-      try {
-        final kind = obj['kind'];
-        if (kind != null && !(CodeActionKind.canParse(kind, reporter))) {
-          reporter.reportError('must be of type CodeActionKind');
+        final command = obj['command'];
+        if (command != null && !(Command.canParse(command, reporter))) {
+          reporter.reportError('must be of type Command');
           return false;
         }
       } finally {
@@ -3072,16 +2496,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('isPreferred');
-      try {
-        final isPreferred = obj['isPreferred'];
-        if (isPreferred != null && !(isPreferred is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('disabled');
       try {
         final disabled = obj['disabled'];
@@ -3103,11 +2517,39 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('command');
+      reporter.push('isPreferred');
       try {
-        final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
-          reporter.reportError('must be of type Command');
+        final isPreferred = obj['isPreferred'];
+        if (isPreferred != null && !(isPreferred is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('kind');
+      try {
+        final kind = obj['kind'];
+        if (kind != null && !(CodeActionKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type CodeActionKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('title');
+      try {
+        if (!obj.containsKey('title')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final title = obj['title'];
+        if (title == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(title is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -3123,15 +2565,15 @@
   @override
   bool operator ==(Object other) {
     if (other is CodeAction && other.runtimeType == CodeAction) {
-      return title == other.title &&
-          kind == other.kind &&
+      return command == other.command &&
+          data == other.data &&
           listEqual(diagnostics, other.diagnostics,
               (Diagnostic a, Diagnostic b) => a == b) &&
-          isPreferred == other.isPreferred &&
           disabled == other.disabled &&
           edit == other.edit &&
-          command == other.command &&
-          data == other.data &&
+          isPreferred == other.isPreferred &&
+          kind == other.kind &&
+          title == other.title &&
           true;
     }
     return false;
@@ -3139,14 +2581,14 @@
 
   @override
   int get hashCode => Object.hash(
-        title,
-        kind,
-        lspHashCode(diagnostics),
-        isPreferred,
-        disabled,
-        edit,
         command,
         data,
+        lspHashCode(diagnostics),
+        disabled,
+        edit,
+        isPreferred,
+        kind,
+        title,
       );
 
   @override
@@ -3160,43 +2602,43 @@
   );
 
   CodeActionClientCapabilities({
-    this.dynamicRegistration,
     this.codeActionLiteralSupport,
-    this.isPreferredSupport,
-    this.disabledSupport,
     this.dataSupport,
-    this.resolveSupport,
+    this.disabledSupport,
+    this.dynamicRegistration,
     this.honorsChangeAnnotations,
+    this.isPreferredSupport,
+    this.resolveSupport,
   });
   static CodeActionClientCapabilities fromJson(Map<String, Object?> json) {
-    final dynamicRegistrationJson = json['dynamicRegistration'];
-    final dynamicRegistration = dynamicRegistrationJson as bool?;
     final codeActionLiteralSupportJson = json['codeActionLiteralSupport'];
     final codeActionLiteralSupport = codeActionLiteralSupportJson != null
         ? CodeActionClientCapabilitiesCodeActionLiteralSupport.fromJson(
             codeActionLiteralSupportJson as Map<String, Object?>)
         : null;
-    final isPreferredSupportJson = json['isPreferredSupport'];
-    final isPreferredSupport = isPreferredSupportJson as bool?;
-    final disabledSupportJson = json['disabledSupport'];
-    final disabledSupport = disabledSupportJson as bool?;
     final dataSupportJson = json['dataSupport'];
     final dataSupport = dataSupportJson as bool?;
+    final disabledSupportJson = json['disabledSupport'];
+    final disabledSupport = disabledSupportJson as bool?;
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final honorsChangeAnnotationsJson = json['honorsChangeAnnotations'];
+    final honorsChangeAnnotations = honorsChangeAnnotationsJson as bool?;
+    final isPreferredSupportJson = json['isPreferredSupport'];
+    final isPreferredSupport = isPreferredSupportJson as bool?;
     final resolveSupportJson = json['resolveSupport'];
     final resolveSupport = resolveSupportJson != null
         ? CodeActionClientCapabilitiesResolveSupport.fromJson(
             resolveSupportJson as Map<String, Object?>)
         : null;
-    final honorsChangeAnnotationsJson = json['honorsChangeAnnotations'];
-    final honorsChangeAnnotations = honorsChangeAnnotationsJson as bool?;
     return CodeActionClientCapabilities(
-      dynamicRegistration: dynamicRegistration,
       codeActionLiteralSupport: codeActionLiteralSupport,
-      isPreferredSupport: isPreferredSupport,
-      disabledSupport: disabledSupport,
       dataSupport: dataSupport,
-      resolveSupport: resolveSupport,
+      disabledSupport: disabledSupport,
+      dynamicRegistration: dynamicRegistration,
       honorsChangeAnnotations: honorsChangeAnnotations,
+      isPreferredSupport: isPreferredSupport,
+      resolveSupport: resolveSupport,
     );
   }
 
@@ -3236,42 +2678,32 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (dynamicRegistration != null) {
-      __result['dynamicRegistration'] = dynamicRegistration;
-    }
     if (codeActionLiteralSupport != null) {
       __result['codeActionLiteralSupport'] = codeActionLiteralSupport?.toJson();
     }
-    if (isPreferredSupport != null) {
-      __result['isPreferredSupport'] = isPreferredSupport;
-    }
-    if (disabledSupport != null) {
-      __result['disabledSupport'] = disabledSupport;
-    }
     if (dataSupport != null) {
       __result['dataSupport'] = dataSupport;
     }
-    if (resolveSupport != null) {
-      __result['resolveSupport'] = resolveSupport?.toJson();
+    if (disabledSupport != null) {
+      __result['disabledSupport'] = disabledSupport;
+    }
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
     }
     if (honorsChangeAnnotations != null) {
       __result['honorsChangeAnnotations'] = honorsChangeAnnotations;
     }
+    if (isPreferredSupport != null) {
+      __result['isPreferredSupport'] = isPreferredSupport;
+    }
+    if (resolveSupport != null) {
+      __result['resolveSupport'] = resolveSupport?.toJson();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('dynamicRegistration');
-      try {
-        final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('codeActionLiteralSupport');
       try {
         final codeActionLiteralSupport = obj['codeActionLiteralSupport'];
@@ -3285,10 +2717,10 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('isPreferredSupport');
+      reporter.push('dataSupport');
       try {
-        final isPreferredSupport = obj['isPreferredSupport'];
-        if (isPreferredSupport != null && !(isPreferredSupport is bool)) {
+        final dataSupport = obj['dataSupport'];
+        if (dataSupport != null && !(dataSupport is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3305,10 +2737,31 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('dataSupport');
+      reporter.push('dynamicRegistration');
       try {
-        final dataSupport = obj['dataSupport'];
-        if (dataSupport != null && !(dataSupport is bool)) {
+        final dynamicRegistration = obj['dynamicRegistration'];
+        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('honorsChangeAnnotations');
+      try {
+        final honorsChangeAnnotations = obj['honorsChangeAnnotations'];
+        if (honorsChangeAnnotations != null &&
+            !(honorsChangeAnnotations is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('isPreferredSupport');
+      try {
+        final isPreferredSupport = obj['isPreferredSupport'];
+        if (isPreferredSupport != null && !(isPreferredSupport is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -3328,17 +2781,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('honorsChangeAnnotations');
-      try {
-        final honorsChangeAnnotations = obj['honorsChangeAnnotations'];
-        if (honorsChangeAnnotations != null &&
-            !(honorsChangeAnnotations is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CodeActionClientCapabilities');
@@ -3350,13 +2792,13 @@
   bool operator ==(Object other) {
     if (other is CodeActionClientCapabilities &&
         other.runtimeType == CodeActionClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration &&
-          codeActionLiteralSupport == other.codeActionLiteralSupport &&
-          isPreferredSupport == other.isPreferredSupport &&
-          disabledSupport == other.disabledSupport &&
+      return codeActionLiteralSupport == other.codeActionLiteralSupport &&
           dataSupport == other.dataSupport &&
-          resolveSupport == other.resolveSupport &&
+          disabledSupport == other.disabledSupport &&
+          dynamicRegistration == other.dynamicRegistration &&
           honorsChangeAnnotations == other.honorsChangeAnnotations &&
+          isPreferredSupport == other.isPreferredSupport &&
+          resolveSupport == other.resolveSupport &&
           true;
     }
     return false;
@@ -3364,13 +2806,13 @@
 
   @override
   int get hashCode => Object.hash(
-        dynamicRegistration,
         codeActionLiteralSupport,
-        isPreferredSupport,
-        disabledSupport,
         dataSupport,
-        resolveSupport,
+        disabledSupport,
+        dynamicRegistration,
         honorsChangeAnnotations,
+        isPreferredSupport,
+        resolveSupport,
       );
 
   @override
@@ -4029,29 +3471,16 @@
   );
 
   CodeActionParams({
-    required this.textDocument,
-    required this.range,
     required this.context,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.range,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static CodeActionParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final contextJson = json['context'];
     final context =
         CodeActionContext.fromJson(contextJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -4060,12 +3489,25 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return CodeActionParams(
-      textDocument: textDocument,
-      range: range,
       context: context,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      range: range,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -4087,33 +3529,44 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['range'] = range.toJson();
     __result['context'] = context.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['range'] = range.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('context');
       try {
-        if (!obj.containsKey('textDocument')) {
+        if (!obj.containsKey('context')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
+        final context = obj['context'];
+        if (context == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        if (!(CodeActionContext.canParse(context, reporter))) {
+          reporter.reportError('must be of type CodeActionContext');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -4137,19 +3590,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('context');
+      reporter.push('textDocument');
       try {
-        if (!obj.containsKey('context')) {
+        if (!obj.containsKey('textDocument')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final context = obj['context'];
-        if (context == null) {
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(CodeActionContext.canParse(context, reporter))) {
-          reporter.reportError('must be of type CodeActionContext');
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -4166,17 +3619,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CodeActionParams');
@@ -4187,11 +3629,11 @@
   @override
   bool operator ==(Object other) {
     if (other is CodeActionParams && other.runtimeType == CodeActionParams) {
-      return textDocument == other.textDocument &&
-          range == other.range &&
-          context == other.context &&
-          workDoneToken == other.workDoneToken &&
+      return context == other.context &&
           partialResultToken == other.partialResultToken &&
+          range == other.range &&
+          textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -4199,11 +3641,11 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        range,
         context,
-        workDoneToken,
         partialResultToken,
+        range,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -4218,27 +3660,28 @@
   );
 
   CodeActionRegistrationOptions({
-    this.documentSelector,
     this.codeActionKinds,
+    this.documentSelector,
     this.resolveProvider,
     this.workDoneProgress,
   });
   static CodeActionRegistrationOptions fromJson(Map<String, Object?> json) {
-    final documentSelectorJson = json['documentSelector'];
-    final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
-        .toList();
     final codeActionKindsJson = json['codeActionKinds'];
     final codeActionKinds = (codeActionKindsJson as List<Object?>?)
         ?.map((item) => CodeActionKind.fromJson(item as String))
         .toList();
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return CodeActionRegistrationOptions(
-      documentSelector: documentSelector,
       codeActionKinds: codeActionKinds,
+      documentSelector: documentSelector,
       resolveProvider: resolveProvider,
       workDoneProgress: workDoneProgress,
     );
@@ -4252,7 +3695,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The server provides support to resolve additional information for a code
   /// action.
@@ -4262,11 +3705,11 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['documentSelector'] = documentSelector;
     if (codeActionKinds != null) {
       __result['codeActionKinds'] =
           codeActionKinds?.map((item) => item.toJson()).toList();
     }
+    __result['documentSelector'] = documentSelector;
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
@@ -4278,6 +3721,19 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('codeActionKinds');
+      try {
+        final codeActionKinds = obj['codeActionKinds'];
+        if (codeActionKinds != null &&
+            !((codeActionKinds is List<Object?> &&
+                (codeActionKinds.every(
+                    (item) => CodeActionKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CodeActionKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -4288,21 +3744,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('codeActionKinds');
-      try {
-        final codeActionKinds = obj['codeActionKinds'];
-        if (codeActionKinds != null &&
-            !((codeActionKinds is List<Object?> &&
-                (codeActionKinds.every(
-                    (item) => CodeActionKind.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<CodeActionKind>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -4339,10 +3782,10 @@
   bool operator ==(Object other) {
     if (other is CodeActionRegistrationOptions &&
         other.runtimeType == CodeActionRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          listEqual(codeActionKinds, other.codeActionKinds,
+      return listEqual(codeActionKinds, other.codeActionKinds,
               (CodeActionKind a, CodeActionKind b) => a == b) &&
+          listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -4352,8 +3795,8 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(documentSelector),
         lspHashCode(codeActionKinds),
+        lspHashCode(documentSelector),
         resolveProvider,
         workDoneProgress,
       );
@@ -4478,23 +3921,23 @@
   );
 
   CodeLens({
-    required this.range,
     this.command,
     this.data,
+    required this.range,
   });
   static CodeLens fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final commandJson = json['command'];
     final command = commandJson != null
         ? Command.fromJson(commandJson as Map<String, Object?>)
         : null;
     final dataJson = json['data'];
     final data = dataJson;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return CodeLens(
-      range: range,
       command: command,
       data: data,
+      range: range,
     );
   }
 
@@ -4511,18 +3954,28 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     if (command != null) {
       __result['command'] = command?.toJson();
     }
     if (data != null) {
       __result['data'] = data;
     }
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('command');
+      try {
+        final command = obj['command'];
+        if (command != null && !(Command.canParse(command, reporter))) {
+          reporter.reportError('must be of type Command');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -4541,16 +3994,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('command');
-      try {
-        final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
-          reporter.reportError('must be of type Command');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CodeLens');
@@ -4561,9 +4004,9 @@
   @override
   bool operator ==(Object other) {
     if (other is CodeLens && other.runtimeType == CodeLens) {
-      return range == other.range &&
-          command == other.command &&
+      return command == other.command &&
           data == other.data &&
+          range == other.range &&
           true;
     }
     return false;
@@ -4571,9 +4014,9 @@
 
   @override
   int get hashCode => Object.hash(
-        range,
         command,
         data,
+        range,
       );
 
   @override
@@ -4739,11 +4182,19 @@
   );
 
   CodeLensParams({
+    this.partialResultToken,
     required this.textDocument,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static CodeLensParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -4755,18 +4206,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return CodeLensParams(
+      partialResultToken: partialResultToken,
       textDocument: textDocument,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -4782,18 +4225,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -4823,17 +4277,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CodeLensParams');
@@ -4844,9 +4287,9 @@
   @override
   bool operator ==(Object other) {
     if (other is CodeLensParams && other.runtimeType == CodeLensParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -4854,9 +4297,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         textDocument,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -4878,7 +4321,8 @@
   static CodeLensRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
@@ -4893,7 +4337,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// Code lens has a resolve provider as well.
   final bool? resolveProvider;
@@ -4923,8 +4367,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -4962,7 +4406,7 @@
     if (other is CodeLensRegistrationOptions &&
         other.runtimeType == CodeLensRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -5060,25 +4504,25 @@
   );
 
   Color({
-    required this.red,
-    required this.green,
-    required this.blue,
     required this.alpha,
+    required this.blue,
+    required this.green,
+    required this.red,
   });
   static Color fromJson(Map<String, Object?> json) {
-    final redJson = json['red'];
-    final red = redJson as num;
-    final greenJson = json['green'];
-    final green = greenJson as num;
-    final blueJson = json['blue'];
-    final blue = blueJson as num;
     final alphaJson = json['alpha'];
     final alpha = alphaJson as num;
+    final blueJson = json['blue'];
+    final blue = blueJson as num;
+    final greenJson = json['green'];
+    final green = greenJson as num;
+    final redJson = json['red'];
+    final red = redJson as num;
     return Color(
-      red: red,
-      green: green,
-      blue: blue,
       alpha: alpha,
+      blue: blue,
+      green: green,
+      red: red,
     );
   }
 
@@ -5096,45 +4540,27 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['red'] = red;
-    __result['green'] = green;
-    __result['blue'] = blue;
     __result['alpha'] = alpha;
+    __result['blue'] = blue;
+    __result['green'] = green;
+    __result['red'] = red;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('red');
+      reporter.push('alpha');
       try {
-        if (!obj.containsKey('red')) {
+        if (!obj.containsKey('alpha')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final red = obj['red'];
-        if (red == null) {
+        final alpha = obj['alpha'];
+        if (alpha == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(red is num)) {
-          reporter.reportError('must be of type num');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('green');
-      try {
-        if (!obj.containsKey('green')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final green = obj['green'];
-        if (green == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(green is num)) {
+        if (!(alpha is num)) {
           reporter.reportError('must be of type num');
           return false;
         }
@@ -5159,18 +4585,36 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('alpha');
+      reporter.push('green');
       try {
-        if (!obj.containsKey('alpha')) {
+        if (!obj.containsKey('green')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final alpha = obj['alpha'];
-        if (alpha == null) {
+        final green = obj['green'];
+        if (green == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(alpha is num)) {
+        if (!(green is num)) {
+          reporter.reportError('must be of type num');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('red');
+      try {
+        if (!obj.containsKey('red')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final red = obj['red'];
+        if (red == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(red is num)) {
           reporter.reportError('must be of type num');
           return false;
         }
@@ -5187,10 +4631,10 @@
   @override
   bool operator ==(Object other) {
     if (other is Color && other.runtimeType == Color) {
-      return red == other.red &&
-          green == other.green &&
+      return alpha == other.alpha &&
           blue == other.blue &&
-          alpha == other.alpha &&
+          green == other.green &&
+          red == other.red &&
           true;
     }
     return false;
@@ -5198,10 +4642,10 @@
 
   @override
   int get hashCode => Object.hash(
-        red,
-        green,
-        blue,
         alpha,
+        blue,
+        green,
+        red,
       );
 
   @override
@@ -5215,17 +4659,17 @@
   );
 
   ColorInformation({
-    required this.range,
     required this.color,
+    required this.range,
   });
   static ColorInformation fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final colorJson = json['color'];
     final color = Color.fromJson(colorJson as Map<String, Object?>);
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return ColorInformation(
-      range: range,
       color: color,
+      range: range,
     );
   }
 
@@ -5237,31 +4681,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     __result['color'] = color.toJson();
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
-      try {
-        if (!obj.containsKey('range')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final range = obj['range'];
-        if (range == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('color');
       try {
         if (!obj.containsKey('color')) {
@@ -5280,6 +4706,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ColorInformation');
@@ -5290,15 +4734,15 @@
   @override
   bool operator ==(Object other) {
     if (other is ColorInformation && other.runtimeType == ColorInformation) {
-      return range == other.range && color == other.color && true;
+      return color == other.color && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         color,
+        range,
       );
 
   @override
@@ -5312,25 +4756,25 @@
   );
 
   ColorPresentation({
+    this.additionalTextEdits,
     required this.label,
     this.textEdit,
-    this.additionalTextEdits,
   });
   static ColorPresentation fromJson(Map<String, Object?> json) {
+    final additionalTextEditsJson = json['additionalTextEdits'];
+    final additionalTextEdits = (additionalTextEditsJson as List<Object?>?)
+        ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
+        .toList();
     final labelJson = json['label'];
     final label = labelJson as String;
     final textEditJson = json['textEdit'];
     final textEdit = textEditJson != null
         ? TextEdit.fromJson(textEditJson as Map<String, Object?>)
         : null;
-    final additionalTextEditsJson = json['additionalTextEdits'];
-    final additionalTextEdits = (additionalTextEditsJson as List<Object?>?)
-        ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
-        .toList();
     return ColorPresentation(
+      additionalTextEdits: additionalTextEdits,
       label: label,
       textEdit: textEdit,
-      additionalTextEdits: additionalTextEdits,
     );
   }
 
@@ -5351,19 +4795,32 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['label'] = label;
-    if (textEdit != null) {
-      __result['textEdit'] = textEdit?.toJson();
-    }
     if (additionalTextEdits != null) {
       __result['additionalTextEdits'] =
           additionalTextEdits?.map((item) => item.toJson()).toList();
     }
+    __result['label'] = label;
+    if (textEdit != null) {
+      __result['textEdit'] = textEdit?.toJson();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('additionalTextEdits');
+      try {
+        final additionalTextEdits = obj['additionalTextEdits'];
+        if (additionalTextEdits != null &&
+            !((additionalTextEdits is List<Object?> &&
+                (additionalTextEdits
+                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextEdit>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
@@ -5392,19 +4849,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('additionalTextEdits');
-      try {
-        final additionalTextEdits = obj['additionalTextEdits'];
-        if (additionalTextEdits != null &&
-            !((additionalTextEdits is List<Object?> &&
-                (additionalTextEdits
-                    .every((item) => TextEdit.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextEdit>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ColorPresentation');
@@ -5415,10 +4859,10 @@
   @override
   bool operator ==(Object other) {
     if (other is ColorPresentation && other.runtimeType == ColorPresentation) {
-      return label == other.label &&
-          textEdit == other.textEdit &&
-          listEqual(additionalTextEdits, other.additionalTextEdits,
+      return listEqual(additionalTextEdits, other.additionalTextEdits,
               (TextEdit a, TextEdit b) => a == b) &&
+          label == other.label &&
+          textEdit == other.textEdit &&
           true;
     }
     return false;
@@ -5426,9 +4870,9 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(additionalTextEdits),
         label,
         textEdit,
-        lspHashCode(additionalTextEdits),
       );
 
   @override
@@ -5443,28 +4887,15 @@
   );
 
   ColorPresentationParams({
-    required this.textDocument,
     required this.color,
-    required this.range,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.range,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static ColorPresentationParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
     final colorJson = json['color'];
     final color = Color.fromJson(colorJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -5473,12 +4904,25 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return ColorPresentationParams(
-      textDocument: textDocument,
       color: color,
-      range: range,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      range: range,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -5500,38 +4944,20 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['color'] = color.toJson();
-    __result['range'] = range.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['range'] = range.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('color');
       try {
         if (!obj.containsKey('color')) {
@@ -5550,6 +4976,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -5568,22 +5005,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -5601,11 +5045,11 @@
   bool operator ==(Object other) {
     if (other is ColorPresentationParams &&
         other.runtimeType == ColorPresentationParams) {
-      return textDocument == other.textDocument &&
-          color == other.color &&
-          range == other.range &&
-          workDoneToken == other.workDoneToken &&
+      return color == other.color &&
           partialResultToken == other.partialResultToken &&
+          range == other.range &&
+          textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -5613,11 +5057,11 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         color,
-        range,
-        workDoneToken,
         partialResultToken,
+        range,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -5631,22 +5075,22 @@
   );
 
   Command({
-    required this.title,
-    required this.command,
     this.arguments,
+    required this.command,
+    required this.title,
   });
   static Command fromJson(Map<String, Object?> json) {
-    final titleJson = json['title'];
-    final title = titleJson as String;
-    final commandJson = json['command'];
-    final command = commandJson as String;
     final argumentsJson = json['arguments'];
     final arguments =
         (argumentsJson as List<Object?>?)?.map((item) => item).toList();
+    final commandJson = json['command'];
+    final command = commandJson as String;
+    final titleJson = json['title'];
+    final title = titleJson as String;
     return Command(
-      title: title,
-      command: command,
       arguments: arguments,
+      command: command,
+      title: title,
     );
   }
 
@@ -5661,29 +5105,23 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['title'] = title;
-    __result['command'] = command;
     if (arguments != null) {
       __result['arguments'] = arguments;
     }
+    __result['command'] = command;
+    __result['title'] = title;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('title');
+      reporter.push('arguments');
       try {
-        if (!obj.containsKey('title')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final title = obj['title'];
-        if (title == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(title is String)) {
-          reporter.reportError('must be of type String');
+        final arguments = obj['arguments'];
+        if (arguments != null &&
+            !((arguments is List<Object?> &&
+                (arguments.every((item) => true))))) {
+          reporter.reportError('must be of type List<Object?>');
           return false;
         }
       } finally {
@@ -5707,13 +5145,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('arguments');
+      reporter.push('title');
       try {
-        final arguments = obj['arguments'];
-        if (arguments != null &&
-            !((arguments is List<Object?> &&
-                (arguments.every((item) => true))))) {
-          reporter.reportError('must be of type List<Object?>');
+        if (!obj.containsKey('title')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final title = obj['title'];
+        if (title == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(title is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -5729,10 +5173,10 @@
   @override
   bool operator ==(Object other) {
     if (other is Command && other.runtimeType == Command) {
-      return title == other.title &&
-          command == other.command &&
-          listEqual(
+      return listEqual(
               arguments, other.arguments, (Object? a, Object? b) => a == b) &&
+          command == other.command &&
+          title == other.title &&
           true;
     }
     return false;
@@ -5740,9 +5184,9 @@
 
   @override
   int get hashCode => Object.hash(
-        title,
-        command,
         lspHashCode(arguments),
+        command,
+        title,
       );
 
   @override
@@ -5756,16 +5200,14 @@
   );
 
   CompletionClientCapabilities({
-    this.dynamicRegistration,
     this.completionItem,
     this.completionItemKind,
-    this.contextSupport,
-    this.insertTextMode,
     this.completionList,
+    this.contextSupport,
+    this.dynamicRegistration,
+    this.insertTextMode,
   });
   static CompletionClientCapabilities fromJson(Map<String, Object?> json) {
-    final dynamicRegistrationJson = json['dynamicRegistration'];
-    final dynamicRegistration = dynamicRegistrationJson as bool?;
     final completionItemJson = json['completionItem'];
     final completionItem = completionItemJson != null
         ? CompletionClientCapabilitiesCompletionItem.fromJson(
@@ -5776,24 +5218,26 @@
         ? CompletionClientCapabilitiesCompletionItemKind.fromJson(
             completionItemKindJson as Map<String, Object?>)
         : null;
-    final contextSupportJson = json['contextSupport'];
-    final contextSupport = contextSupportJson as bool?;
-    final insertTextModeJson = json['insertTextMode'];
-    final insertTextMode = insertTextModeJson != null
-        ? InsertTextMode.fromJson(insertTextModeJson as int)
-        : null;
     final completionListJson = json['completionList'];
     final completionList = completionListJson != null
         ? CompletionClientCapabilitiesCompletionList.fromJson(
             completionListJson as Map<String, Object?>)
         : null;
+    final contextSupportJson = json['contextSupport'];
+    final contextSupport = contextSupportJson as bool?;
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final insertTextModeJson = json['insertTextMode'];
+    final insertTextMode = insertTextModeJson != null
+        ? InsertTextMode.fromJson(insertTextModeJson as int)
+        : null;
     return CompletionClientCapabilities(
-      dynamicRegistration: dynamicRegistration,
       completionItem: completionItem,
       completionItemKind: completionItemKind,
-      contextSupport: contextSupport,
-      insertTextMode: insertTextMode,
       completionList: completionList,
+      contextSupport: contextSupport,
+      dynamicRegistration: dynamicRegistration,
+      insertTextMode: insertTextMode,
     );
   }
 
@@ -5819,39 +5263,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (dynamicRegistration != null) {
-      __result['dynamicRegistration'] = dynamicRegistration;
-    }
     if (completionItem != null) {
       __result['completionItem'] = completionItem?.toJson();
     }
     if (completionItemKind != null) {
       __result['completionItemKind'] = completionItemKind?.toJson();
     }
+    if (completionList != null) {
+      __result['completionList'] = completionList?.toJson();
+    }
     if (contextSupport != null) {
       __result['contextSupport'] = contextSupport;
     }
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
     if (insertTextMode != null) {
       __result['insertTextMode'] = insertTextMode?.toJson();
     }
-    if (completionList != null) {
-      __result['completionList'] = completionList?.toJson();
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('dynamicRegistration');
-      try {
-        final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('completionItem');
       try {
         final completionItem = obj['completionItem'];
@@ -5878,6 +5312,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('completionList');
+      try {
+        final completionList = obj['completionList'];
+        if (completionList != null &&
+            !(CompletionClientCapabilitiesCompletionList.canParse(
+                completionList, reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesCompletionList');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('contextSupport');
       try {
         final contextSupport = obj['contextSupport'];
@@ -5888,6 +5335,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('dynamicRegistration');
+      try {
+        final dynamicRegistration = obj['dynamicRegistration'];
+        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('insertTextMode');
       try {
         final insertTextMode = obj['insertTextMode'];
@@ -5899,19 +5356,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('completionList');
-      try {
-        final completionList = obj['completionList'];
-        if (completionList != null &&
-            !(CompletionClientCapabilitiesCompletionList.canParse(
-                completionList, reporter))) {
-          reporter.reportError(
-              'must be of type CompletionClientCapabilitiesCompletionList');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CompletionClientCapabilities');
@@ -5923,12 +5367,12 @@
   bool operator ==(Object other) {
     if (other is CompletionClientCapabilities &&
         other.runtimeType == CompletionClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration &&
-          completionItem == other.completionItem &&
+      return completionItem == other.completionItem &&
           completionItemKind == other.completionItemKind &&
-          contextSupport == other.contextSupport &&
-          insertTextMode == other.insertTextMode &&
           completionList == other.completionList &&
+          contextSupport == other.contextSupport &&
+          dynamicRegistration == other.dynamicRegistration &&
+          insertTextMode == other.insertTextMode &&
           true;
     }
     return false;
@@ -5936,12 +5380,12 @@
 
   @override
   int get hashCode => Object.hash(
-        dynamicRegistration,
         completionItem,
         completionItemKind,
-        contextSupport,
-        insertTextMode,
         completionList,
+        contextSupport,
+        dynamicRegistration,
+        insertTextMode,
       );
 
   @override
@@ -5955,43 +5399,29 @@
   );
 
   CompletionClientCapabilitiesCompletionItem({
-    this.snippetSupport,
     this.commitCharactersSupport,
-    this.documentationFormat,
     this.deprecatedSupport,
-    this.preselectSupport,
-    this.tagSupport,
+    this.documentationFormat,
     this.insertReplaceSupport,
-    this.resolveSupport,
     this.insertTextModeSupport,
     this.labelDetailsSupport,
+    this.preselectSupport,
+    this.resolveSupport,
+    this.snippetSupport,
+    this.tagSupport,
   });
   static CompletionClientCapabilitiesCompletionItem fromJson(
       Map<String, Object?> json) {
-    final snippetSupportJson = json['snippetSupport'];
-    final snippetSupport = snippetSupportJson as bool?;
     final commitCharactersSupportJson = json['commitCharactersSupport'];
     final commitCharactersSupport = commitCharactersSupportJson as bool?;
+    final deprecatedSupportJson = json['deprecatedSupport'];
+    final deprecatedSupport = deprecatedSupportJson as bool?;
     final documentationFormatJson = json['documentationFormat'];
     final documentationFormat = (documentationFormatJson as List<Object?>?)
         ?.map((item) => MarkupKind.fromJson(item as String))
         .toList();
-    final deprecatedSupportJson = json['deprecatedSupport'];
-    final deprecatedSupport = deprecatedSupportJson as bool?;
-    final preselectSupportJson = json['preselectSupport'];
-    final preselectSupport = preselectSupportJson as bool?;
-    final tagSupportJson = json['tagSupport'];
-    final tagSupport = tagSupportJson != null
-        ? CompletionClientCapabilitiesTagSupport.fromJson(
-            tagSupportJson as Map<String, Object?>)
-        : null;
     final insertReplaceSupportJson = json['insertReplaceSupport'];
     final insertReplaceSupport = insertReplaceSupportJson as bool?;
-    final resolveSupportJson = json['resolveSupport'];
-    final resolveSupport = resolveSupportJson != null
-        ? CompletionClientCapabilitiesResolveSupport.fromJson(
-            resolveSupportJson as Map<String, Object?>)
-        : null;
     final insertTextModeSupportJson = json['insertTextModeSupport'];
     final insertTextModeSupport = insertTextModeSupportJson != null
         ? CompletionClientCapabilitiesInsertTextModeSupport.fromJson(
@@ -5999,17 +5429,31 @@
         : null;
     final labelDetailsSupportJson = json['labelDetailsSupport'];
     final labelDetailsSupport = labelDetailsSupportJson as bool?;
+    final preselectSupportJson = json['preselectSupport'];
+    final preselectSupport = preselectSupportJson as bool?;
+    final resolveSupportJson = json['resolveSupport'];
+    final resolveSupport = resolveSupportJson != null
+        ? CompletionClientCapabilitiesResolveSupport.fromJson(
+            resolveSupportJson as Map<String, Object?>)
+        : null;
+    final snippetSupportJson = json['snippetSupport'];
+    final snippetSupport = snippetSupportJson as bool?;
+    final tagSupportJson = json['tagSupport'];
+    final tagSupport = tagSupportJson != null
+        ? CompletionClientCapabilitiesTagSupport.fromJson(
+            tagSupportJson as Map<String, Object?>)
+        : null;
     return CompletionClientCapabilitiesCompletionItem(
-      snippetSupport: snippetSupport,
       commitCharactersSupport: commitCharactersSupport,
-      documentationFormat: documentationFormat,
       deprecatedSupport: deprecatedSupport,
-      preselectSupport: preselectSupport,
-      tagSupport: tagSupport,
+      documentationFormat: documentationFormat,
       insertReplaceSupport: insertReplaceSupport,
-      resolveSupport: resolveSupport,
       insertTextModeSupport: insertTextModeSupport,
       labelDetailsSupport: labelDetailsSupport,
+      preselectSupport: preselectSupport,
+      resolveSupport: resolveSupport,
+      snippetSupport: snippetSupport,
+      tagSupport: tagSupport,
     );
   }
 
@@ -6066,57 +5510,57 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (snippetSupport != null) {
-      __result['snippetSupport'] = snippetSupport;
-    }
     if (commitCharactersSupport != null) {
       __result['commitCharactersSupport'] = commitCharactersSupport;
     }
+    if (deprecatedSupport != null) {
+      __result['deprecatedSupport'] = deprecatedSupport;
+    }
     if (documentationFormat != null) {
       __result['documentationFormat'] =
           documentationFormat?.map((item) => item.toJson()).toList();
     }
-    if (deprecatedSupport != null) {
-      __result['deprecatedSupport'] = deprecatedSupport;
-    }
-    if (preselectSupport != null) {
-      __result['preselectSupport'] = preselectSupport;
-    }
-    if (tagSupport != null) {
-      __result['tagSupport'] = tagSupport?.toJson();
-    }
     if (insertReplaceSupport != null) {
       __result['insertReplaceSupport'] = insertReplaceSupport;
     }
-    if (resolveSupport != null) {
-      __result['resolveSupport'] = resolveSupport?.toJson();
-    }
     if (insertTextModeSupport != null) {
       __result['insertTextModeSupport'] = insertTextModeSupport?.toJson();
     }
     if (labelDetailsSupport != null) {
       __result['labelDetailsSupport'] = labelDetailsSupport;
     }
+    if (preselectSupport != null) {
+      __result['preselectSupport'] = preselectSupport;
+    }
+    if (resolveSupport != null) {
+      __result['resolveSupport'] = resolveSupport?.toJson();
+    }
+    if (snippetSupport != null) {
+      __result['snippetSupport'] = snippetSupport;
+    }
+    if (tagSupport != null) {
+      __result['tagSupport'] = tagSupport?.toJson();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('snippetSupport');
+      reporter.push('commitCharactersSupport');
       try {
-        final snippetSupport = obj['snippetSupport'];
-        if (snippetSupport != null && !(snippetSupport is bool)) {
+        final commitCharactersSupport = obj['commitCharactersSupport'];
+        if (commitCharactersSupport != null &&
+            !(commitCharactersSupport is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('commitCharactersSupport');
+      reporter.push('deprecatedSupport');
       try {
-        final commitCharactersSupport = obj['commitCharactersSupport'];
-        if (commitCharactersSupport != null &&
-            !(commitCharactersSupport is bool)) {
+        final deprecatedSupport = obj['deprecatedSupport'];
+        if (deprecatedSupport != null && !(deprecatedSupport is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -6136,39 +5580,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('deprecatedSupport');
-      try {
-        final deprecatedSupport = obj['deprecatedSupport'];
-        if (deprecatedSupport != null && !(deprecatedSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('preselectSupport');
-      try {
-        final preselectSupport = obj['preselectSupport'];
-        if (preselectSupport != null && !(preselectSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('tagSupport');
-      try {
-        final tagSupport = obj['tagSupport'];
-        if (tagSupport != null &&
-            !(CompletionClientCapabilitiesTagSupport.canParse(
-                tagSupport, reporter))) {
-          reporter.reportError(
-              'must be of type CompletionClientCapabilitiesTagSupport');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('insertReplaceSupport');
       try {
         final insertReplaceSupport = obj['insertReplaceSupport'];
@@ -6179,19 +5590,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('resolveSupport');
-      try {
-        final resolveSupport = obj['resolveSupport'];
-        if (resolveSupport != null &&
-            !(CompletionClientCapabilitiesResolveSupport.canParse(
-                resolveSupport, reporter))) {
-          reporter.reportError(
-              'must be of type CompletionClientCapabilitiesResolveSupport');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('insertTextModeSupport');
       try {
         final insertTextModeSupport = obj['insertTextModeSupport'];
@@ -6215,6 +5613,52 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('preselectSupport');
+      try {
+        final preselectSupport = obj['preselectSupport'];
+        if (preselectSupport != null && !(preselectSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('resolveSupport');
+      try {
+        final resolveSupport = obj['resolveSupport'];
+        if (resolveSupport != null &&
+            !(CompletionClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesResolveSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('snippetSupport');
+      try {
+        final snippetSupport = obj['snippetSupport'];
+        if (snippetSupport != null && !(snippetSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tagSupport');
+      try {
+        final tagSupport = obj['tagSupport'];
+        if (tagSupport != null &&
+            !(CompletionClientCapabilitiesTagSupport.canParse(
+                tagSupport, reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesTagSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -6227,17 +5671,17 @@
   bool operator ==(Object other) {
     if (other is CompletionClientCapabilitiesCompletionItem &&
         other.runtimeType == CompletionClientCapabilitiesCompletionItem) {
-      return snippetSupport == other.snippetSupport &&
-          commitCharactersSupport == other.commitCharactersSupport &&
+      return commitCharactersSupport == other.commitCharactersSupport &&
+          deprecatedSupport == other.deprecatedSupport &&
           listEqual(documentationFormat, other.documentationFormat,
               (MarkupKind a, MarkupKind b) => a == b) &&
-          deprecatedSupport == other.deprecatedSupport &&
-          preselectSupport == other.preselectSupport &&
-          tagSupport == other.tagSupport &&
           insertReplaceSupport == other.insertReplaceSupport &&
-          resolveSupport == other.resolveSupport &&
           insertTextModeSupport == other.insertTextModeSupport &&
           labelDetailsSupport == other.labelDetailsSupport &&
+          preselectSupport == other.preselectSupport &&
+          resolveSupport == other.resolveSupport &&
+          snippetSupport == other.snippetSupport &&
+          tagSupport == other.tagSupport &&
           true;
     }
     return false;
@@ -6245,16 +5689,16 @@
 
   @override
   int get hashCode => Object.hash(
-        snippetSupport,
         commitCharactersSupport,
-        lspHashCode(documentationFormat),
         deprecatedSupport,
-        preselectSupport,
-        tagSupport,
+        lspHashCode(documentationFormat),
         insertReplaceSupport,
-        resolveSupport,
         insertTextModeSupport,
         labelDetailsSupport,
+        preselectSupport,
+        resolveSupport,
+        snippetSupport,
+        tagSupport,
       );
 
   @override
@@ -6654,17 +6098,17 @@
   );
 
   CompletionContext({
-    required this.triggerKind,
     this.triggerCharacter,
+    required this.triggerKind,
   });
   static CompletionContext fromJson(Map<String, Object?> json) {
-    final triggerKindJson = json['triggerKind'];
-    final triggerKind = CompletionTriggerKind.fromJson(triggerKindJson as int);
     final triggerCharacterJson = json['triggerCharacter'];
     final triggerCharacter = triggerCharacterJson as String?;
+    final triggerKindJson = json['triggerKind'];
+    final triggerKind = CompletionTriggerKind.fromJson(triggerKindJson as int);
     return CompletionContext(
-      triggerKind: triggerKind,
       triggerCharacter: triggerCharacter,
+      triggerKind: triggerKind,
     );
   }
 
@@ -6677,15 +6121,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['triggerKind'] = triggerKind.toJson();
     if (triggerCharacter != null) {
       __result['triggerCharacter'] = triggerCharacter;
     }
+    __result['triggerKind'] = triggerKind.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('triggerCharacter');
+      try {
+        final triggerCharacter = obj['triggerCharacter'];
+        if (triggerCharacter != null && !(triggerCharacter is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('triggerKind');
       try {
         if (!obj.containsKey('triggerKind')) {
@@ -6704,16 +6158,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('triggerCharacter');
-      try {
-        final triggerCharacter = obj['triggerCharacter'];
-        if (triggerCharacter != null && !(triggerCharacter is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CompletionContext');
@@ -6724,8 +6168,8 @@
   @override
   bool operator ==(Object other) {
     if (other is CompletionContext && other.runtimeType == CompletionContext) {
-      return triggerKind == other.triggerKind &&
-          triggerCharacter == other.triggerCharacter &&
+      return triggerCharacter == other.triggerCharacter &&
+          triggerKind == other.triggerKind &&
           true;
     }
     return false;
@@ -6733,8 +6177,8 @@
 
   @override
   int get hashCode => Object.hash(
-        triggerKind,
         triggerCharacter,
+        triggerKind,
       );
 
   @override
@@ -6748,58 +6192,57 @@
   );
 
   CompletionItem({
-    required this.label,
-    this.labelDetails,
-    this.kind,
-    this.tags,
+    this.additionalTextEdits,
+    this.command,
+    this.commitCharacters,
+    this.data,
+    this.deprecated,
     this.detail,
     this.documentation,
-    this.deprecated,
-    this.preselect,
-    this.sortText,
     this.filterText,
     this.insertText,
     this.insertTextFormat,
     this.insertTextMode,
+    this.kind,
+    required this.label,
+    this.labelDetails,
+    this.preselect,
+    this.sortText,
+    this.tags,
     this.textEdit,
     this.textEditText,
-    this.additionalTextEdits,
-    this.commitCharacters,
-    this.command,
-    this.data,
   });
   static CompletionItem fromJson(Map<String, Object?> json) {
-    final labelJson = json['label'];
-    final label = labelJson as String;
-    final labelDetailsJson = json['labelDetails'];
-    final labelDetails = labelDetailsJson != null
-        ? CompletionItemLabelDetails.fromJson(
-            labelDetailsJson as Map<String, Object?>)
-        : null;
-    final kindJson = json['kind'];
-    final kind =
-        kindJson != null ? CompletionItemKind.fromJson(kindJson as int) : null;
-    final tagsJson = json['tags'];
-    final tags = (tagsJson as List<Object?>?)
-        ?.map((item) => CompletionItemTag.fromJson(item as int))
+    final additionalTextEditsJson = json['additionalTextEdits'];
+    final additionalTextEdits = (additionalTextEditsJson as List<Object?>?)
+        ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
         .toList();
+    final commandJson = json['command'];
+    final command = commandJson != null
+        ? Command.fromJson(commandJson as Map<String, Object?>)
+        : null;
+    final commitCharactersJson = json['commitCharacters'];
+    final commitCharacters = (commitCharactersJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
+    final dataJson = json['data'];
+    final data = dataJson != null
+        ? CompletionItemResolutionInfo.fromJson(
+            dataJson as Map<String, Object?>)
+        : null;
+    final deprecatedJson = json['deprecated'];
+    final deprecated = deprecatedJson as bool?;
     final detailJson = json['detail'];
     final detail = detailJson as String?;
     final documentationJson = json['documentation'];
     final documentation = documentationJson == null
         ? null
-        : (documentationJson is String
-            ? Either2<String, MarkupContent>.t1(documentationJson)
-            : (MarkupContent.canParse(documentationJson, nullLspJsonReporter)
-                ? Either2<String, MarkupContent>.t2(MarkupContent.fromJson(
-                    documentationJson as Map<String, Object?>))
-                : (throw '''$documentationJson was not one of (String, MarkupContent)''')));
-    final deprecatedJson = json['deprecated'];
-    final deprecated = deprecatedJson as bool?;
-    final preselectJson = json['preselect'];
-    final preselect = preselectJson as bool?;
-    final sortTextJson = json['sortText'];
-    final sortText = sortTextJson as String?;
+        : (MarkupContent.canParse(documentationJson, nullLspJsonReporter)
+            ? Either2<MarkupContent, String>.t1(MarkupContent.fromJson(
+                documentationJson as Map<String, Object?>))
+            : (documentationJson is String
+                ? Either2<MarkupContent, String>.t2(documentationJson)
+                : (throw '''$documentationJson was not one of (MarkupContent, String)''')));
     final filterTextJson = json['filterText'];
     final filterText = filterTextJson as String?;
     final insertTextJson = json['insertText'];
@@ -6812,56 +6255,57 @@
     final insertTextMode = insertTextModeJson != null
         ? InsertTextMode.fromJson(insertTextModeJson as int)
         : null;
+    final kindJson = json['kind'];
+    final kind =
+        kindJson != null ? CompletionItemKind.fromJson(kindJson as int) : null;
+    final labelJson = json['label'];
+    final label = labelJson as String;
+    final labelDetailsJson = json['labelDetails'];
+    final labelDetails = labelDetailsJson != null
+        ? CompletionItemLabelDetails.fromJson(
+            labelDetailsJson as Map<String, Object?>)
+        : null;
+    final preselectJson = json['preselect'];
+    final preselect = preselectJson as bool?;
+    final sortTextJson = json['sortText'];
+    final sortText = sortTextJson as String?;
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => CompletionItemTag.fromJson(item as int))
+        .toList();
     final textEditJson = json['textEdit'];
     final textEdit = textEditJson == null
         ? null
-        : (TextEdit.canParse(textEditJson, nullLspJsonReporter)
-            ? Either2<TextEdit, InsertReplaceEdit>.t1(
-                TextEdit.fromJson(textEditJson as Map<String, Object?>))
-            : (InsertReplaceEdit.canParse(textEditJson, nullLspJsonReporter)
-                ? Either2<TextEdit, InsertReplaceEdit>.t2(
-                    InsertReplaceEdit.fromJson(
-                        textEditJson as Map<String, Object?>))
-                : (throw '''$textEditJson was not one of (TextEdit, InsertReplaceEdit)''')));
+        : (InsertReplaceEdit.canParse(textEditJson, nullLspJsonReporter)
+            ? Either2<InsertReplaceEdit, TextEdit>.t1(
+                InsertReplaceEdit.fromJson(
+                    textEditJson as Map<String, Object?>))
+            : (TextEdit.canParse(textEditJson, nullLspJsonReporter)
+                ? Either2<InsertReplaceEdit, TextEdit>.t2(
+                    TextEdit.fromJson(textEditJson as Map<String, Object?>))
+                : (throw '''$textEditJson was not one of (InsertReplaceEdit, TextEdit)''')));
     final textEditTextJson = json['textEditText'];
     final textEditText = textEditTextJson as String?;
-    final additionalTextEditsJson = json['additionalTextEdits'];
-    final additionalTextEdits = (additionalTextEditsJson as List<Object?>?)
-        ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
-        .toList();
-    final commitCharactersJson = json['commitCharacters'];
-    final commitCharacters = (commitCharactersJson as List<Object?>?)
-        ?.map((item) => item as String)
-        .toList();
-    final commandJson = json['command'];
-    final command = commandJson != null
-        ? Command.fromJson(commandJson as Map<String, Object?>)
-        : null;
-    final dataJson = json['data'];
-    final data = dataJson != null
-        ? CompletionItemResolutionInfo.fromJson(
-            dataJson as Map<String, Object?>)
-        : null;
     return CompletionItem(
-      label: label,
-      labelDetails: labelDetails,
-      kind: kind,
-      tags: tags,
+      additionalTextEdits: additionalTextEdits,
+      command: command,
+      commitCharacters: commitCharacters,
+      data: data,
+      deprecated: deprecated,
       detail: detail,
       documentation: documentation,
-      deprecated: deprecated,
-      preselect: preselect,
-      sortText: sortText,
       filterText: filterText,
       insertText: insertText,
       insertTextFormat: insertTextFormat,
       insertTextMode: insertTextMode,
+      kind: kind,
+      label: label,
+      labelDetails: labelDetails,
+      preselect: preselect,
+      sortText: sortText,
+      tags: tags,
       textEdit: textEdit,
       textEditText: textEditText,
-      additionalTextEdits: additionalTextEdits,
-      commitCharacters: commitCharacters,
-      command: command,
-      data: data,
     );
   }
 
@@ -6898,7 +6342,7 @@
   final String? detail;
 
   /// A human-readable string that represents a doc-comment.
-  final Either2<String, MarkupContent>? documentation;
+  final Either2<MarkupContent, String>? documentation;
 
   /// A string that should be used when filtering a set of completion items.
   /// When `falsy` the label is used as the filter text for this item.
@@ -6985,7 +6429,7 @@
   /// must be a prefix of the edit's replace range, that means it must be
   /// contained and starting at the same position.
   ///  @since 3.16.0 additional type `InsertReplaceEdit`
-  final Either2<TextEdit, InsertReplaceEdit>? textEdit;
+  final Either2<InsertReplaceEdit, TextEdit>? textEdit;
 
   /// The edit text used if the completion item is part of a CompletionList and
   /// CompletionList defines an item default for the text edit range.
@@ -7000,15 +6444,21 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['label'] = label;
-    if (labelDetails != null) {
-      __result['labelDetails'] = labelDetails?.toJson();
+    if (additionalTextEdits != null) {
+      __result['additionalTextEdits'] =
+          additionalTextEdits?.map((item) => item.toJson()).toList();
     }
-    if (kind != null) {
-      __result['kind'] = kind?.toJson();
+    if (command != null) {
+      __result['command'] = command?.toJson();
     }
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    if (commitCharacters != null) {
+      __result['commitCharacters'] = commitCharacters;
+    }
+    if (data != null) {
+      __result['data'] = data?.toJson();
+    }
+    if (deprecated != null) {
+      __result['deprecated'] = deprecated;
     }
     if (detail != null) {
       __result['detail'] = detail;
@@ -7016,15 +6466,6 @@
     if (documentation != null) {
       __result['documentation'] = documentation;
     }
-    if (deprecated != null) {
-      __result['deprecated'] = deprecated;
-    }
-    if (preselect != null) {
-      __result['preselect'] = preselect;
-    }
-    if (sortText != null) {
-      __result['sortText'] = sortText;
-    }
     if (filterText != null) {
       __result['filterText'] = filterText;
     }
@@ -7037,77 +6478,84 @@
     if (insertTextMode != null) {
       __result['insertTextMode'] = insertTextMode?.toJson();
     }
+    if (kind != null) {
+      __result['kind'] = kind?.toJson();
+    }
+    __result['label'] = label;
+    if (labelDetails != null) {
+      __result['labelDetails'] = labelDetails?.toJson();
+    }
+    if (preselect != null) {
+      __result['preselect'] = preselect;
+    }
+    if (sortText != null) {
+      __result['sortText'] = sortText;
+    }
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    }
     if (textEdit != null) {
       __result['textEdit'] = textEdit;
     }
     if (textEditText != null) {
       __result['textEditText'] = textEditText;
     }
-    if (additionalTextEdits != null) {
-      __result['additionalTextEdits'] =
-          additionalTextEdits?.map((item) => item.toJson()).toList();
-    }
-    if (commitCharacters != null) {
-      __result['commitCharacters'] = commitCharacters;
-    }
-    if (command != null) {
-      __result['command'] = command?.toJson();
-    }
-    if (data != null) {
-      __result['data'] = data?.toJson();
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('label');
+      reporter.push('additionalTextEdits');
       try {
-        if (!obj.containsKey('label')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final label = obj['label'];
-        if (label == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(label is String)) {
-          reporter.reportError('must be of type String');
+        final additionalTextEdits = obj['additionalTextEdits'];
+        if (additionalTextEdits != null &&
+            !((additionalTextEdits is List<Object?> &&
+                (additionalTextEdits
+                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextEdit>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('labelDetails');
+      reporter.push('command');
       try {
-        final labelDetails = obj['labelDetails'];
-        if (labelDetails != null &&
-            !(CompletionItemLabelDetails.canParse(labelDetails, reporter))) {
-          reporter.reportError('must be of type CompletionItemLabelDetails');
+        final command = obj['command'];
+        if (command != null && !(Command.canParse(command, reporter))) {
+          reporter.reportError('must be of type Command');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('kind');
+      reporter.push('commitCharacters');
       try {
-        final kind = obj['kind'];
-        if (kind != null && !(CompletionItemKind.canParse(kind, reporter))) {
-          reporter.reportError('must be of type CompletionItemKind');
+        final commitCharacters = obj['commitCharacters'];
+        if (commitCharacters != null &&
+            !((commitCharacters is List<Object?> &&
+                (commitCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
+      reporter.push('data');
       try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every(
-                    (item) => CompletionItemTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<CompletionItemTag>');
+        final data = obj['data'];
+        if (data != null &&
+            !(CompletionItemResolutionInfo.canParse(data, reporter))) {
+          reporter.reportError('must be of type CompletionItemResolutionInfo');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('deprecated');
+      try {
+        final deprecated = obj['deprecated'];
+        if (deprecated != null && !(deprecated is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -7127,40 +6575,10 @@
       try {
         final documentation = obj['documentation'];
         if (documentation != null &&
-            !((documentation is String ||
-                MarkupContent.canParse(documentation, reporter)))) {
+            !((MarkupContent.canParse(documentation, reporter) ||
+                documentation is String))) {
           reporter
-              .reportError('must be of type Either2<String, MarkupContent>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('deprecated');
-      try {
-        final deprecated = obj['deprecated'];
-        if (deprecated != null && !(deprecated is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('preselect');
-      try {
-        final preselect = obj['preselect'];
-        if (preselect != null && !(preselect is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('sortText');
-      try {
-        final sortText = obj['sortText'];
-        if (sortText != null && !(sortText is String)) {
-          reporter.reportError('must be of type String');
+              .reportError('must be of type Either2<MarkupContent, String>');
           return false;
         }
       } finally {
@@ -7208,14 +6626,86 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('kind');
+      try {
+        final kind = obj['kind'];
+        if (kind != null && !(CompletionItemKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type CompletionItemKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('label');
+      try {
+        if (!obj.containsKey('label')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final label = obj['label'];
+        if (label == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(label is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('labelDetails');
+      try {
+        final labelDetails = obj['labelDetails'];
+        if (labelDetails != null &&
+            !(CompletionItemLabelDetails.canParse(labelDetails, reporter))) {
+          reporter.reportError('must be of type CompletionItemLabelDetails');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('preselect');
+      try {
+        final preselect = obj['preselect'];
+        if (preselect != null && !(preselect is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('sortText');
+      try {
+        final sortText = obj['sortText'];
+        if (sortText != null && !(sortText is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every(
+                    (item) => CompletionItemTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CompletionItemTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textEdit');
       try {
         final textEdit = obj['textEdit'];
         if (textEdit != null &&
-            !((TextEdit.canParse(textEdit, reporter) ||
-                InsertReplaceEdit.canParse(textEdit, reporter)))) {
+            !((InsertReplaceEdit.canParse(textEdit, reporter) ||
+                TextEdit.canParse(textEdit, reporter)))) {
           reporter.reportError(
-              'must be of type Either2<TextEdit, InsertReplaceEdit>');
+              'must be of type Either2<InsertReplaceEdit, TextEdit>');
           return false;
         }
       } finally {
@@ -7231,52 +6721,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('additionalTextEdits');
-      try {
-        final additionalTextEdits = obj['additionalTextEdits'];
-        if (additionalTextEdits != null &&
-            !((additionalTextEdits is List<Object?> &&
-                (additionalTextEdits
-                    .every((item) => TextEdit.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextEdit>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('commitCharacters');
-      try {
-        final commitCharacters = obj['commitCharacters'];
-        if (commitCharacters != null &&
-            !((commitCharacters is List<Object?> &&
-                (commitCharacters.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('command');
-      try {
-        final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
-          reporter.reportError('must be of type Command');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('data');
-      try {
-        final data = obj['data'];
-        if (data != null &&
-            !(CompletionItemResolutionInfo.canParse(data, reporter))) {
-          reporter.reportError('must be of type CompletionItemResolutionInfo');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CompletionItem');
@@ -7287,28 +6731,28 @@
   @override
   bool operator ==(Object other) {
     if (other is CompletionItem && other.runtimeType == CompletionItem) {
-      return label == other.label &&
-          labelDetails == other.labelDetails &&
-          kind == other.kind &&
-          listEqual(tags, other.tags,
-              (CompletionItemTag a, CompletionItemTag b) => a == b) &&
+      return listEqual(additionalTextEdits, other.additionalTextEdits,
+              (TextEdit a, TextEdit b) => a == b) &&
+          command == other.command &&
+          listEqual(commitCharacters, other.commitCharacters,
+              (String a, String b) => a == b) &&
+          data == other.data &&
+          deprecated == other.deprecated &&
           detail == other.detail &&
           documentation == other.documentation &&
-          deprecated == other.deprecated &&
-          preselect == other.preselect &&
-          sortText == other.sortText &&
           filterText == other.filterText &&
           insertText == other.insertText &&
           insertTextFormat == other.insertTextFormat &&
           insertTextMode == other.insertTextMode &&
+          kind == other.kind &&
+          label == other.label &&
+          labelDetails == other.labelDetails &&
+          preselect == other.preselect &&
+          sortText == other.sortText &&
+          listEqual(tags, other.tags,
+              (CompletionItemTag a, CompletionItemTag b) => a == b) &&
           textEdit == other.textEdit &&
           textEditText == other.textEditText &&
-          listEqual(additionalTextEdits, other.additionalTextEdits,
-              (TextEdit a, TextEdit b) => a == b) &&
-          listEqual(commitCharacters, other.commitCharacters,
-              (String a, String b) => a == b) &&
-          command == other.command &&
-          data == other.data &&
           true;
     }
     return false;
@@ -7316,25 +6760,25 @@
 
   @override
   int get hashCode => Object.hash(
-        label,
-        labelDetails,
-        kind,
-        lspHashCode(tags),
+        lspHashCode(additionalTextEdits),
+        command,
+        lspHashCode(commitCharacters),
+        data,
+        deprecated,
         detail,
         documentation,
-        deprecated,
-        preselect,
-        sortText,
         filterText,
         insertText,
         insertTextFormat,
         insertTextMode,
+        kind,
+        label,
+        labelDetails,
+        preselect,
+        sortText,
+        lspHashCode(tags),
         textEdit,
         textEditText,
-        lspHashCode(additionalTextEdits),
-        lspHashCode(commitCharacters),
-        command,
-        data,
       );
 
   @override
@@ -7398,17 +6842,17 @@
   );
 
   CompletionItemLabelDetails({
-    this.detail,
     this.description,
+    this.detail,
   });
   static CompletionItemLabelDetails fromJson(Map<String, Object?> json) {
-    final detailJson = json['detail'];
-    final detail = detailJson as String?;
     final descriptionJson = json['description'];
     final description = descriptionJson as String?;
+    final detailJson = json['detail'];
+    final detail = detailJson as String?;
     return CompletionItemLabelDetails(
-      detail: detail,
       description: description,
+      detail: detail,
     );
   }
 
@@ -7424,31 +6868,31 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (detail != null) {
-      __result['detail'] = detail;
-    }
     if (description != null) {
       __result['description'] = description;
     }
+    if (detail != null) {
+      __result['detail'] = detail;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('detail');
+      reporter.push('description');
       try {
-        final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
+        final description = obj['description'];
+        if (description != null && !(description is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('description');
+      reporter.push('detail');
       try {
-        final description = obj['description'];
-        if (description != null && !(description is String)) {
+        final detail = obj['detail'];
+        if (detail != null && !(detail is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -7466,15 +6910,15 @@
   bool operator ==(Object other) {
     if (other is CompletionItemLabelDetails &&
         other.runtimeType == CompletionItemLabelDetails) {
-      return detail == other.detail && description == other.description && true;
+      return description == other.description && detail == other.detail && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        detail,
         description,
+        detail,
       );
 
   @override
@@ -7769,15 +7213,14 @@
     final editRangeJson = json['editRange'];
     final editRange = editRangeJson == null
         ? null
-        : (Range.canParse(editRangeJson, nullLspJsonReporter)
-            ? Either2<Range, CompletionListEditRange>.t1(
-                Range.fromJson(editRangeJson as Map<String, Object?>))
-            : (CompletionListEditRange.canParse(
-                    editRangeJson, nullLspJsonReporter)
-                ? Either2<Range, CompletionListEditRange>.t2(
-                    CompletionListEditRange.fromJson(
-                        editRangeJson as Map<String, Object?>))
-                : (throw '''$editRangeJson was not one of (Range, CompletionListEditRange)''')));
+        : (CompletionListEditRange.canParse(editRangeJson, nullLspJsonReporter)
+            ? Either2<CompletionListEditRange, Range>.t1(
+                CompletionListEditRange.fromJson(
+                    editRangeJson as Map<String, Object?>))
+            : (Range.canParse(editRangeJson, nullLspJsonReporter)
+                ? Either2<CompletionListEditRange, Range>.t2(
+                    Range.fromJson(editRangeJson as Map<String, Object?>))
+                : (throw '''$editRangeJson was not one of (CompletionListEditRange, Range)''')));
     final insertTextFormatJson = json['insertTextFormat'];
     final insertTextFormat = insertTextFormatJson != null
         ? InsertTextFormat.fromJson(insertTextFormatJson as int)
@@ -7800,7 +7243,7 @@
 
   /// A default edit range
   ///  @since 3.17.0
-  final Either2<Range, CompletionListEditRange>? editRange;
+  final Either2<CompletionListEditRange, Range>? editRange;
 
   /// A default insert text format
   ///  @since 3.17.0
@@ -7845,10 +7288,10 @@
       try {
         final editRange = obj['editRange'];
         if (editRange != null &&
-            !((Range.canParse(editRange, reporter) ||
-                CompletionListEditRange.canParse(editRange, reporter)))) {
+            !((CompletionListEditRange.canParse(editRange, reporter) ||
+                Range.canParse(editRange, reporter)))) {
           reporter.reportError(
-              'must be of type Either2<Range, CompletionListEditRange>');
+              'must be of type Either2<CompletionListEditRange, Range>');
           return false;
         }
       } finally {
@@ -7917,38 +7360,38 @@
   );
 
   CompletionOptions({
-    this.triggerCharacters,
     this.allCommitCharacters,
-    this.resolveProvider,
     this.completionItem,
+    this.resolveProvider,
+    this.triggerCharacters,
     this.workDoneProgress,
   });
   static CompletionOptions fromJson(Map<String, Object?> json) {
     if (CompletionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return CompletionRegistrationOptions.fromJson(json);
     }
-    final triggerCharactersJson = json['triggerCharacters'];
-    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
-        ?.map((item) => item as String)
-        .toList();
     final allCommitCharactersJson = json['allCommitCharacters'];
     final allCommitCharacters = (allCommitCharactersJson as List<Object?>?)
         ?.map((item) => item as String)
         .toList();
-    final resolveProviderJson = json['resolveProvider'];
-    final resolveProvider = resolveProviderJson as bool?;
     final completionItemJson = json['completionItem'];
     final completionItem = completionItemJson != null
         ? CompletionOptionsCompletionItem.fromJson(
             completionItemJson as Map<String, Object?>)
         : null;
+    final resolveProviderJson = json['resolveProvider'];
+    final resolveProvider = resolveProviderJson as bool?;
+    final triggerCharactersJson = json['triggerCharacters'];
+    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return CompletionOptions(
-      triggerCharacters: triggerCharacters,
       allCommitCharacters: allCommitCharacters,
-      resolveProvider: resolveProvider,
       completionItem: completionItem,
+      resolveProvider: resolveProvider,
+      triggerCharacters: triggerCharacters,
       workDoneProgress: workDoneProgress,
     );
   }
@@ -7986,17 +7429,17 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (triggerCharacters != null) {
-      __result['triggerCharacters'] = triggerCharacters;
-    }
     if (allCommitCharacters != null) {
       __result['allCommitCharacters'] = allCommitCharacters;
     }
+    if (completionItem != null) {
+      __result['completionItem'] = completionItem?.toJson();
+    }
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
-    if (completionItem != null) {
-      __result['completionItem'] = completionItem?.toJson();
+    if (triggerCharacters != null) {
+      __result['triggerCharacters'] = triggerCharacters;
     }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
@@ -8006,18 +7449,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('triggerCharacters');
-      try {
-        final triggerCharacters = obj['triggerCharacters'];
-        if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('allCommitCharacters');
       try {
         final allCommitCharacters = obj['allCommitCharacters'];
@@ -8030,6 +7461,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('completionItem');
+      try {
+        final completionItem = obj['completionItem'];
+        if (completionItem != null &&
+            !(CompletionOptionsCompletionItem.canParse(
+                completionItem, reporter))) {
+          reporter
+              .reportError('must be of type CompletionOptionsCompletionItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
@@ -8040,14 +7484,13 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('completionItem');
+      reporter.push('triggerCharacters');
       try {
-        final completionItem = obj['completionItem'];
-        if (completionItem != null &&
-            !(CompletionOptionsCompletionItem.canParse(
-                completionItem, reporter))) {
-          reporter
-              .reportError('must be of type CompletionOptionsCompletionItem');
+        final triggerCharacters = obj['triggerCharacters'];
+        if (triggerCharacters != null &&
+            !((triggerCharacters is List<Object?> &&
+                (triggerCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -8073,12 +7516,12 @@
   @override
   bool operator ==(Object other) {
     if (other is CompletionOptions && other.runtimeType == CompletionOptions) {
-      return listEqual(triggerCharacters, other.triggerCharacters,
+      return listEqual(allCommitCharacters, other.allCommitCharacters,
               (String a, String b) => a == b) &&
-          listEqual(allCommitCharacters, other.allCommitCharacters,
-              (String a, String b) => a == b) &&
-          resolveProvider == other.resolveProvider &&
           completionItem == other.completionItem &&
+          resolveProvider == other.resolveProvider &&
+          listEqual(triggerCharacters, other.triggerCharacters,
+              (String a, String b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -8087,10 +7530,10 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(triggerCharacters),
         lspHashCode(allCommitCharacters),
-        resolveProvider,
         completionItem,
+        resolveProvider,
+        lspHashCode(triggerCharacters),
         workDoneProgress,
       );
 
@@ -8177,29 +7620,16 @@
 
   CompletionParams({
     this.context,
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static CompletionParams fromJson(Map<String, Object?> json) {
     final contextJson = json['context'];
     final context = contextJson != null
         ? CompletionContext.fromJson(contextJson as Map<String, Object?>)
         : null;
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -8208,12 +7638,25 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return CompletionParams(
       context: context,
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -8239,14 +7682,14 @@
     if (context != null) {
       __result['context'] = context?.toJson();
     }
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -8263,19 +7706,12 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -8299,22 +7735,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -8332,10 +7775,10 @@
   bool operator ==(Object other) {
     if (other is CompletionParams && other.runtimeType == CompletionParams) {
       return context == other.context &&
-          textDocument == other.textDocument &&
-          position == other.position &&
-          workDoneToken == other.workDoneToken &&
           partialResultToken == other.partialResultToken &&
+          position == other.position &&
+          textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -8344,10 +7787,10 @@
   @override
   int get hashCode => Object.hash(
         context,
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -8362,41 +7805,42 @@
   );
 
   CompletionRegistrationOptions({
-    this.documentSelector,
-    this.triggerCharacters,
     this.allCommitCharacters,
-    this.resolveProvider,
     this.completionItem,
+    this.documentSelector,
+    this.resolveProvider,
+    this.triggerCharacters,
     this.workDoneProgress,
   });
   static CompletionRegistrationOptions fromJson(Map<String, Object?> json) {
-    final documentSelectorJson = json['documentSelector'];
-    final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
-        .toList();
-    final triggerCharactersJson = json['triggerCharacters'];
-    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
-        ?.map((item) => item as String)
-        .toList();
     final allCommitCharactersJson = json['allCommitCharacters'];
     final allCommitCharacters = (allCommitCharactersJson as List<Object?>?)
         ?.map((item) => item as String)
         .toList();
-    final resolveProviderJson = json['resolveProvider'];
-    final resolveProvider = resolveProviderJson as bool?;
     final completionItemJson = json['completionItem'];
     final completionItem = completionItemJson != null
         ? CompletionOptionsCompletionItem.fromJson(
             completionItemJson as Map<String, Object?>)
         : null;
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
+    final resolveProviderJson = json['resolveProvider'];
+    final resolveProvider = resolveProviderJson as bool?;
+    final triggerCharactersJson = json['triggerCharacters'];
+    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return CompletionRegistrationOptions(
-      documentSelector: documentSelector,
-      triggerCharacters: triggerCharacters,
       allCommitCharacters: allCommitCharacters,
-      resolveProvider: resolveProvider,
       completionItem: completionItem,
+      documentSelector: documentSelector,
+      resolveProvider: resolveProvider,
+      triggerCharacters: triggerCharacters,
       workDoneProgress: workDoneProgress,
     );
   }
@@ -8417,7 +7861,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The server provides support to resolve additional information for a
   /// completion item.
@@ -8438,18 +7882,18 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['documentSelector'] = documentSelector;
-    if (triggerCharacters != null) {
-      __result['triggerCharacters'] = triggerCharacters;
-    }
     if (allCommitCharacters != null) {
       __result['allCommitCharacters'] = allCommitCharacters;
     }
+    if (completionItem != null) {
+      __result['completionItem'] = completionItem?.toJson();
+    }
+    __result['documentSelector'] = documentSelector;
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
-    if (completionItem != null) {
-      __result['completionItem'] = completionItem?.toJson();
+    if (triggerCharacters != null) {
+      __result['triggerCharacters'] = triggerCharacters;
     }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
@@ -8459,6 +7903,31 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('allCommitCharacters');
+      try {
+        final allCommitCharacters = obj['allCommitCharacters'];
+        if (allCommitCharacters != null &&
+            !((allCommitCharacters is List<Object?> &&
+                (allCommitCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('completionItem');
+      try {
+        final completionItem = obj['completionItem'];
+        if (completionItem != null &&
+            !(CompletionOptionsCompletionItem.canParse(
+                completionItem, reporter))) {
+          reporter
+              .reportError('must be of type CompletionOptionsCompletionItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -8469,32 +7938,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('triggerCharacters');
-      try {
-        final triggerCharacters = obj['triggerCharacters'];
-        if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('allCommitCharacters');
-      try {
-        final allCommitCharacters = obj['allCommitCharacters'];
-        if (allCommitCharacters != null &&
-            !((allCommitCharacters is List<Object?> &&
-                (allCommitCharacters.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -8510,14 +7955,13 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('completionItem');
+      reporter.push('triggerCharacters');
       try {
-        final completionItem = obj['completionItem'];
-        if (completionItem != null &&
-            !(CompletionOptionsCompletionItem.canParse(
-                completionItem, reporter))) {
-          reporter
-              .reportError('must be of type CompletionOptionsCompletionItem');
+        final triggerCharacters = obj['triggerCharacters'];
+        if (triggerCharacters != null &&
+            !((triggerCharacters is List<Object?> &&
+                (triggerCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -8544,14 +7988,14 @@
   bool operator ==(Object other) {
     if (other is CompletionRegistrationOptions &&
         other.runtimeType == CompletionRegistrationOptions) {
-      return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(allCommitCharacters, other.allCommitCharacters,
+              (String a, String b) => a == b) &&
+          completionItem == other.completionItem &&
+          listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          resolveProvider == other.resolveProvider &&
           listEqual(triggerCharacters, other.triggerCharacters,
               (String a, String b) => a == b) &&
-          listEqual(allCommitCharacters, other.allCommitCharacters,
-              (String a, String b) => a == b) &&
-          resolveProvider == other.resolveProvider &&
-          completionItem == other.completionItem &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -8560,11 +8004,11 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(documentSelector),
-        lspHashCode(triggerCharacters),
         lspHashCode(allCommitCharacters),
-        resolveProvider,
         completionItem,
+        lspHashCode(documentSelector),
+        resolveProvider,
+        lspHashCode(triggerCharacters),
         workDoneProgress,
       );
 
@@ -8779,31 +8223,31 @@
   );
 
   CreateFile({
-    this.kind = 'create',
-    required this.uri,
-    this.options,
     this.annotationId,
+    this.kind = 'create',
+    this.options,
+    required this.uri,
   }) {
     if (kind != 'create') {
       throw 'kind may only be the literal \'create\'';
     }
   }
   static CreateFile fromJson(Map<String, Object?> json) {
+    final annotationIdJson = json['annotationId'];
+    final annotationId = annotationIdJson as String?;
     final kindJson = json['kind'];
     final kind = kindJson as String;
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final optionsJson = json['options'];
     final options = optionsJson != null
         ? CreateFileOptions.fromJson(optionsJson as Map<String, Object?>)
         : null;
-    final annotationIdJson = json['annotationId'];
-    final annotationId = annotationIdJson as String?;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return CreateFile(
-      kind: kind,
-      uri: uri,
-      options: options,
       annotationId: annotationId,
+      kind: kind,
+      options: options,
+      uri: uri,
     );
   }
 
@@ -8822,19 +8266,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind;
-    __result['uri'] = uri;
-    if (options != null) {
-      __result['options'] = options?.toJson();
-    }
     if (annotationId != null) {
       __result['annotationId'] = annotationId;
     }
+    __result['kind'] = kind;
+    if (options != null) {
+      __result['options'] = options?.toJson();
+    }
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('annotationId');
+      try {
+        final annotationId = obj['annotationId'];
+        if (annotationId != null && !(annotationId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -8853,6 +8307,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('options');
+      try {
+        final options = obj['options'];
+        if (options != null &&
+            !(CreateFileOptions.canParse(options, reporter))) {
+          reporter.reportError('must be of type CreateFileOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -8871,27 +8336,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('options');
-      try {
-        final options = obj['options'];
-        if (options != null &&
-            !(CreateFileOptions.canParse(options, reporter))) {
-          reporter.reportError('must be of type CreateFileOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('annotationId');
-      try {
-        final annotationId = obj['annotationId'];
-        if (annotationId != null && !(annotationId is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type CreateFile');
@@ -8902,10 +8346,10 @@
   @override
   bool operator ==(Object other) {
     if (other is CreateFile && other.runtimeType == CreateFile) {
-      return kind == other.kind &&
-          uri == other.uri &&
+      return annotationId == other.annotationId &&
+          kind == other.kind &&
           options == other.options &&
-          annotationId == other.annotationId &&
+          uri == other.uri &&
           true;
     }
     return false;
@@ -8913,10 +8357,10 @@
 
   @override
   int get hashCode => Object.hash(
-        kind,
-        uri,
-        options,
         annotationId,
+        kind,
+        options,
+        uri,
       );
 
   @override
@@ -8931,17 +8375,17 @@
   );
 
   CreateFileOptions({
-    this.overwrite,
     this.ignoreIfExists,
+    this.overwrite,
   });
   static CreateFileOptions fromJson(Map<String, Object?> json) {
-    final overwriteJson = json['overwrite'];
-    final overwrite = overwriteJson as bool?;
     final ignoreIfExistsJson = json['ignoreIfExists'];
     final ignoreIfExists = ignoreIfExistsJson as bool?;
+    final overwriteJson = json['overwrite'];
+    final overwrite = overwriteJson as bool?;
     return CreateFileOptions(
-      overwrite: overwrite,
       ignoreIfExists: ignoreIfExists,
+      overwrite: overwrite,
     );
   }
 
@@ -8953,31 +8397,31 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (overwrite != null) {
-      __result['overwrite'] = overwrite;
-    }
     if (ignoreIfExists != null) {
       __result['ignoreIfExists'] = ignoreIfExists;
     }
+    if (overwrite != null) {
+      __result['overwrite'] = overwrite;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('overwrite');
+      reporter.push('ignoreIfExists');
       try {
-        final overwrite = obj['overwrite'];
-        if (overwrite != null && !(overwrite is bool)) {
+        final ignoreIfExists = obj['ignoreIfExists'];
+        if (ignoreIfExists != null && !(ignoreIfExists is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('ignoreIfExists');
+      reporter.push('overwrite');
       try {
-        final ignoreIfExists = obj['ignoreIfExists'];
-        if (ignoreIfExists != null && !(ignoreIfExists is bool)) {
+        final overwrite = obj['overwrite'];
+        if (overwrite != null && !(overwrite is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -8994,8 +8438,8 @@
   @override
   bool operator ==(Object other) {
     if (other is CreateFileOptions && other.runtimeType == CreateFileOptions) {
-      return overwrite == other.overwrite &&
-          ignoreIfExists == other.ignoreIfExists &&
+      return ignoreIfExists == other.ignoreIfExists &&
+          overwrite == other.overwrite &&
           true;
     }
     return false;
@@ -9003,8 +8447,8 @@
 
   @override
   int get hashCode => Object.hash(
-        overwrite,
         ignoreIfExists,
+        overwrite,
       );
 
   @override
@@ -9254,25 +8698,12 @@
   );
 
   DeclarationParams({
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static DeclarationParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -9281,11 +8712,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return DeclarationParams(
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -9304,32 +8748,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -9353,22 +8790,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -9385,10 +8829,10 @@
   @override
   bool operator ==(Object other) {
     if (other is DeclarationParams && other.runtimeType == DeclarationParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -9396,10 +8840,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -9418,29 +8862,30 @@
   );
 
   DeclarationRegistrationOptions({
-    this.workDoneProgress,
     this.documentSelector,
     this.id,
+    this.workDoneProgress,
   });
   static DeclarationRegistrationOptions fromJson(Map<String, Object?> json) {
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return DeclarationRegistrationOptions(
-      workDoneProgress: workDoneProgress,
       documentSelector: documentSelector,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -9449,28 +8894,18 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     __result['documentSelector'] = documentSelector;
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -9481,8 +8916,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -9498,6 +8933,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DeclarationRegistrationOptions');
@@ -9509,10 +8954,10 @@
   bool operator ==(Object other) {
     if (other is DeclarationRegistrationOptions &&
         other.runtimeType == DeclarationRegistrationOptions) {
-      return workDoneProgress == other.workDoneProgress &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -9520,9 +8965,9 @@
 
   @override
   int get hashCode => Object.hash(
-        workDoneProgress,
         lspHashCode(documentSelector),
         id,
+        workDoneProgress,
       );
 
   @override
@@ -9694,25 +9139,12 @@
   );
 
   DefinitionParams({
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static DefinitionParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -9721,11 +9153,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return DefinitionParams(
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -9744,32 +9189,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -9793,22 +9231,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -9825,10 +9270,10 @@
   @override
   bool operator ==(Object other) {
     if (other is DefinitionParams && other.runtimeType == DefinitionParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -9836,10 +9281,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -9860,7 +9305,8 @@
   static DefinitionRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -9872,7 +9318,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -9896,8 +9342,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -9925,7 +9371,7 @@
     if (other is DefinitionRegistrationOptions &&
         other.runtimeType == DefinitionRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -9950,31 +9396,31 @@
   );
 
   DeleteFile({
-    this.kind = 'delete',
-    required this.uri,
-    this.options,
     this.annotationId,
+    this.kind = 'delete',
+    this.options,
+    required this.uri,
   }) {
     if (kind != 'delete') {
       throw 'kind may only be the literal \'delete\'';
     }
   }
   static DeleteFile fromJson(Map<String, Object?> json) {
+    final annotationIdJson = json['annotationId'];
+    final annotationId = annotationIdJson as String?;
     final kindJson = json['kind'];
     final kind = kindJson as String;
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final optionsJson = json['options'];
     final options = optionsJson != null
         ? DeleteFileOptions.fromJson(optionsJson as Map<String, Object?>)
         : null;
-    final annotationIdJson = json['annotationId'];
-    final annotationId = annotationIdJson as String?;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return DeleteFile(
-      kind: kind,
-      uri: uri,
-      options: options,
       annotationId: annotationId,
+      kind: kind,
+      options: options,
+      uri: uri,
     );
   }
 
@@ -9993,19 +9439,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind;
-    __result['uri'] = uri;
-    if (options != null) {
-      __result['options'] = options?.toJson();
-    }
     if (annotationId != null) {
       __result['annotationId'] = annotationId;
     }
+    __result['kind'] = kind;
+    if (options != null) {
+      __result['options'] = options?.toJson();
+    }
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('annotationId');
+      try {
+        final annotationId = obj['annotationId'];
+        if (annotationId != null && !(annotationId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -10024,6 +9480,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('options');
+      try {
+        final options = obj['options'];
+        if (options != null &&
+            !(DeleteFileOptions.canParse(options, reporter))) {
+          reporter.reportError('must be of type DeleteFileOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -10042,27 +9509,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('options');
-      try {
-        final options = obj['options'];
-        if (options != null &&
-            !(DeleteFileOptions.canParse(options, reporter))) {
-          reporter.reportError('must be of type DeleteFileOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('annotationId');
-      try {
-        final annotationId = obj['annotationId'];
-        if (annotationId != null && !(annotationId is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DeleteFile');
@@ -10073,10 +9519,10 @@
   @override
   bool operator ==(Object other) {
     if (other is DeleteFile && other.runtimeType == DeleteFile) {
-      return kind == other.kind &&
-          uri == other.uri &&
+      return annotationId == other.annotationId &&
+          kind == other.kind &&
           options == other.options &&
-          annotationId == other.annotationId &&
+          uri == other.uri &&
           true;
     }
     return false;
@@ -10084,10 +9530,10 @@
 
   @override
   int get hashCode => Object.hash(
-        kind,
-        uri,
-        options,
         annotationId,
+        kind,
+        options,
+        uri,
       );
 
   @override
@@ -10102,17 +9548,17 @@
   );
 
   DeleteFileOptions({
-    this.recursive,
     this.ignoreIfNotExists,
+    this.recursive,
   });
   static DeleteFileOptions fromJson(Map<String, Object?> json) {
-    final recursiveJson = json['recursive'];
-    final recursive = recursiveJson as bool?;
     final ignoreIfNotExistsJson = json['ignoreIfNotExists'];
     final ignoreIfNotExists = ignoreIfNotExistsJson as bool?;
+    final recursiveJson = json['recursive'];
+    final recursive = recursiveJson as bool?;
     return DeleteFileOptions(
-      recursive: recursive,
       ignoreIfNotExists: ignoreIfNotExists,
+      recursive: recursive,
     );
   }
 
@@ -10124,31 +9570,31 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (recursive != null) {
-      __result['recursive'] = recursive;
-    }
     if (ignoreIfNotExists != null) {
       __result['ignoreIfNotExists'] = ignoreIfNotExists;
     }
+    if (recursive != null) {
+      __result['recursive'] = recursive;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('recursive');
+      reporter.push('ignoreIfNotExists');
       try {
-        final recursive = obj['recursive'];
-        if (recursive != null && !(recursive is bool)) {
+        final ignoreIfNotExists = obj['ignoreIfNotExists'];
+        if (ignoreIfNotExists != null && !(ignoreIfNotExists is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('ignoreIfNotExists');
+      reporter.push('recursive');
       try {
-        final ignoreIfNotExists = obj['ignoreIfNotExists'];
-        if (ignoreIfNotExists != null && !(ignoreIfNotExists is bool)) {
+        final recursive = obj['recursive'];
+        if (recursive != null && !(recursive is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -10165,8 +9611,8 @@
   @override
   bool operator ==(Object other) {
     if (other is DeleteFileOptions && other.runtimeType == DeleteFileOptions) {
-      return recursive == other.recursive &&
-          ignoreIfNotExists == other.ignoreIfNotExists &&
+      return ignoreIfNotExists == other.ignoreIfNotExists &&
+          recursive == other.recursive &&
           true;
     }
     return false;
@@ -10174,8 +9620,8 @@
 
   @override
   int get hashCode => Object.hash(
-        recursive,
         ignoreIfNotExists,
+        recursive,
       );
 
   @override
@@ -10265,54 +9711,54 @@
   );
 
   Diagnostic({
-    required this.range,
-    this.severity,
     this.code,
     this.codeDescription,
-    this.source,
-    required this.message,
-    this.tags,
-    this.relatedInformation,
     this.data,
+    required this.message,
+    required this.range,
+    this.relatedInformation,
+    this.severity,
+    this.source,
+    this.tags,
   });
   static Diagnostic fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
-    final severityJson = json['severity'];
-    final severity = severityJson != null
-        ? DiagnosticSeverity.fromJson(severityJson as int)
-        : null;
     final codeJson = json['code'];
     final code = codeJson as String?;
     final codeDescriptionJson = json['codeDescription'];
     final codeDescription = codeDescriptionJson != null
         ? CodeDescription.fromJson(codeDescriptionJson as Map<String, Object?>)
         : null;
-    final sourceJson = json['source'];
-    final source = sourceJson as String?;
+    final dataJson = json['data'];
+    final data = dataJson;
     final messageJson = json['message'];
     final message = messageJson as String;
-    final tagsJson = json['tags'];
-    final tags = (tagsJson as List<Object?>?)
-        ?.map((item) => DiagnosticTag.fromJson(item as int))
-        .toList();
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final relatedInformationJson = json['relatedInformation'];
     final relatedInformation = (relatedInformationJson as List<Object?>?)
         ?.map((item) =>
             DiagnosticRelatedInformation.fromJson(item as Map<String, Object?>))
         .toList();
-    final dataJson = json['data'];
-    final data = dataJson;
+    final severityJson = json['severity'];
+    final severity = severityJson != null
+        ? DiagnosticSeverity.fromJson(severityJson as int)
+        : null;
+    final sourceJson = json['source'];
+    final source = sourceJson as String?;
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => DiagnosticTag.fromJson(item as int))
+        .toList();
     return Diagnostic(
-      range: range,
-      severity: severity,
       code: code,
       codeDescription: codeDescription,
-      source: source,
-      message: message,
-      tags: tags,
-      relatedInformation: relatedInformation,
       data: data,
+      message: message,
+      range: range,
+      relatedInformation: relatedInformation,
+      severity: severity,
+      source: source,
+      tags: tags,
     );
   }
 
@@ -10353,64 +9799,35 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
-    if (severity != null) {
-      __result['severity'] = severity?.toJson();
-    }
     if (code != null) {
       __result['code'] = code;
     }
     if (codeDescription != null) {
       __result['codeDescription'] = codeDescription?.toJson();
     }
-    if (source != null) {
-      __result['source'] = source;
+    if (data != null) {
+      __result['data'] = data;
     }
     __result['message'] = message;
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
-    }
+    __result['range'] = range.toJson();
     if (relatedInformation != null) {
       __result['relatedInformation'] =
           relatedInformation?.map((item) => item.toJson()).toList();
     }
-    if (data != null) {
-      __result['data'] = data;
+    if (severity != null) {
+      __result['severity'] = severity?.toJson();
+    }
+    if (source != null) {
+      __result['source'] = source;
+    }
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
-      try {
-        if (!obj.containsKey('range')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final range = obj['range'];
-        if (range == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('severity');
-      try {
-        final severity = obj['severity'];
-        if (severity != null &&
-            !(DiagnosticSeverity.canParse(severity, reporter))) {
-          reporter.reportError('must be of type DiagnosticSeverity');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('code');
       try {
         final code = obj['code'];
@@ -10432,16 +9849,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('source');
-      try {
-        final source = obj['source'];
-        if (source != null && !(source is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
@@ -10460,14 +9867,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
+      reporter.push('range');
       try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every(
-                    (item) => DiagnosticTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DiagnosticTag>');
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
           return false;
         }
       } finally {
@@ -10487,6 +9899,40 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('severity');
+      try {
+        final severity = obj['severity'];
+        if (severity != null &&
+            !(DiagnosticSeverity.canParse(severity, reporter))) {
+          reporter.reportError('must be of type DiagnosticSeverity');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('source');
+      try {
+        final source = obj['source'];
+        if (source != null && !(source is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every(
+                    (item) => DiagnosticTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DiagnosticTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type Diagnostic');
@@ -10497,21 +9943,21 @@
   @override
   bool operator ==(Object other) {
     if (other is Diagnostic && other.runtimeType == Diagnostic) {
-      return range == other.range &&
-          severity == other.severity &&
-          code == other.code &&
+      return code == other.code &&
           codeDescription == other.codeDescription &&
-          source == other.source &&
+          data == other.data &&
           message == other.message &&
-          listEqual(
-              tags, other.tags, (DiagnosticTag a, DiagnosticTag b) => a == b) &&
+          range == other.range &&
           listEqual(
               relatedInformation,
               other.relatedInformation,
               (DiagnosticRelatedInformation a,
                       DiagnosticRelatedInformation b) =>
                   a == b) &&
-          data == other.data &&
+          severity == other.severity &&
+          source == other.source &&
+          listEqual(
+              tags, other.tags, (DiagnosticTag a, DiagnosticTag b) => a == b) &&
           true;
     }
     return false;
@@ -10519,15 +9965,15 @@
 
   @override
   int get hashCode => Object.hash(
-        range,
-        severity,
         code,
         codeDescription,
-        source,
-        message,
-        lspHashCode(tags),
-        lspHashCode(relatedInformation),
         data,
+        message,
+        range,
+        lspHashCode(relatedInformation),
+        severity,
+        source,
+        lspHashCode(tags),
       );
 
   @override
@@ -10640,8 +10086,8 @@
   DiagnosticOptions({
     this.identifier,
     required this.interFileDependencies,
-    required this.workspaceDiagnostics,
     this.workDoneProgress,
+    required this.workspaceDiagnostics,
   });
   static DiagnosticOptions fromJson(Map<String, Object?> json) {
     if (DiagnosticRegistrationOptions.canParse(json, nullLspJsonReporter)) {
@@ -10651,15 +10097,15 @@
     final identifier = identifierJson as String?;
     final interFileDependenciesJson = json['interFileDependencies'];
     final interFileDependencies = interFileDependenciesJson as bool;
-    final workspaceDiagnosticsJson = json['workspaceDiagnostics'];
-    final workspaceDiagnostics = workspaceDiagnosticsJson as bool;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
+    final workspaceDiagnosticsJson = json['workspaceDiagnostics'];
+    final workspaceDiagnostics = workspaceDiagnosticsJson as bool;
     return DiagnosticOptions(
       identifier: identifier,
       interFileDependencies: interFileDependencies,
-      workspaceDiagnostics: workspaceDiagnostics,
       workDoneProgress: workDoneProgress,
+      workspaceDiagnostics: workspaceDiagnostics,
     );
   }
 
@@ -10683,10 +10129,10 @@
       __result['identifier'] = identifier;
     }
     __result['interFileDependencies'] = interFileDependencies;
-    __result['workspaceDiagnostics'] = workspaceDiagnostics;
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
+    __result['workspaceDiagnostics'] = workspaceDiagnostics;
     return __result;
   }
 
@@ -10720,6 +10166,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workspaceDiagnostics');
       try {
         if (!obj.containsKey('workspaceDiagnostics')) {
@@ -10738,16 +10194,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DiagnosticOptions');
@@ -10760,8 +10206,8 @@
     if (other is DiagnosticOptions && other.runtimeType == DiagnosticOptions) {
       return identifier == other.identifier &&
           interFileDependencies == other.interFileDependencies &&
-          workspaceDiagnostics == other.workspaceDiagnostics &&
           workDoneProgress == other.workDoneProgress &&
+          workspaceDiagnostics == other.workspaceDiagnostics &&
           true;
     }
     return false;
@@ -10771,8 +10217,8 @@
   int get hashCode => Object.hash(
         identifier,
         interFileDependencies,
-        workspaceDiagnostics,
         workDoneProgress,
+        workspaceDiagnostics,
       );
 
   @override
@@ -10794,40 +10240,41 @@
 
   DiagnosticRegistrationOptions({
     this.documentSelector,
+    this.id,
     this.identifier,
     required this.interFileDependencies,
-    required this.workspaceDiagnostics,
     this.workDoneProgress,
-    this.id,
+    required this.workspaceDiagnostics,
   });
   static DiagnosticRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
+    final idJson = json['id'];
+    final id = idJson as String?;
     final identifierJson = json['identifier'];
     final identifier = identifierJson as String?;
     final interFileDependenciesJson = json['interFileDependencies'];
     final interFileDependencies = interFileDependenciesJson as bool;
-    final workspaceDiagnosticsJson = json['workspaceDiagnostics'];
-    final workspaceDiagnostics = workspaceDiagnosticsJson as bool;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
-    final idJson = json['id'];
-    final id = idJson as String?;
+    final workspaceDiagnosticsJson = json['workspaceDiagnostics'];
+    final workspaceDiagnostics = workspaceDiagnosticsJson as bool;
     return DiagnosticRegistrationOptions(
       documentSelector: documentSelector,
+      id: id,
       identifier: identifier,
       interFileDependencies: interFileDependencies,
-      workspaceDiagnostics: workspaceDiagnostics,
       workDoneProgress: workDoneProgress,
-      id: id,
+      workspaceDiagnostics: workspaceDiagnostics,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -10850,17 +10297,17 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
+    if (id != null) {
+      __result['id'] = id;
+    }
     if (identifier != null) {
       __result['identifier'] = identifier;
     }
     __result['interFileDependencies'] = interFileDependencies;
-    __result['workspaceDiagnostics'] = workspaceDiagnostics;
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
-    if (id != null) {
-      __result['id'] = id;
-    }
+    __result['workspaceDiagnostics'] = workspaceDiagnostics;
     return __result;
   }
 
@@ -10876,8 +10323,18 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -10911,6 +10368,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workspaceDiagnostics');
       try {
         if (!obj.containsKey('workspaceDiagnostics')) {
@@ -10929,26 +10396,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('id');
-      try {
-        final id = obj['id'];
-        if (id != null && !(id is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DiagnosticRegistrationOptions');
@@ -10961,12 +10408,12 @@
     if (other is DiagnosticRegistrationOptions &&
         other.runtimeType == DiagnosticRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          id == other.id &&
           identifier == other.identifier &&
           interFileDependencies == other.interFileDependencies &&
-          workspaceDiagnostics == other.workspaceDiagnostics &&
           workDoneProgress == other.workDoneProgress &&
-          id == other.id &&
+          workspaceDiagnostics == other.workspaceDiagnostics &&
           true;
     }
     return false;
@@ -10975,11 +10422,11 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
+        id,
         identifier,
         interFileDependencies,
-        workspaceDiagnostics,
         workDoneProgress,
-        id,
+        workspaceDiagnostics,
       );
 
   @override
@@ -11422,19 +10869,19 @@
   );
 
   DidChangeNotebookDocumentParams({
-    required this.notebookDocument,
     required this.change,
+    required this.notebookDocument,
   });
   static DidChangeNotebookDocumentParams fromJson(Map<String, Object?> json) {
-    final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument = VersionedNotebookDocumentIdentifier.fromJson(
-        notebookDocumentJson as Map<String, Object?>);
     final changeJson = json['change'];
     final change = NotebookDocumentChangeEvent.fromJson(
         changeJson as Map<String, Object?>);
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = VersionedNotebookDocumentIdentifier.fromJson(
+        notebookDocumentJson as Map<String, Object?>);
     return DidChangeNotebookDocumentParams(
-      notebookDocument: notebookDocument,
       change: change,
+      notebookDocument: notebookDocument,
     );
   }
 
@@ -11457,13 +10904,31 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['notebookDocument'] = notebookDocument.toJson();
     __result['change'] = change.toJson();
+    __result['notebookDocument'] = notebookDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('change');
+      try {
+        if (!obj.containsKey('change')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final change = obj['change'];
+        if (change == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocumentChangeEvent.canParse(change, reporter))) {
+          reporter.reportError('must be of type NotebookDocumentChangeEvent');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('notebookDocument');
       try {
         if (!obj.containsKey('notebookDocument')) {
@@ -11484,24 +10949,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('change');
-      try {
-        if (!obj.containsKey('change')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final change = obj['change'];
-        if (change == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(NotebookDocumentChangeEvent.canParse(change, reporter))) {
-          reporter.reportError('must be of type NotebookDocumentChangeEvent');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DidChangeNotebookDocumentParams');
@@ -11513,8 +10960,8 @@
   bool operator ==(Object other) {
     if (other is DidChangeNotebookDocumentParams &&
         other.runtimeType == DidChangeNotebookDocumentParams) {
-      return notebookDocument == other.notebookDocument &&
-          change == other.change &&
+      return change == other.change &&
+          notebookDocument == other.notebookDocument &&
           true;
     }
     return false;
@@ -11522,8 +10969,8 @@
 
   @override
   int get hashCode => Object.hash(
-        notebookDocument,
         change,
+        notebookDocument,
       );
 
   @override
@@ -11537,13 +10984,10 @@
   );
 
   DidChangeTextDocumentParams({
-    required this.textDocument,
     required this.contentChanges,
+    required this.textDocument,
   });
   static DidChangeTextDocumentParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = VersionedTextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
     final contentChangesJson = json['contentChanges'];
     final contentChanges = (contentChangesJson as List<Object?>)
         .map((item) => TextDocumentContentChangeEvent1.canParse(
@@ -11557,9 +11001,12 @@
                     TextDocumentContentChangeEvent2.fromJson(item as Map<String, Object?>))
                 : (throw '''$item was not one of (TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2)''')))
         .toList();
+    final textDocumentJson = json['textDocument'];
+    final textDocument = VersionedTextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
     return DidChangeTextDocumentParams(
-      textDocument: textDocument,
       contentChanges: contentChanges,
+      textDocument: textDocument,
     );
   }
 
@@ -11586,33 +11033,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['contentChanges'] = contentChanges;
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(VersionedTextDocumentIdentifier.canParse(
-            textDocument, reporter))) {
-          reporter
-              .reportError('must be of type VersionedTextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('contentChanges');
       try {
         if (!obj.containsKey('contentChanges')) {
@@ -11636,6 +11063,26 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(VersionedTextDocumentIdentifier.canParse(
+            textDocument, reporter))) {
+          reporter
+              .reportError('must be of type VersionedTextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DidChangeTextDocumentParams');
@@ -11647,8 +11094,7 @@
   bool operator ==(Object other) {
     if (other is DidChangeTextDocumentParams &&
         other.runtimeType == DidChangeTextDocumentParams) {
-      return textDocument == other.textDocument &&
-          listEqual(
+      return listEqual(
               contentChanges,
               other.contentChanges,
               (Either2<TextDocumentContentChangeEvent1,
@@ -11658,6 +11104,7 @@
                               TextDocumentContentChangeEvent2>
                           b) =>
                   a == b) &&
+          textDocument == other.textDocument &&
           true;
     }
     return false;
@@ -11665,8 +11112,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         lspHashCode(contentChanges),
+        textDocument,
       );
 
   @override
@@ -11998,21 +11445,21 @@
   );
 
   DidCloseNotebookDocumentParams({
-    required this.notebookDocument,
     required this.cellTextDocuments,
+    required this.notebookDocument,
   });
   static DidCloseNotebookDocumentParams fromJson(Map<String, Object?> json) {
-    final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument = NotebookDocumentIdentifier.fromJson(
-        notebookDocumentJson as Map<String, Object?>);
     final cellTextDocumentsJson = json['cellTextDocuments'];
     final cellTextDocuments = (cellTextDocumentsJson as List<Object?>)
         .map((item) =>
             TextDocumentIdentifier.fromJson(item as Map<String, Object?>))
         .toList();
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = NotebookDocumentIdentifier.fromJson(
+        notebookDocumentJson as Map<String, Object?>);
     return DidCloseNotebookDocumentParams(
-      notebookDocument: notebookDocument,
       cellTextDocuments: cellTextDocuments,
+      notebookDocument: notebookDocument,
     );
   }
 
@@ -12025,33 +11472,14 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['notebookDocument'] = notebookDocument.toJson();
     __result['cellTextDocuments'] =
         cellTextDocuments.map((item) => item.toJson()).toList();
+    __result['notebookDocument'] = notebookDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('notebookDocument');
-      try {
-        if (!obj.containsKey('notebookDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final notebookDocument = obj['notebookDocument'];
-        if (notebookDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(NotebookDocumentIdentifier.canParse(
-            notebookDocument, reporter))) {
-          reporter.reportError('must be of type NotebookDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('cellTextDocuments');
       try {
         if (!obj.containsKey('cellTextDocuments')) {
@@ -12072,6 +11500,25 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('notebookDocument');
+      try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocumentIdentifier.canParse(
+            notebookDocument, reporter))) {
+          reporter.reportError('must be of type NotebookDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DidCloseNotebookDocumentParams');
@@ -12083,9 +11530,9 @@
   bool operator ==(Object other) {
     if (other is DidCloseNotebookDocumentParams &&
         other.runtimeType == DidCloseNotebookDocumentParams) {
-      return notebookDocument == other.notebookDocument &&
-          listEqual(cellTextDocuments, other.cellTextDocuments,
+      return listEqual(cellTextDocuments, other.cellTextDocuments,
               (TextDocumentIdentifier a, TextDocumentIdentifier b) => a == b) &&
+          notebookDocument == other.notebookDocument &&
           true;
     }
     return false;
@@ -12093,8 +11540,8 @@
 
   @override
   int get hashCode => Object.hash(
-        notebookDocument,
         lspHashCode(cellTextDocuments),
+        notebookDocument,
       );
 
   @override
@@ -12180,20 +11627,20 @@
   );
 
   DidOpenNotebookDocumentParams({
-    required this.notebookDocument,
     required this.cellTextDocuments,
+    required this.notebookDocument,
   });
   static DidOpenNotebookDocumentParams fromJson(Map<String, Object?> json) {
-    final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument =
-        NotebookDocument.fromJson(notebookDocumentJson as Map<String, Object?>);
     final cellTextDocumentsJson = json['cellTextDocuments'];
     final cellTextDocuments = (cellTextDocumentsJson as List<Object?>)
         .map((item) => TextDocumentItem.fromJson(item as Map<String, Object?>))
         .toList();
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument =
+        NotebookDocument.fromJson(notebookDocumentJson as Map<String, Object?>);
     return DidOpenNotebookDocumentParams(
-      notebookDocument: notebookDocument,
       cellTextDocuments: cellTextDocuments,
+      notebookDocument: notebookDocument,
     );
   }
 
@@ -12205,32 +11652,14 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['notebookDocument'] = notebookDocument.toJson();
     __result['cellTextDocuments'] =
         cellTextDocuments.map((item) => item.toJson()).toList();
+    __result['notebookDocument'] = notebookDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('notebookDocument');
-      try {
-        if (!obj.containsKey('notebookDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final notebookDocument = obj['notebookDocument'];
-        if (notebookDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(NotebookDocument.canParse(notebookDocument, reporter))) {
-          reporter.reportError('must be of type NotebookDocument');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('cellTextDocuments');
       try {
         if (!obj.containsKey('cellTextDocuments')) {
@@ -12251,6 +11680,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('notebookDocument');
+      try {
+        if (!obj.containsKey('notebookDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookDocument.canParse(notebookDocument, reporter))) {
+          reporter.reportError('must be of type NotebookDocument');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DidOpenNotebookDocumentParams');
@@ -12262,9 +11709,9 @@
   bool operator ==(Object other) {
     if (other is DidOpenNotebookDocumentParams &&
         other.runtimeType == DidOpenNotebookDocumentParams) {
-      return notebookDocument == other.notebookDocument &&
-          listEqual(cellTextDocuments, other.cellTextDocuments,
+      return listEqual(cellTextDocuments, other.cellTextDocuments,
               (TextDocumentItem a, TextDocumentItem b) => a == b) &&
+          notebookDocument == other.notebookDocument &&
           true;
     }
     return false;
@@ -12272,8 +11719,8 @@
 
   @override
   int get hashCode => Object.hash(
-        notebookDocument,
         lspHashCode(cellTextDocuments),
+        notebookDocument,
       );
 
   @override
@@ -12430,18 +11877,18 @@
   );
 
   DidSaveTextDocumentParams({
-    required this.textDocument,
     this.text,
+    required this.textDocument,
   });
   static DidSaveTextDocumentParams fromJson(Map<String, Object?> json) {
+    final textJson = json['text'];
+    final text = textJson as String?;
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final textJson = json['text'];
-    final text = textJson as String?;
     return DidSaveTextDocumentParams(
-      textDocument: textDocument,
       text: text,
+      textDocument: textDocument,
     );
   }
 
@@ -12454,15 +11901,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     if (text != null) {
       __result['text'] = text;
     }
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('text');
+      try {
+        final text = obj['text'];
+        if (text != null && !(text is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -12481,16 +11938,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('text');
-      try {
-        final text = obj['text'];
-        if (text != null && !(text is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DidSaveTextDocumentParams');
@@ -12502,15 +11949,15 @@
   bool operator ==(Object other) {
     if (other is DidSaveTextDocumentParams &&
         other.runtimeType == DidSaveTextDocumentParams) {
-      return textDocument == other.textDocument && text == other.text && true;
+      return text == other.text && textDocument == other.textDocument && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         text,
+        textDocument,
       );
 
   @override
@@ -12653,11 +12100,19 @@
   );
 
   DocumentColorParams({
+    this.partialResultToken,
     required this.textDocument,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static DocumentColorParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -12669,18 +12124,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return DocumentColorParams(
+      partialResultToken: partialResultToken,
       textDocument: textDocument,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -12696,18 +12143,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -12737,17 +12195,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentColorParams');
@@ -12759,9 +12206,9 @@
   bool operator ==(Object other) {
     if (other is DocumentColorParams &&
         other.runtimeType == DocumentColorParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -12769,9 +12216,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         textDocument,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -12797,7 +12244,8 @@
   static DocumentColorRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
@@ -12812,7 +12260,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -12843,8 +12291,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -12882,7 +12330,7 @@
     if (other is DocumentColorRegistrationOptions &&
         other.runtimeType == DocumentColorRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -12911,28 +12359,15 @@
   );
 
   DocumentDiagnosticParams({
-    required this.textDocument,
     this.identifier,
-    this.previousResultId,
-    this.workDoneToken,
     this.partialResultToken,
+    this.previousResultId,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static DocumentDiagnosticParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
     final identifierJson = json['identifier'];
     final identifier = identifierJson as String?;
-    final previousResultIdJson = json['previousResultId'];
-    final previousResultId = previousResultIdJson as String?;
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -12941,12 +12376,25 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final previousResultIdJson = json['previousResultId'];
+    final previousResultId = previousResultIdJson as String?;
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return DocumentDiagnosticParams(
-      textDocument: textDocument,
       identifier: identifier,
-      previousResultId: previousResultId,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      previousResultId: previousResultId,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -12968,24 +12416,55 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     if (identifier != null) {
       __result['identifier'] = identifier;
     }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     if (previousResultId != null) {
       __result['previousResultId'] = previousResultId;
     }
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('identifier');
+      try {
+        final identifier = obj['identifier'];
+        if (identifier != null && !(identifier is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('previousResultId');
+      try {
+        final previousResultId = obj['previousResultId'];
+        if (previousResultId != null && !(previousResultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -13004,26 +12483,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('identifier');
-      try {
-        final identifier = obj['identifier'];
-        if (identifier != null && !(identifier is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('previousResultId');
-      try {
-        final previousResultId = obj['previousResultId'];
-        if (previousResultId != null && !(previousResultId is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -13035,17 +12494,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentDiagnosticParams');
@@ -13057,11 +12505,11 @@
   bool operator ==(Object other) {
     if (other is DocumentDiagnosticParams &&
         other.runtimeType == DocumentDiagnosticParams) {
-      return textDocument == other.textDocument &&
-          identifier == other.identifier &&
-          previousResultId == other.previousResultId &&
-          workDoneToken == other.workDoneToken &&
+      return identifier == other.identifier &&
           partialResultToken == other.partialResultToken &&
+          previousResultId == other.previousResultId &&
+          textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -13069,11 +12517,11 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         identifier,
-        previousResultId,
-        workDoneToken,
         partialResultToken,
+        previousResultId,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -13214,127 +12662,6 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentFilter implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-    DocumentFilter.canParse,
-    DocumentFilter.fromJson,
-  );
-
-  DocumentFilter({
-    this.language,
-    this.scheme,
-    this.pattern,
-  });
-  static DocumentFilter fromJson(Map<String, Object?> json) {
-    final languageJson = json['language'];
-    final language = languageJson as String?;
-    final schemeJson = json['scheme'];
-    final scheme = schemeJson as String?;
-    final patternJson = json['pattern'];
-    final pattern = patternJson as String?;
-    return DocumentFilter(
-      language: language,
-      scheme: scheme,
-      pattern: pattern,
-    );
-  }
-
-  /// A language id, like `typescript`.
-  final String? language;
-
-  /// A glob pattern, like `*.{ts,js}`.
-  ///
-  /// Glob patterns can have the following syntax:
-  /// - `*` to match one or more characters in a path segment
-  /// - `?` to match on one character in a path segment
-  /// - `**` to match any number of path segments, including none
-  /// - `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}`
-  ///   matches all TypeScript and JavaScript files)
-  /// - `[]` to declare a range of characters to match in a path segment
-  ///   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
-  /// - `[!...]` to negate a range of characters to match in a path segment
-  ///   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
-  ///   not `example.0`)
-  final String? pattern;
-
-  /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
-  final String? scheme;
-
-  Map<String, Object?> toJson() {
-    var __result = <String, Object?>{};
-    if (language != null) {
-      __result['language'] = language;
-    }
-    if (scheme != null) {
-      __result['scheme'] = scheme;
-    }
-    if (pattern != null) {
-      __result['pattern'] = pattern;
-    }
-    return __result;
-  }
-
-  static bool canParse(Object? obj, LspJsonReporter reporter) {
-    if (obj is Map<String, Object?>) {
-      reporter.push('language');
-      try {
-        final language = obj['language'];
-        if (language != null && !(language is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('scheme');
-      try {
-        final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('pattern');
-      try {
-        final pattern = obj['pattern'];
-        if (pattern != null && !(pattern is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      return true;
-    } else {
-      reporter.reportError('must be of type DocumentFilter');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is DocumentFilter && other.runtimeType == DocumentFilter) {
-      return language == other.language &&
-          scheme == other.scheme &&
-          pattern == other.pattern &&
-          true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode => Object.hash(
-        language,
-        scheme,
-        pattern,
-      );
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
 class DocumentFormattingClientCapabilities implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
     DocumentFormattingClientCapabilities.canParse,
@@ -13473,17 +12800,17 @@
   );
 
   DocumentFormattingParams({
-    required this.textDocument,
     required this.options,
+    required this.textDocument,
     this.workDoneToken,
   });
   static DocumentFormattingParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
     final optionsJson = json['options'];
     final options =
         FormattingOptions.fromJson(optionsJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -13493,8 +12820,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return DocumentFormattingParams(
-      textDocument: textDocument,
       options: options,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -13510,8 +12837,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['options'] = options.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -13520,24 +12847,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('options');
       try {
         if (!obj.containsKey('options')) {
@@ -13556,6 +12865,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -13578,8 +12905,8 @@
   bool operator ==(Object other) {
     if (other is DocumentFormattingParams &&
         other.runtimeType == DocumentFormattingParams) {
-      return textDocument == other.textDocument &&
-          options == other.options &&
+      return options == other.options &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -13588,8 +12915,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         options,
+        textDocument,
         workDoneToken,
       );
 
@@ -13615,7 +12942,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -13627,7 +12955,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -13651,8 +12979,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -13681,7 +13009,7 @@
     if (other is DocumentFormattingRegistrationOptions &&
         other.runtimeType == DocumentFormattingRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -13708,19 +13036,19 @@
   );
 
   DocumentHighlight({
-    required this.range,
     this.kind,
+    required this.range,
   });
   static DocumentHighlight fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final kindJson = json['kind'];
     final kind = kindJson != null
         ? DocumentHighlightKind.fromJson(kindJson as int)
         : null;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return DocumentHighlight(
-      range: range,
       kind: kind,
+      range: range,
     );
   }
 
@@ -13732,15 +13060,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     if (kind != null) {
       __result['kind'] = kind?.toJson();
     }
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('kind');
+      try {
+        final kind = obj['kind'];
+        if (kind != null && !(DocumentHighlightKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type DocumentHighlightKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -13759,16 +13097,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('kind');
-      try {
-        final kind = obj['kind'];
-        if (kind != null && !(DocumentHighlightKind.canParse(kind, reporter))) {
-          reporter.reportError('must be of type DocumentHighlightKind');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentHighlight');
@@ -13779,15 +13107,15 @@
   @override
   bool operator ==(Object other) {
     if (other is DocumentHighlight && other.runtimeType == DocumentHighlight) {
-      return range == other.range && kind == other.kind && true;
+      return kind == other.kind && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         kind,
+        range,
       );
 
   @override
@@ -13969,25 +13297,12 @@
   );
 
   DocumentHighlightParams({
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static DocumentHighlightParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -13996,11 +13311,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return DocumentHighlightParams(
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -14019,32 +13347,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -14068,22 +13389,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -14101,10 +13429,10 @@
   bool operator ==(Object other) {
     if (other is DocumentHighlightParams &&
         other.runtimeType == DocumentHighlightParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -14112,10 +13440,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -14140,7 +13468,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -14152,7 +13481,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -14176,8 +13505,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -14206,7 +13535,7 @@
     if (other is DocumentHighlightRegistrationOptions &&
         other.runtimeType == DocumentHighlightRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -14232,25 +13561,25 @@
   );
 
   DocumentLink({
+    this.data,
     required this.range,
     this.target,
     this.tooltip,
-    this.data,
   });
   static DocumentLink fromJson(Map<String, Object?> json) {
+    final dataJson = json['data'];
+    final data = dataJson;
     final rangeJson = json['range'];
     final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final targetJson = json['target'];
     final target = targetJson as String?;
     final tooltipJson = json['tooltip'];
     final tooltip = tooltipJson as String?;
-    final dataJson = json['data'];
-    final data = dataJson;
     return DocumentLink(
+      data: data,
       range: range,
       target: target,
       tooltip: tooltip,
-      data: data,
     );
   }
 
@@ -14275,6 +13604,9 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (data != null) {
+      __result['data'] = data;
+    }
     __result['range'] = range.toJson();
     if (target != null) {
       __result['target'] = target;
@@ -14282,9 +13614,6 @@
     if (tooltip != null) {
       __result['tooltip'] = tooltip;
     }
-    if (data != null) {
-      __result['data'] = data;
-    }
     return __result;
   }
 
@@ -14338,10 +13667,10 @@
   @override
   bool operator ==(Object other) {
     if (other is DocumentLink && other.runtimeType == DocumentLink) {
-      return range == other.range &&
+      return data == other.data &&
+          range == other.range &&
           target == other.target &&
           tooltip == other.tooltip &&
-          data == other.data &&
           true;
     }
     return false;
@@ -14349,10 +13678,10 @@
 
   @override
   int get hashCode => Object.hash(
+        data,
         range,
         target,
         tooltip,
-        data,
       );
 
   @override
@@ -14545,11 +13874,19 @@
   );
 
   DocumentLinkParams({
+    this.partialResultToken,
     required this.textDocument,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static DocumentLinkParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -14561,18 +13898,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return DocumentLinkParams(
+      partialResultToken: partialResultToken,
       textDocument: textDocument,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -14588,18 +13917,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -14629,17 +13969,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentLinkParams');
@@ -14651,9 +13980,9 @@
   bool operator ==(Object other) {
     if (other is DocumentLinkParams &&
         other.runtimeType == DocumentLinkParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -14661,9 +13990,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         textDocument,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -14688,7 +14017,8 @@
   static DocumentLinkRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
@@ -14703,7 +14033,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// Document links have a resolve provider as well.
   final bool? resolveProvider;
@@ -14733,8 +14063,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -14772,7 +14102,7 @@
     if (other is DocumentLinkRegistrationOptions &&
         other.runtimeType == DocumentLinkRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           resolveProvider == other.resolveProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -14966,27 +14296,27 @@
   );
 
   DocumentOnTypeFormattingParams({
-    required this.textDocument,
-    required this.position,
     required this.ch,
     required this.options,
+    required this.position,
+    required this.textDocument,
   });
   static DocumentOnTypeFormattingParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final chJson = json['ch'];
     final ch = chJson as String;
     final optionsJson = json['options'];
     final options =
         FormattingOptions.fromJson(optionsJson as Map<String, Object?>);
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
     return DocumentOnTypeFormattingParams(
-      textDocument: textDocument,
-      position: position,
       ch: ch,
       options: options,
+      position: position,
+      textDocument: textDocument,
     );
   }
 
@@ -15009,51 +14339,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
     __result['ch'] = ch;
     __result['options'] = options.toJson();
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('position');
-      try {
-        if (!obj.containsKey('position')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final position = obj['position'];
-        if (position == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Position.canParse(position, reporter))) {
-          reporter.reportError('must be of type Position');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('ch');
       try {
         if (!obj.containsKey('ch')) {
@@ -15090,6 +14384,42 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('position');
+      try {
+        if (!obj.containsKey('position')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final position = obj['position'];
+        if (position == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(position, reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentOnTypeFormattingParams');
@@ -15101,10 +14431,10 @@
   bool operator ==(Object other) {
     if (other is DocumentOnTypeFormattingParams &&
         other.runtimeType == DocumentOnTypeFormattingParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
-          ch == other.ch &&
+      return ch == other.ch &&
           options == other.options &&
+          position == other.position &&
+          textDocument == other.textDocument &&
           true;
     }
     return false;
@@ -15112,10 +14442,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
         ch,
         options,
+        position,
+        textDocument,
       );
 
   @override
@@ -15141,7 +14471,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final firstTriggerCharacterJson = json['firstTriggerCharacter'];
     final firstTriggerCharacter = firstTriggerCharacterJson as String;
@@ -15158,7 +14489,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// A character on which formatting should be triggered, like `{`.
   final String firstTriggerCharacter;
@@ -15188,8 +14519,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -15238,7 +14569,7 @@
     if (other is DocumentOnTypeFormattingRegistrationOptions &&
         other.runtimeType == DocumentOnTypeFormattingRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           firstTriggerCharacter == other.firstTriggerCharacter &&
           listEqual(moreTriggerCharacter, other.moreTriggerCharacter,
               (String a, String b) => a == b) &&
@@ -15398,20 +14729,20 @@
   );
 
   DocumentRangeFormattingParams({
-    required this.textDocument,
-    required this.range,
     required this.options,
+    required this.range,
+    required this.textDocument,
     this.workDoneToken,
   });
   static DocumentRangeFormattingParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final optionsJson = json['options'];
     final options =
         FormattingOptions.fromJson(optionsJson as Map<String, Object?>);
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -15421,9 +14752,9 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return DocumentRangeFormattingParams(
-      textDocument: textDocument,
-      range: range,
       options: options,
+      range: range,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -15442,9 +14773,9 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['range'] = range.toJson();
     __result['options'] = options.toJson();
+    __result['range'] = range.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -15453,19 +14784,19 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('options');
       try {
-        if (!obj.containsKey('textDocument')) {
+        if (!obj.containsKey('options')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
+        final options = obj['options'];
+        if (options == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        if (!(FormattingOptions.canParse(options, reporter))) {
+          reporter.reportError('must be of type FormattingOptions');
           return false;
         }
       } finally {
@@ -15489,19 +14820,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('options');
+      reporter.push('textDocument');
       try {
-        if (!obj.containsKey('options')) {
+        if (!obj.containsKey('textDocument')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final options = obj['options'];
-        if (options == null) {
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(FormattingOptions.canParse(options, reporter))) {
-          reporter.reportError('must be of type FormattingOptions');
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -15529,9 +14860,9 @@
   bool operator ==(Object other) {
     if (other is DocumentRangeFormattingParams &&
         other.runtimeType == DocumentRangeFormattingParams) {
-      return textDocument == other.textDocument &&
+      return options == other.options &&
           range == other.range &&
-          options == other.options &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -15540,9 +14871,9 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        range,
         options,
+        range,
+        textDocument,
         workDoneToken,
       );
 
@@ -15568,7 +14899,8 @@
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -15580,7 +14912,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -15604,8 +14936,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -15634,7 +14966,7 @@
     if (other is DocumentRangeFormattingRegistrationOptions &&
         other.runtimeType == DocumentRangeFormattingRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -15662,46 +14994,46 @@
   );
 
   DocumentSymbol({
-    required this.name,
+    this.children,
+    this.deprecated,
     this.detail,
     required this.kind,
-    this.tags,
-    this.deprecated,
+    required this.name,
     required this.range,
     required this.selectionRange,
-    this.children,
+    this.tags,
   });
   static DocumentSymbol fromJson(Map<String, Object?> json) {
-    final nameJson = json['name'];
-    final name = nameJson as String;
+    final childrenJson = json['children'];
+    final children = (childrenJson as List<Object?>?)
+        ?.map((item) => DocumentSymbol.fromJson(item as Map<String, Object?>))
+        .toList();
+    final deprecatedJson = json['deprecated'];
+    final deprecated = deprecatedJson as bool?;
     final detailJson = json['detail'];
     final detail = detailJson as String?;
     final kindJson = json['kind'];
     final kind = SymbolKind.fromJson(kindJson as int);
-    final tagsJson = json['tags'];
-    final tags = (tagsJson as List<Object?>?)
-        ?.map((item) => SymbolTag.fromJson(item as int))
-        .toList();
-    final deprecatedJson = json['deprecated'];
-    final deprecated = deprecatedJson as bool?;
+    final nameJson = json['name'];
+    final name = nameJson as String;
     final rangeJson = json['range'];
     final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final selectionRangeJson = json['selectionRange'];
     final selectionRange =
         Range.fromJson(selectionRangeJson as Map<String, Object?>);
-    final childrenJson = json['children'];
-    final children = (childrenJson as List<Object?>?)
-        ?.map((item) => DocumentSymbol.fromJson(item as Map<String, Object?>))
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => SymbolTag.fromJson(item as int))
         .toList();
     return DocumentSymbol(
-      name: name,
+      children: children,
+      deprecated: deprecated,
       detail: detail,
       kind: kind,
-      tags: tags,
-      deprecated: deprecated,
+      name: name,
       range: range,
       selectionRange: selectionRange,
-      children: children,
+      tags: tags,
     );
   }
 
@@ -15739,40 +15071,45 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['name'] = name;
-    if (detail != null) {
-      __result['detail'] = detail;
-    }
-    __result['kind'] = kind.toJson();
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    if (children != null) {
+      __result['children'] = children?.map((item) => item.toJson()).toList();
     }
     if (deprecated != null) {
       __result['deprecated'] = deprecated;
     }
+    if (detail != null) {
+      __result['detail'] = detail;
+    }
+    __result['kind'] = kind.toJson();
+    __result['name'] = name;
     __result['range'] = range.toJson();
     __result['selectionRange'] = selectionRange.toJson();
-    if (children != null) {
-      __result['children'] = children?.map((item) => item.toJson()).toList();
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('name');
+      reporter.push('children');
       try {
-        if (!obj.containsKey('name')) {
-          reporter.reportError('must not be undefined');
+        final children = obj['children'];
+        if (children != null &&
+            !((children is List<Object?> &&
+                (children.every(
+                    (item) => DocumentSymbol.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentSymbol>');
           return false;
         }
-        final name = obj['name'];
-        if (name == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(name is String)) {
-          reporter.reportError('must be of type String');
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('deprecated');
+      try {
+        final deprecated = obj['deprecated'];
+        if (deprecated != null && !(deprecated is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -15806,23 +15143,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
+      reporter.push('name');
       try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<SymbolTag>');
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
           return false;
         }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('deprecated');
-      try {
-        final deprecated = obj['deprecated'];
-        if (deprecated != null && !(deprecated is bool)) {
-          reporter.reportError('must be of type bool');
+        final name = obj['name'];
+        if (name == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(name is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -15864,14 +15197,13 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('children');
+      reporter.push('tags');
       try {
-        final children = obj['children'];
-        if (children != null &&
-            !((children is List<Object?> &&
-                (children.every(
-                    (item) => DocumentSymbol.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentSymbol>');
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
           return false;
         }
       } finally {
@@ -15887,15 +15219,15 @@
   @override
   bool operator ==(Object other) {
     if (other is DocumentSymbol && other.runtimeType == DocumentSymbol) {
-      return name == other.name &&
+      return listEqual(children, other.children,
+              (DocumentSymbol a, DocumentSymbol b) => a == b) &&
+          deprecated == other.deprecated &&
           detail == other.detail &&
           kind == other.kind &&
-          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
-          deprecated == other.deprecated &&
+          name == other.name &&
           range == other.range &&
           selectionRange == other.selectionRange &&
-          listEqual(children, other.children,
-              (DocumentSymbol a, DocumentSymbol b) => a == b) &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
           true;
     }
     return false;
@@ -15903,14 +15235,14 @@
 
   @override
   int get hashCode => Object.hash(
-        name,
+        lspHashCode(children),
+        deprecated,
         detail,
         kind,
-        lspHashCode(tags),
-        deprecated,
+        name,
         range,
         selectionRange,
-        lspHashCode(children),
+        lspHashCode(tags),
       );
 
   @override
@@ -15925,36 +15257,36 @@
 
   DocumentSymbolClientCapabilities({
     this.dynamicRegistration,
-    this.symbolKind,
     this.hierarchicalDocumentSymbolSupport,
-    this.tagSupport,
     this.labelSupport,
+    this.symbolKind,
+    this.tagSupport,
   });
   static DocumentSymbolClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final hierarchicalDocumentSymbolSupportJson =
+        json['hierarchicalDocumentSymbolSupport'];
+    final hierarchicalDocumentSymbolSupport =
+        hierarchicalDocumentSymbolSupportJson as bool?;
+    final labelSupportJson = json['labelSupport'];
+    final labelSupport = labelSupportJson as bool?;
     final symbolKindJson = json['symbolKind'];
     final symbolKind = symbolKindJson != null
         ? DocumentSymbolClientCapabilitiesSymbolKind.fromJson(
             symbolKindJson as Map<String, Object?>)
         : null;
-    final hierarchicalDocumentSymbolSupportJson =
-        json['hierarchicalDocumentSymbolSupport'];
-    final hierarchicalDocumentSymbolSupport =
-        hierarchicalDocumentSymbolSupportJson as bool?;
     final tagSupportJson = json['tagSupport'];
     final tagSupport = tagSupportJson != null
         ? DocumentSymbolClientCapabilitiesTagSupport.fromJson(
             tagSupportJson as Map<String, Object?>)
         : null;
-    final labelSupportJson = json['labelSupport'];
-    final labelSupport = labelSupportJson as bool?;
     return DocumentSymbolClientCapabilities(
       dynamicRegistration: dynamicRegistration,
-      symbolKind: symbolKind,
       hierarchicalDocumentSymbolSupport: hierarchicalDocumentSymbolSupport,
-      tagSupport: tagSupport,
       labelSupport: labelSupport,
+      symbolKind: symbolKind,
+      tagSupport: tagSupport,
     );
   }
 
@@ -15984,19 +15316,19 @@
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
-    if (symbolKind != null) {
-      __result['symbolKind'] = symbolKind?.toJson();
-    }
     if (hierarchicalDocumentSymbolSupport != null) {
       __result['hierarchicalDocumentSymbolSupport'] =
           hierarchicalDocumentSymbolSupport;
     }
-    if (tagSupport != null) {
-      __result['tagSupport'] = tagSupport?.toJson();
-    }
     if (labelSupport != null) {
       __result['labelSupport'] = labelSupport;
     }
+    if (symbolKind != null) {
+      __result['symbolKind'] = symbolKind?.toJson();
+    }
+    if (tagSupport != null) {
+      __result['tagSupport'] = tagSupport?.toJson();
+    }
     return __result;
   }
 
@@ -16012,6 +15344,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('hierarchicalDocumentSymbolSupport');
+      try {
+        final hierarchicalDocumentSymbolSupport =
+            obj['hierarchicalDocumentSymbolSupport'];
+        if (hierarchicalDocumentSymbolSupport != null &&
+            !(hierarchicalDocumentSymbolSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('labelSupport');
+      try {
+        final labelSupport = obj['labelSupport'];
+        if (labelSupport != null && !(labelSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('symbolKind');
       try {
         final symbolKind = obj['symbolKind'];
@@ -16025,18 +15379,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('hierarchicalDocumentSymbolSupport');
-      try {
-        final hierarchicalDocumentSymbolSupport =
-            obj['hierarchicalDocumentSymbolSupport'];
-        if (hierarchicalDocumentSymbolSupport != null &&
-            !(hierarchicalDocumentSymbolSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('tagSupport');
       try {
         final tagSupport = obj['tagSupport'];
@@ -16050,16 +15392,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('labelSupport');
-      try {
-        final labelSupport = obj['labelSupport'];
-        if (labelSupport != null && !(labelSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentSymbolClientCapabilities');
@@ -16072,11 +15404,11 @@
     if (other is DocumentSymbolClientCapabilities &&
         other.runtimeType == DocumentSymbolClientCapabilities) {
       return dynamicRegistration == other.dynamicRegistration &&
-          symbolKind == other.symbolKind &&
           hierarchicalDocumentSymbolSupport ==
               other.hierarchicalDocumentSymbolSupport &&
-          tagSupport == other.tagSupport &&
           labelSupport == other.labelSupport &&
+          symbolKind == other.symbolKind &&
+          tagSupport == other.tagSupport &&
           true;
     }
     return false;
@@ -16085,10 +15417,10 @@
   @override
   int get hashCode => Object.hash(
         dynamicRegistration,
-        symbolKind,
         hierarchicalDocumentSymbolSupport,
-        tagSupport,
         labelSupport,
+        symbolKind,
+        tagSupport,
       );
 
   @override
@@ -16347,11 +15679,19 @@
   );
 
   DocumentSymbolParams({
+    this.partialResultToken,
     required this.textDocument,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static DocumentSymbolParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -16363,18 +15703,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return DocumentSymbolParams(
+      partialResultToken: partialResultToken,
       textDocument: textDocument,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -16390,18 +15722,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -16431,17 +15774,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentSymbolParams');
@@ -16453,9 +15785,9 @@
   bool operator ==(Object other) {
     if (other is DocumentSymbolParams &&
         other.runtimeType == DocumentSymbolParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -16463,9 +15795,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         textDocument,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -16490,7 +15822,8 @@
   static DocumentSymbolRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final labelJson = json['label'];
     final label = labelJson as String?;
@@ -16505,7 +15838,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// A human-readable string that is shown when multiple outlines trees are
   /// shown for the same document.
@@ -16537,8 +15870,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -16576,7 +15909,7 @@
     if (other is DocumentSymbolRegistrationOptions &&
         other.runtimeType == DocumentSymbolRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           label == other.label &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -16841,16 +16174,16 @@
   );
 
   ExecuteCommandParams({
-    required this.command,
     this.arguments,
+    required this.command,
     this.workDoneToken,
   });
   static ExecuteCommandParams fromJson(Map<String, Object?> json) {
-    final commandJson = json['command'];
-    final command = commandJson as String;
     final argumentsJson = json['arguments'];
     final arguments =
         (argumentsJson as List<Object?>?)?.map((item) => item).toList();
+    final commandJson = json['command'];
+    final command = commandJson as String;
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -16860,8 +16193,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return ExecuteCommandParams(
-      command: command,
       arguments: arguments,
+      command: command,
       workDoneToken: workDoneToken,
     );
   }
@@ -16877,10 +16210,10 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['command'] = command;
     if (arguments != null) {
       __result['arguments'] = arguments;
     }
+    __result['command'] = command;
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -16889,6 +16222,18 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('arguments');
+      try {
+        final arguments = obj['arguments'];
+        if (arguments != null &&
+            !((arguments is List<Object?> &&
+                (arguments.every((item) => true))))) {
+          reporter.reportError('must be of type List<Object?>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('command');
       try {
         if (!obj.containsKey('command')) {
@@ -16907,18 +16252,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('arguments');
-      try {
-        final arguments = obj['arguments'];
-        if (arguments != null &&
-            !((arguments is List<Object?> &&
-                (arguments.every((item) => true))))) {
-          reporter.reportError('must be of type List<Object?>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -16941,9 +16274,9 @@
   bool operator ==(Object other) {
     if (other is ExecuteCommandParams &&
         other.runtimeType == ExecuteCommandParams) {
-      return command == other.command &&
-          listEqual(
+      return listEqual(
               arguments, other.arguments, (Object? a, Object? b) => a == b) &&
+          command == other.command &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -16952,8 +16285,8 @@
 
   @override
   int get hashCode => Object.hash(
-        command,
         lspHashCode(arguments),
+        command,
         workDoneToken,
       );
 
@@ -17378,17 +16711,17 @@
   );
 
   FileEvent({
-    required this.uri,
     required this.type,
+    required this.uri,
   });
   static FileEvent fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final typeJson = json['type'];
     final type = typeJson as int;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return FileEvent(
-      uri: uri,
       type: type,
+      uri: uri,
     );
   }
 
@@ -17400,31 +16733,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
     __result['type'] = type;
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final uri = obj['uri'];
-        if (uri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('type');
       try {
         if (!obj.containsKey('type')) {
@@ -17443,6 +16758,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FileEvent');
@@ -17453,15 +16786,15 @@
   @override
   bool operator ==(Object other) {
     if (other is FileEvent && other.runtimeType == FileEvent) {
-      return uri == other.uri && type == other.type && true;
+      return type == other.type && uri == other.uri && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        uri,
         type,
+        uri,
       );
 
   @override
@@ -17478,18 +16811,18 @@
   );
 
   FileOperationFilter({
-    this.scheme,
     required this.pattern,
+    this.scheme,
   });
   static FileOperationFilter fromJson(Map<String, Object?> json) {
-    final schemeJson = json['scheme'];
-    final scheme = schemeJson as String?;
     final patternJson = json['pattern'];
     final pattern =
         FileOperationPattern.fromJson(patternJson as Map<String, Object?>);
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String?;
     return FileOperationFilter(
-      scheme: scheme,
       pattern: pattern,
+      scheme: scheme,
     );
   }
 
@@ -17501,25 +16834,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['pattern'] = pattern.toJson();
     if (scheme != null) {
       __result['scheme'] = scheme;
     }
-    __result['pattern'] = pattern.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('scheme');
-      try {
-        final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('pattern');
       try {
         if (!obj.containsKey('pattern')) {
@@ -17538,6 +16861,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('scheme');
+      try {
+        final scheme = obj['scheme'];
+        if (scheme != null && !(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FileOperationFilter');
@@ -17549,15 +16882,15 @@
   bool operator ==(Object other) {
     if (other is FileOperationFilter &&
         other.runtimeType == FileOperationFilter) {
-      return scheme == other.scheme && pattern == other.pattern && true;
+      return pattern == other.pattern && scheme == other.scheme && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        scheme,
         pattern,
+        scheme,
       );
 
   @override
@@ -17884,17 +17217,17 @@
   );
 
   FileRename({
-    required this.oldUri,
     required this.newUri,
+    required this.oldUri,
   });
   static FileRename fromJson(Map<String, Object?> json) {
-    final oldUriJson = json['oldUri'];
-    final oldUri = oldUriJson as String;
     final newUriJson = json['newUri'];
     final newUri = newUriJson as String;
+    final oldUriJson = json['oldUri'];
+    final oldUri = oldUriJson as String;
     return FileRename(
-      oldUri: oldUri,
       newUri: newUri,
+      oldUri: oldUri,
     );
   }
 
@@ -17906,31 +17239,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['oldUri'] = oldUri;
     __result['newUri'] = newUri;
+    __result['oldUri'] = oldUri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('oldUri');
-      try {
-        if (!obj.containsKey('oldUri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final oldUri = obj['oldUri'];
-        if (oldUri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(oldUri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('newUri');
       try {
         if (!obj.containsKey('newUri')) {
@@ -17949,6 +17264,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('oldUri');
+      try {
+        if (!obj.containsKey('oldUri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final oldUri = obj['oldUri'];
+        if (oldUri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(oldUri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FileRename');
@@ -17959,15 +17292,15 @@
   @override
   bool operator ==(Object other) {
     if (other is FileRename && other.runtimeType == FileRename) {
-      return oldUri == other.oldUri && newUri == other.newUri && true;
+      return newUri == other.newUri && oldUri == other.oldUri && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        oldUri,
         newUri,
+        oldUri,
       );
 
   @override
@@ -18085,34 +17418,34 @@
   );
 
   FoldingRange({
-    required this.startLine,
-    this.startCharacter,
-    required this.endLine,
-    this.endCharacter,
-    this.kind,
     this.collapsedText,
+    this.endCharacter,
+    required this.endLine,
+    this.kind,
+    this.startCharacter,
+    required this.startLine,
   });
   static FoldingRange fromJson(Map<String, Object?> json) {
-    final startLineJson = json['startLine'];
-    final startLine = startLineJson as int;
-    final startCharacterJson = json['startCharacter'];
-    final startCharacter = startCharacterJson as int?;
-    final endLineJson = json['endLine'];
-    final endLine = endLineJson as int;
+    final collapsedTextJson = json['collapsedText'];
+    final collapsedText = collapsedTextJson as String?;
     final endCharacterJson = json['endCharacter'];
     final endCharacter = endCharacterJson as int?;
+    final endLineJson = json['endLine'];
+    final endLine = endLineJson as int;
     final kindJson = json['kind'];
     final kind =
         kindJson != null ? FoldingRangeKind.fromJson(kindJson as String) : null;
-    final collapsedTextJson = json['collapsedText'];
-    final collapsedText = collapsedTextJson as String?;
+    final startCharacterJson = json['startCharacter'];
+    final startCharacter = startCharacterJson as int?;
+    final startLineJson = json['startLine'];
+    final startLine = startLineJson as int;
     return FoldingRange(
-      startLine: startLine,
-      startCharacter: startCharacter,
-      endLine: endLine,
-      endCharacter: endCharacter,
-      kind: kind,
       collapsedText: collapsedText,
+      endCharacter: endCharacter,
+      endLine: endLine,
+      kind: kind,
+      startCharacter: startCharacter,
+      startLine: startLine,
     );
   }
 
@@ -18148,47 +17481,39 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['startLine'] = startLine;
-    if (startCharacter != null) {
-      __result['startCharacter'] = startCharacter;
-    }
-    __result['endLine'] = endLine;
-    if (endCharacter != null) {
-      __result['endCharacter'] = endCharacter;
-    }
-    if (kind != null) {
-      __result['kind'] = kind?.toJson();
-    }
     if (collapsedText != null) {
       __result['collapsedText'] = collapsedText;
     }
+    if (endCharacter != null) {
+      __result['endCharacter'] = endCharacter;
+    }
+    __result['endLine'] = endLine;
+    if (kind != null) {
+      __result['kind'] = kind?.toJson();
+    }
+    if (startCharacter != null) {
+      __result['startCharacter'] = startCharacter;
+    }
+    __result['startLine'] = startLine;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('startLine');
+      reporter.push('collapsedText');
       try {
-        if (!obj.containsKey('startLine')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final startLine = obj['startLine'];
-        if (startLine == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(startLine is int)) {
-          reporter.reportError('must be of type int');
+        final collapsedText = obj['collapsedText'];
+        if (collapsedText != null && !(collapsedText is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('startCharacter');
+      reporter.push('endCharacter');
       try {
-        final startCharacter = obj['startCharacter'];
-        if (startCharacter != null && !(startCharacter is int)) {
+        final endCharacter = obj['endCharacter'];
+        if (endCharacter != null && !(endCharacter is int)) {
           reporter.reportError('must be of type int');
           return false;
         }
@@ -18213,16 +17538,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('endCharacter');
-      try {
-        final endCharacter = obj['endCharacter'];
-        if (endCharacter != null && !(endCharacter is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('kind');
       try {
         final kind = obj['kind'];
@@ -18233,11 +17548,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('collapsedText');
+      reporter.push('startCharacter');
       try {
-        final collapsedText = obj['collapsedText'];
-        if (collapsedText != null && !(collapsedText is String)) {
-          reporter.reportError('must be of type String');
+        final startCharacter = obj['startCharacter'];
+        if (startCharacter != null && !(startCharacter is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('startLine');
+      try {
+        if (!obj.containsKey('startLine')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final startLine = obj['startLine'];
+        if (startLine == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(startLine is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -18253,12 +17586,12 @@
   @override
   bool operator ==(Object other) {
     if (other is FoldingRange && other.runtimeType == FoldingRange) {
-      return startLine == other.startLine &&
-          startCharacter == other.startCharacter &&
-          endLine == other.endLine &&
+      return collapsedText == other.collapsedText &&
           endCharacter == other.endCharacter &&
+          endLine == other.endLine &&
           kind == other.kind &&
-          collapsedText == other.collapsedText &&
+          startCharacter == other.startCharacter &&
+          startLine == other.startLine &&
           true;
     }
     return false;
@@ -18266,12 +17599,12 @@
 
   @override
   int get hashCode => Object.hash(
-        startLine,
-        startCharacter,
-        endLine,
-        endCharacter,
-        kind,
         collapsedText,
+        endCharacter,
+        endLine,
+        kind,
+        startCharacter,
+        startLine,
       );
 
   @override
@@ -18286,34 +17619,34 @@
 
   FoldingRangeClientCapabilities({
     this.dynamicRegistration,
-    this.rangeLimit,
-    this.lineFoldingOnly,
-    this.foldingRangeKind,
     this.foldingRange,
+    this.foldingRangeKind,
+    this.lineFoldingOnly,
+    this.rangeLimit,
   });
   static FoldingRangeClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
-    final rangeLimitJson = json['rangeLimit'];
-    final rangeLimit = rangeLimitJson as int?;
-    final lineFoldingOnlyJson = json['lineFoldingOnly'];
-    final lineFoldingOnly = lineFoldingOnlyJson as bool?;
-    final foldingRangeKindJson = json['foldingRangeKind'];
-    final foldingRangeKind = foldingRangeKindJson != null
-        ? FoldingRangeClientCapabilitiesFoldingRangeKind.fromJson(
-            foldingRangeKindJson as Map<String, Object?>)
-        : null;
     final foldingRangeJson = json['foldingRange'];
     final foldingRange = foldingRangeJson != null
         ? FoldingRangeClientCapabilitiesFoldingRange.fromJson(
             foldingRangeJson as Map<String, Object?>)
         : null;
+    final foldingRangeKindJson = json['foldingRangeKind'];
+    final foldingRangeKind = foldingRangeKindJson != null
+        ? FoldingRangeClientCapabilitiesFoldingRangeKind.fromJson(
+            foldingRangeKindJson as Map<String, Object?>)
+        : null;
+    final lineFoldingOnlyJson = json['lineFoldingOnly'];
+    final lineFoldingOnly = lineFoldingOnlyJson as bool?;
+    final rangeLimitJson = json['rangeLimit'];
+    final rangeLimit = rangeLimitJson as int?;
     return FoldingRangeClientCapabilities(
       dynamicRegistration: dynamicRegistration,
-      rangeLimit: rangeLimit,
-      lineFoldingOnly: lineFoldingOnly,
-      foldingRangeKind: foldingRangeKind,
       foldingRange: foldingRange,
+      foldingRangeKind: foldingRangeKind,
+      lineFoldingOnly: lineFoldingOnly,
+      rangeLimit: rangeLimit,
     );
   }
 
@@ -18345,17 +17678,17 @@
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
-    if (rangeLimit != null) {
-      __result['rangeLimit'] = rangeLimit;
-    }
-    if (lineFoldingOnly != null) {
-      __result['lineFoldingOnly'] = lineFoldingOnly;
+    if (foldingRange != null) {
+      __result['foldingRange'] = foldingRange?.toJson();
     }
     if (foldingRangeKind != null) {
       __result['foldingRangeKind'] = foldingRangeKind?.toJson();
     }
-    if (foldingRange != null) {
-      __result['foldingRange'] = foldingRange?.toJson();
+    if (lineFoldingOnly != null) {
+      __result['lineFoldingOnly'] = lineFoldingOnly;
+    }
+    if (rangeLimit != null) {
+      __result['rangeLimit'] = rangeLimit;
     }
     return __result;
   }
@@ -18372,39 +17705,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('rangeLimit');
-      try {
-        final rangeLimit = obj['rangeLimit'];
-        if (rangeLimit != null && !(rangeLimit is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('lineFoldingOnly');
-      try {
-        final lineFoldingOnly = obj['lineFoldingOnly'];
-        if (lineFoldingOnly != null && !(lineFoldingOnly is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('foldingRangeKind');
-      try {
-        final foldingRangeKind = obj['foldingRangeKind'];
-        if (foldingRangeKind != null &&
-            !(FoldingRangeClientCapabilitiesFoldingRangeKind.canParse(
-                foldingRangeKind, reporter))) {
-          reporter.reportError(
-              'must be of type FoldingRangeClientCapabilitiesFoldingRangeKind');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('foldingRange');
       try {
         final foldingRange = obj['foldingRange'];
@@ -18418,6 +17718,39 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('foldingRangeKind');
+      try {
+        final foldingRangeKind = obj['foldingRangeKind'];
+        if (foldingRangeKind != null &&
+            !(FoldingRangeClientCapabilitiesFoldingRangeKind.canParse(
+                foldingRangeKind, reporter))) {
+          reporter.reportError(
+              'must be of type FoldingRangeClientCapabilitiesFoldingRangeKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('lineFoldingOnly');
+      try {
+        final lineFoldingOnly = obj['lineFoldingOnly'];
+        if (lineFoldingOnly != null && !(lineFoldingOnly is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('rangeLimit');
+      try {
+        final rangeLimit = obj['rangeLimit'];
+        if (rangeLimit != null && !(rangeLimit is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FoldingRangeClientCapabilities');
@@ -18430,10 +17763,10 @@
     if (other is FoldingRangeClientCapabilities &&
         other.runtimeType == FoldingRangeClientCapabilities) {
       return dynamicRegistration == other.dynamicRegistration &&
-          rangeLimit == other.rangeLimit &&
-          lineFoldingOnly == other.lineFoldingOnly &&
-          foldingRangeKind == other.foldingRangeKind &&
           foldingRange == other.foldingRange &&
+          foldingRangeKind == other.foldingRangeKind &&
+          lineFoldingOnly == other.lineFoldingOnly &&
+          rangeLimit == other.rangeLimit &&
           true;
     }
     return false;
@@ -18442,10 +17775,10 @@
   @override
   int get hashCode => Object.hash(
         dynamicRegistration,
-        rangeLimit,
-        lineFoldingOnly,
-        foldingRangeKind,
         foldingRange,
+        foldingRangeKind,
+        lineFoldingOnly,
+        rangeLimit,
       );
 
   @override
@@ -18697,11 +18030,19 @@
   );
 
   FoldingRangeParams({
+    this.partialResultToken,
     required this.textDocument,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static FoldingRangeParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -18713,18 +18054,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return FoldingRangeParams(
+      partialResultToken: partialResultToken,
       textDocument: textDocument,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -18740,18 +18073,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -18781,17 +18125,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type FoldingRangeParams');
@@ -18803,9 +18136,9 @@
   bool operator ==(Object other) {
     if (other is FoldingRangeParams &&
         other.runtimeType == FoldingRangeParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -18813,9 +18146,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         textDocument,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -18835,28 +18168,29 @@
 
   FoldingRangeRegistrationOptions({
     this.documentSelector,
-    this.workDoneProgress,
     this.id,
+    this.workDoneProgress,
   });
   static FoldingRangeRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return FoldingRangeRegistrationOptions(
       documentSelector: documentSelector,
-      workDoneProgress: workDoneProgress,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -18866,12 +18200,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -18887,18 +18221,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -18914,6 +18238,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FoldingRangeRegistrationOptions');
@@ -18926,9 +18260,9 @@
     if (other is FoldingRangeRegistrationOptions &&
         other.runtimeType == FoldingRangeRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          workDoneProgress == other.workDoneProgress &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -18937,8 +18271,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        workDoneProgress,
         id,
+        workDoneProgress,
       );
 
   @override
@@ -18953,29 +18287,29 @@
   );
 
   FormattingOptions({
-    required this.tabSize,
-    required this.insertSpaces,
-    this.trimTrailingWhitespace,
     this.insertFinalNewline,
+    required this.insertSpaces,
+    required this.tabSize,
     this.trimFinalNewlines,
+    this.trimTrailingWhitespace,
   });
   static FormattingOptions fromJson(Map<String, Object?> json) {
-    final tabSizeJson = json['tabSize'];
-    final tabSize = tabSizeJson as int;
-    final insertSpacesJson = json['insertSpaces'];
-    final insertSpaces = insertSpacesJson as bool;
-    final trimTrailingWhitespaceJson = json['trimTrailingWhitespace'];
-    final trimTrailingWhitespace = trimTrailingWhitespaceJson as bool?;
     final insertFinalNewlineJson = json['insertFinalNewline'];
     final insertFinalNewline = insertFinalNewlineJson as bool?;
+    final insertSpacesJson = json['insertSpaces'];
+    final insertSpaces = insertSpacesJson as bool;
+    final tabSizeJson = json['tabSize'];
+    final tabSize = tabSizeJson as int;
     final trimFinalNewlinesJson = json['trimFinalNewlines'];
     final trimFinalNewlines = trimFinalNewlinesJson as bool?;
+    final trimTrailingWhitespaceJson = json['trimTrailingWhitespace'];
+    final trimTrailingWhitespace = trimTrailingWhitespaceJson as bool?;
     return FormattingOptions(
-      tabSize: tabSize,
-      insertSpaces: insertSpaces,
-      trimTrailingWhitespace: trimTrailingWhitespace,
       insertFinalNewline: insertFinalNewline,
+      insertSpaces: insertSpaces,
+      tabSize: tabSize,
       trimFinalNewlines: trimFinalNewlines,
+      trimTrailingWhitespace: trimTrailingWhitespace,
     );
   }
 
@@ -18999,35 +18333,27 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['tabSize'] = tabSize;
-    __result['insertSpaces'] = insertSpaces;
-    if (trimTrailingWhitespace != null) {
-      __result['trimTrailingWhitespace'] = trimTrailingWhitespace;
-    }
     if (insertFinalNewline != null) {
       __result['insertFinalNewline'] = insertFinalNewline;
     }
+    __result['insertSpaces'] = insertSpaces;
+    __result['tabSize'] = tabSize;
     if (trimFinalNewlines != null) {
       __result['trimFinalNewlines'] = trimFinalNewlines;
     }
+    if (trimTrailingWhitespace != null) {
+      __result['trimTrailingWhitespace'] = trimTrailingWhitespace;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('tabSize');
+      reporter.push('insertFinalNewline');
       try {
-        if (!obj.containsKey('tabSize')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final tabSize = obj['tabSize'];
-        if (tabSize == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(tabSize is int)) {
-          reporter.reportError('must be of type int');
+        final insertFinalNewline = obj['insertFinalNewline'];
+        if (insertFinalNewline != null && !(insertFinalNewline is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -19051,22 +18377,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('trimTrailingWhitespace');
+      reporter.push('tabSize');
       try {
-        final trimTrailingWhitespace = obj['trimTrailingWhitespace'];
-        if (trimTrailingWhitespace != null &&
-            !(trimTrailingWhitespace is bool)) {
-          reporter.reportError('must be of type bool');
+        if (!obj.containsKey('tabSize')) {
+          reporter.reportError('must not be undefined');
           return false;
         }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('insertFinalNewline');
-      try {
-        final insertFinalNewline = obj['insertFinalNewline'];
-        if (insertFinalNewline != null && !(insertFinalNewline is bool)) {
-          reporter.reportError('must be of type bool');
+        final tabSize = obj['tabSize'];
+        if (tabSize == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(tabSize is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -19082,6 +18405,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('trimTrailingWhitespace');
+      try {
+        final trimTrailingWhitespace = obj['trimTrailingWhitespace'];
+        if (trimTrailingWhitespace != null &&
+            !(trimTrailingWhitespace is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FormattingOptions');
@@ -19092,11 +18426,11 @@
   @override
   bool operator ==(Object other) {
     if (other is FormattingOptions && other.runtimeType == FormattingOptions) {
-      return tabSize == other.tabSize &&
+      return insertFinalNewline == other.insertFinalNewline &&
           insertSpaces == other.insertSpaces &&
-          trimTrailingWhitespace == other.trimTrailingWhitespace &&
-          insertFinalNewline == other.insertFinalNewline &&
+          tabSize == other.tabSize &&
           trimFinalNewlines == other.trimFinalNewlines &&
+          trimTrailingWhitespace == other.trimTrailingWhitespace &&
           true;
     }
     return false;
@@ -19104,11 +18438,11 @@
 
   @override
   int get hashCode => Object.hash(
-        tabSize,
-        insertSpaces,
-        trimTrailingWhitespace,
         insertFinalNewline,
+        insertSpaces,
+        tabSize,
         trimFinalNewlines,
+        trimTrailingWhitespace,
       );
 
   @override
@@ -19124,9 +18458,9 @@
   );
 
   FullDocumentDiagnosticReport({
+    required this.items,
     this.kind = 'full',
     this.resultId,
-    required this.items,
   }) {
     if (kind != 'full') {
       throw 'kind may only be the literal \'full\'';
@@ -19141,18 +18475,18 @@
         json, nullLspJsonReporter)) {
       return WorkspaceFullDocumentDiagnosticReport.fromJson(json);
     }
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
-    final resultIdJson = json['resultId'];
-    final resultId = resultIdJson as String?;
     final itemsJson = json['items'];
     final items = (itemsJson as List<Object?>)
         .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
         .toList();
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
     return FullDocumentDiagnosticReport(
+      items: items,
       kind: kind,
       resultId: resultId,
-      items: items,
     );
   }
 
@@ -19168,16 +18502,35 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['items'] = items.map((item) => item.toJson()).toList();
     __result['kind'] = kind;
     if (resultId != null) {
       __result['resultId'] = resultId;
     }
-    __result['items'] = items.map((item) => item.toJson()).toList();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('items');
+      try {
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -19206,25 +18559,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('items');
-      try {
-        if (!obj.containsKey('items')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final items = obj['items'];
-        if (items == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((items is List<Object?> &&
-            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<Diagnostic>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type FullDocumentDiagnosticReport');
@@ -19236,10 +18570,10 @@
   bool operator ==(Object other) {
     if (other is FullDocumentDiagnosticReport &&
         other.runtimeType == FullDocumentDiagnosticReport) {
-      return kind == other.kind &&
-          resultId == other.resultId &&
-          listEqual(
+      return listEqual(
               items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
+          kind == other.kind &&
+          resultId == other.resultId &&
           true;
     }
     return false;
@@ -19247,9 +18581,9 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(items),
         kind,
         resultId,
-        lspHashCode(items),
       );
 
   @override
@@ -19269,12 +18603,12 @@
   });
   static Hover fromJson(Map<String, Object?> json) {
     final contentsJson = json['contents'];
-    final contents = contentsJson is String
-        ? Either2<String, MarkupContent>.t1(contentsJson)
-        : (MarkupContent.canParse(contentsJson, nullLspJsonReporter)
-            ? Either2<String, MarkupContent>.t2(
-                MarkupContent.fromJson(contentsJson as Map<String, Object?>))
-            : (throw '''$contentsJson was not one of (String, MarkupContent)'''));
+    final contents = MarkupContent.canParse(contentsJson, nullLspJsonReporter)
+        ? Either2<MarkupContent, String>.t1(
+            MarkupContent.fromJson(contentsJson as Map<String, Object?>))
+        : (contentsJson is String
+            ? Either2<MarkupContent, String>.t2(contentsJson)
+            : (throw '''$contentsJson was not one of (MarkupContent, String)'''));
     final rangeJson = json['range'];
     final range = rangeJson != null
         ? Range.fromJson(rangeJson as Map<String, Object?>)
@@ -19286,7 +18620,7 @@
   }
 
   /// The hover's content
-  final Either2<String, MarkupContent> contents;
+  final Either2<MarkupContent, String> contents;
 
   /// An optional range is a range inside a text document that is used to
   /// visualize a hover, e.g. by changing the background color.
@@ -19314,10 +18648,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((contents is String ||
-            MarkupContent.canParse(contents, reporter)))) {
+        if (!((MarkupContent.canParse(contents, reporter) ||
+            contents is String))) {
           reporter
-              .reportError('must be of type Either2<String, MarkupContent>');
+              .reportError('must be of type Either2<MarkupContent, String>');
           return false;
         }
       } finally {
@@ -19365,19 +18699,19 @@
   );
 
   HoverClientCapabilities({
-    this.dynamicRegistration,
     this.contentFormat,
+    this.dynamicRegistration,
   });
   static HoverClientCapabilities fromJson(Map<String, Object?> json) {
-    final dynamicRegistrationJson = json['dynamicRegistration'];
-    final dynamicRegistration = dynamicRegistrationJson as bool?;
     final contentFormatJson = json['contentFormat'];
     final contentFormat = (contentFormatJson as List<Object?>?)
         ?.map((item) => MarkupKind.fromJson(item as String))
         .toList();
+    final dynamicRegistrationJson = json['dynamicRegistration'];
+    final dynamicRegistration = dynamicRegistrationJson as bool?;
     return HoverClientCapabilities(
-      dynamicRegistration: dynamicRegistration,
       contentFormat: contentFormat,
+      dynamicRegistration: dynamicRegistration,
     );
   }
 
@@ -19391,28 +18725,18 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (dynamicRegistration != null) {
-      __result['dynamicRegistration'] = dynamicRegistration;
-    }
     if (contentFormat != null) {
       __result['contentFormat'] =
           contentFormat?.map((item) => item.toJson()).toList();
     }
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('dynamicRegistration');
-      try {
-        final dynamicRegistration = obj['dynamicRegistration'];
-        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('contentFormat');
       try {
         final contentFormat = obj['contentFormat'];
@@ -19426,6 +18750,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('dynamicRegistration');
+      try {
+        final dynamicRegistration = obj['dynamicRegistration'];
+        if (dynamicRegistration != null && !(dynamicRegistration is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type HoverClientCapabilities');
@@ -19437,9 +18771,9 @@
   bool operator ==(Object other) {
     if (other is HoverClientCapabilities &&
         other.runtimeType == HoverClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration &&
-          listEqual(contentFormat, other.contentFormat,
+      return listEqual(contentFormat, other.contentFormat,
               (MarkupKind a, MarkupKind b) => a == b) &&
+          dynamicRegistration == other.dynamicRegistration &&
           true;
     }
     return false;
@@ -19447,8 +18781,8 @@
 
   @override
   int get hashCode => Object.hash(
-        dynamicRegistration,
         lspHashCode(contentFormat),
+        dynamicRegistration,
       );
 
   @override
@@ -19527,16 +18861,16 @@
   );
 
   HoverParams({
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
     this.workDoneToken,
   });
   static HoverParams fromJson(Map<String, Object?> json) {
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -19546,8 +18880,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return HoverParams(
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -19563,8 +18897,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -19573,24 +18907,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -19609,6 +18925,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -19630,8 +18964,8 @@
   @override
   bool operator ==(Object other) {
     if (other is HoverParams && other.runtimeType == HoverParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
+      return position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -19640,8 +18974,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         position,
+        textDocument,
         workDoneToken,
       );
 
@@ -19656,17 +18990,17 @@
   );
 
   HoverParamsPosition({
-    required this.line,
     required this.character,
+    required this.line,
   });
   static HoverParamsPosition fromJson(Map<String, Object?> json) {
-    final lineJson = json['line'];
-    final line = lineJson as int;
     final characterJson = json['character'];
     final character = characterJson as int;
+    final lineJson = json['line'];
+    final line = lineJson as int;
     return HoverParamsPosition(
-      line: line,
       character: character,
+      line: line,
     );
   }
 
@@ -19675,31 +19009,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['line'] = line;
     __result['character'] = character;
+    __result['line'] = line;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('line');
-      try {
-        if (!obj.containsKey('line')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final line = obj['line'];
-        if (line == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(line is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('character');
       try {
         if (!obj.containsKey('character')) {
@@ -19718,6 +19034,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('line');
+      try {
+        if (!obj.containsKey('line')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final line = obj['line'];
+        if (line == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(line is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type HoverParamsPosition');
@@ -19729,15 +19063,15 @@
   bool operator ==(Object other) {
     if (other is HoverParamsPosition &&
         other.runtimeType == HoverParamsPosition) {
-      return line == other.line && character == other.character && true;
+      return character == other.character && line == other.line && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        line,
         character,
+        line,
       );
 
   @override
@@ -19758,7 +19092,8 @@
   static HoverRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -19770,7 +19105,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -19794,8 +19129,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -19823,7 +19158,7 @@
     if (other is HoverRegistrationOptions &&
         other.runtimeType == HoverRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -20075,25 +19410,12 @@
   );
 
   ImplementationParams({
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static ImplementationParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -20102,11 +19424,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return ImplementationParams(
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -20125,32 +19460,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -20174,22 +19502,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -20207,10 +19542,10 @@
   bool operator ==(Object other) {
     if (other is ImplementationParams &&
         other.runtimeType == ImplementationParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -20218,10 +19553,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -20241,28 +19576,29 @@
 
   ImplementationRegistrationOptions({
     this.documentSelector,
-    this.workDoneProgress,
     this.id,
+    this.workDoneProgress,
   });
   static ImplementationRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return ImplementationRegistrationOptions(
       documentSelector: documentSelector,
-      workDoneProgress: workDoneProgress,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -20272,12 +19608,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -20293,18 +19629,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -20320,6 +19646,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ImplementationRegistrationOptions');
@@ -20332,9 +19668,9 @@
     if (other is ImplementationRegistrationOptions &&
         other.runtimeType == ImplementationRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          workDoneProgress == other.workDoneProgress &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -20343,8 +19679,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        workDoneProgress,
         id,
+        workDoneProgress,
       );
 
   @override
@@ -20380,44 +19716,40 @@
   );
 
   InitializeParams({
-    this.processId,
+    required this.capabilities,
     this.clientInfo,
+    this.initializationOptions,
     this.locale,
+    this.processId,
     this.rootPath,
     this.rootUri,
-    this.initializationOptions,
-    required this.capabilities,
     this.trace,
-    this.workspaceFolders,
     this.workDoneToken,
+    this.workspaceFolders,
   });
   static InitializeParams fromJson(Map<String, Object?> json) {
-    final processIdJson = json['processId'];
-    final processId = processIdJson as int?;
+    final capabilitiesJson = json['capabilities'];
+    final capabilities =
+        ClientCapabilities.fromJson(capabilitiesJson as Map<String, Object?>);
     final clientInfoJson = json['clientInfo'];
     final clientInfo = clientInfoJson != null
         ? InitializeParamsClientInfo.fromJson(
             clientInfoJson as Map<String, Object?>)
         : null;
+    final initializationOptionsJson = json['initializationOptions'];
+    final initializationOptions = initializationOptionsJson;
     final localeJson = json['locale'];
     final locale = localeJson as String?;
+    final processIdJson = json['processId'];
+    final processId = processIdJson as int?;
     final rootPathJson = json['rootPath'];
     final rootPath = rootPathJson as String?;
     final rootUriJson = json['rootUri'];
     final rootUri = rootUriJson as String?;
-    final initializationOptionsJson = json['initializationOptions'];
-    final initializationOptions = initializationOptionsJson;
-    final capabilitiesJson = json['capabilities'];
-    final capabilities =
-        ClientCapabilities.fromJson(capabilitiesJson as Map<String, Object?>);
     final traceJson = json['trace'];
     final trace = const {null, 'off', 'messages', 'verbose'}.contains(traceJson)
         ? traceJson as String?
         : throw '''$traceJson was not one of (null, 'off', 'messages', 'verbose')''';
-    final workspaceFoldersJson = json['workspaceFolders'];
-    final workspaceFolders = (workspaceFoldersJson as List<Object?>?)
-        ?.map((item) => WorkspaceFolder.fromJson(item as Map<String, Object?>))
-        .toList();
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -20426,17 +19758,21 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
+    final workspaceFoldersJson = json['workspaceFolders'];
+    final workspaceFolders = (workspaceFoldersJson as List<Object?>?)
+        ?.map((item) => WorkspaceFolder.fromJson(item as Map<String, Object?>))
+        .toList();
     return InitializeParams(
-      processId: processId,
+      capabilities: capabilities,
       clientInfo: clientInfo,
+      initializationOptions: initializationOptions,
       locale: locale,
+      processId: processId,
       rootPath: rootPath,
       rootUri: rootUri,
-      initializationOptions: initializationOptions,
-      capabilities: capabilities,
       trace: trace,
-      workspaceFolders: workspaceFolders,
       workDoneToken: workDoneToken,
+      workspaceFolders: workspaceFolders,
     );
   }
 
@@ -20488,45 +19824,49 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['processId'] = processId;
+    __result['capabilities'] = capabilities.toJson();
     if (clientInfo != null) {
       __result['clientInfo'] = clientInfo?.toJson();
     }
+    if (initializationOptions != null) {
+      __result['initializationOptions'] = initializationOptions;
+    }
     if (locale != null) {
       __result['locale'] = locale;
     }
+    __result['processId'] = processId;
     if (rootPath != null) {
       __result['rootPath'] = rootPath;
     }
     __result['rootUri'] = rootUri;
-    if (initializationOptions != null) {
-      __result['initializationOptions'] = initializationOptions;
-    }
-    __result['capabilities'] = capabilities.toJson();
     if (trace != null) {
       __result['trace'] = trace;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     if (workspaceFolders != null) {
       __result['workspaceFolders'] =
           workspaceFolders?.map((item) => item.toJson()).toList();
     }
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('processId');
+      reporter.push('capabilities');
       try {
-        if (!obj.containsKey('processId')) {
+        if (!obj.containsKey('capabilities')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final processId = obj['processId'];
-        if (processId != null && !(processId is int)) {
-          reporter.reportError('must be of type int');
+        final capabilities = obj['capabilities'];
+        if (capabilities == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(ClientCapabilities.canParse(capabilities, reporter))) {
+          reporter.reportError('must be of type ClientCapabilities');
           return false;
         }
       } finally {
@@ -20553,6 +19893,20 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('processId');
+      try {
+        if (!obj.containsKey('processId')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final processId = obj['processId'];
+        if (processId != null && !(processId is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('rootPath');
       try {
         final rootPath = obj['rootPath'];
@@ -20577,24 +19931,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('capabilities');
-      try {
-        if (!obj.containsKey('capabilities')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final capabilities = obj['capabilities'];
-        if (capabilities == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(ClientCapabilities.canParse(capabilities, reporter))) {
-          reporter.reportError('must be of type ClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('trace');
       try {
         final trace = obj['trace'];
@@ -20607,6 +19943,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workspaceFolders');
       try {
         final workspaceFolders = obj['workspaceFolders'];
@@ -20620,17 +19967,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
-      try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type InitializeParams');
@@ -20641,17 +19977,17 @@
   @override
   bool operator ==(Object other) {
     if (other is InitializeParams && other.runtimeType == InitializeParams) {
-      return processId == other.processId &&
+      return capabilities == other.capabilities &&
           clientInfo == other.clientInfo &&
+          initializationOptions == other.initializationOptions &&
           locale == other.locale &&
+          processId == other.processId &&
           rootPath == other.rootPath &&
           rootUri == other.rootUri &&
-          initializationOptions == other.initializationOptions &&
-          capabilities == other.capabilities &&
           trace == other.trace &&
+          workDoneToken == other.workDoneToken &&
           listEqual(workspaceFolders, other.workspaceFolders,
               (WorkspaceFolder a, WorkspaceFolder b) => a == b) &&
-          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -20659,16 +19995,16 @@
 
   @override
   int get hashCode => Object.hash(
-        processId,
+        capabilities,
         clientInfo,
+        initializationOptions,
         locale,
+        processId,
         rootPath,
         rootUri,
-        initializationOptions,
-        capabilities,
         trace,
-        lspHashCode(workspaceFolders),
         workDoneToken,
+        lspHashCode(workspaceFolders),
       );
 
   @override
@@ -21006,32 +20342,38 @@
   );
 
   InlayHint({
-    required this.position,
-    required this.label,
+    this.data,
     this.kind,
-    this.textEdits,
-    this.tooltip,
+    required this.label,
     this.paddingLeft,
     this.paddingRight,
-    this.data,
+    required this.position,
+    this.textEdits,
+    this.tooltip,
   });
   static InlayHint fromJson(Map<String, Object?> json) {
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final labelJson = json['label'];
-    final label = labelJson is String
-        ? Either2<String, List<InlayHintLabelPart>>.t1(labelJson)
-        : ((labelJson is List<Object?> &&
-                (labelJson.every((item) =>
-                    InlayHintLabelPart.canParse(item, nullLspJsonReporter))))
-            ? Either2<String, List<InlayHintLabelPart>>.t2((labelJson)
-                .map((item) =>
-                    InlayHintLabelPart.fromJson(item as Map<String, Object?>))
-                .toList())
-            : (throw '''$labelJson was not one of (String, List<InlayHintLabelPart>)'''));
+    final dataJson = json['data'];
+    final data = dataJson;
     final kindJson = json['kind'];
     final kind =
         kindJson != null ? InlayHintKind.fromJson(kindJson as int) : null;
+    final labelJson = json['label'];
+    final label = (labelJson is List<Object?> &&
+            (labelJson.every((item) =>
+                InlayHintLabelPart.canParse(item, nullLspJsonReporter))))
+        ? Either2<List<InlayHintLabelPart>, String>.t1((labelJson)
+            .map((item) =>
+                InlayHintLabelPart.fromJson(item as Map<String, Object?>))
+            .toList())
+        : (labelJson is String
+            ? Either2<List<InlayHintLabelPart>, String>.t2(labelJson)
+            : (throw '''$labelJson was not one of (List<InlayHintLabelPart>, String)'''));
+    final paddingLeftJson = json['paddingLeft'];
+    final paddingLeft = paddingLeftJson as bool?;
+    final paddingRightJson = json['paddingRight'];
+    final paddingRight = paddingRightJson as bool?;
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textEditsJson = json['textEdits'];
     final textEdits = (textEditsJson as List<Object?>?)
         ?.map((item) => TextEdit.fromJson(item as Map<String, Object?>))
@@ -21039,27 +20381,21 @@
     final tooltipJson = json['tooltip'];
     final tooltip = tooltipJson == null
         ? null
-        : (tooltipJson is String
-            ? Either2<String, MarkupContent>.t1(tooltipJson)
-            : (MarkupContent.canParse(tooltipJson, nullLspJsonReporter)
-                ? Either2<String, MarkupContent>.t2(
-                    MarkupContent.fromJson(tooltipJson as Map<String, Object?>))
-                : (throw '''$tooltipJson was not one of (String, MarkupContent)''')));
-    final paddingLeftJson = json['paddingLeft'];
-    final paddingLeft = paddingLeftJson as bool?;
-    final paddingRightJson = json['paddingRight'];
-    final paddingRight = paddingRightJson as bool?;
-    final dataJson = json['data'];
-    final data = dataJson;
+        : (MarkupContent.canParse(tooltipJson, nullLspJsonReporter)
+            ? Either2<MarkupContent, String>.t1(
+                MarkupContent.fromJson(tooltipJson as Map<String, Object?>))
+            : (tooltipJson is String
+                ? Either2<MarkupContent, String>.t2(tooltipJson)
+                : (throw '''$tooltipJson was not one of (MarkupContent, String)''')));
     return InlayHint(
-      position: position,
-      label: label,
+      data: data,
       kind: kind,
-      textEdits: textEdits,
-      tooltip: tooltip,
+      label: label,
       paddingLeft: paddingLeft,
       paddingRight: paddingRight,
-      data: data,
+      position: position,
+      textEdits: textEdits,
+      tooltip: tooltip,
     );
   }
 
@@ -21075,7 +20411,7 @@
   /// InlayHintLabelPart label parts.
   ///
   /// *Note* that neither the string nor the label part can be empty.
-  final Either2<String, List<InlayHintLabelPart>> label;
+  final Either2<List<InlayHintLabelPart>, String> label;
 
   /// Render padding before the hint.
   ///
@@ -21108,48 +20444,40 @@
   ///
   /// Depending on the client capability `inlayHint.resolveSupport` clients
   /// might resolve this property late using the resolve request.
-  final Either2<String, MarkupContent>? tooltip;
+  final Either2<MarkupContent, String>? tooltip;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['position'] = position.toJson();
-    __result['label'] = label;
+    if (data != null) {
+      __result['data'] = data;
+    }
     if (kind != null) {
       __result['kind'] = kind?.toJson();
     }
-    if (textEdits != null) {
-      __result['textEdits'] = textEdits?.map((item) => item.toJson()).toList();
-    }
-    if (tooltip != null) {
-      __result['tooltip'] = tooltip;
-    }
+    __result['label'] = label;
     if (paddingLeft != null) {
       __result['paddingLeft'] = paddingLeft;
     }
     if (paddingRight != null) {
       __result['paddingRight'] = paddingRight;
     }
-    if (data != null) {
-      __result['data'] = data;
+    __result['position'] = position.toJson();
+    if (textEdits != null) {
+      __result['textEdits'] = textEdits?.map((item) => item.toJson()).toList();
+    }
+    if (tooltip != null) {
+      __result['tooltip'] = tooltip;
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('position');
+      reporter.push('kind');
       try {
-        if (!obj.containsKey('position')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final position = obj['position'];
-        if (position == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Position.canParse(position, reporter))) {
-          reporter.reportError('must be of type Position');
+        final kind = obj['kind'];
+        if (kind != null && !(InlayHintKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type InlayHintKind');
           return false;
         }
       } finally {
@@ -21166,48 +20494,12 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((label is String ||
-            (label is List<Object?> &&
-                (label.every((item) =>
-                    InlayHintLabelPart.canParse(item, reporter))))))) {
+        if (!(((label is List<Object?> &&
+                (label.every(
+                    (item) => InlayHintLabelPart.canParse(item, reporter)))) ||
+            label is String))) {
           reporter.reportError(
-              'must be of type Either2<String, List<InlayHintLabelPart>>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('kind');
-      try {
-        final kind = obj['kind'];
-        if (kind != null && !(InlayHintKind.canParse(kind, reporter))) {
-          reporter.reportError('must be of type InlayHintKind');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('textEdits');
-      try {
-        final textEdits = obj['textEdits'];
-        if (textEdits != null &&
-            !((textEdits is List<Object?> &&
-                (textEdits
-                    .every((item) => TextEdit.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextEdit>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('tooltip');
-      try {
-        final tooltip = obj['tooltip'];
-        if (tooltip != null &&
-            !((tooltip is String ||
-                MarkupContent.canParse(tooltip, reporter)))) {
-          reporter
-              .reportError('must be of type Either2<String, MarkupContent>');
+              'must be of type Either2<List<InlayHintLabelPart>, String>');
           return false;
         }
       } finally {
@@ -21233,6 +20525,50 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('position');
+      try {
+        if (!obj.containsKey('position')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final position = obj['position'];
+        if (position == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(position, reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('textEdits');
+      try {
+        final textEdits = obj['textEdits'];
+        if (textEdits != null &&
+            !((textEdits is List<Object?> &&
+                (textEdits
+                    .every((item) => TextEdit.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextEdit>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tooltip');
+      try {
+        final tooltip = obj['tooltip'];
+        if (tooltip != null &&
+            !((MarkupContent.canParse(tooltip, reporter) ||
+                tooltip is String))) {
+          reporter
+              .reportError('must be of type Either2<MarkupContent, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type InlayHint');
@@ -21243,15 +20579,15 @@
   @override
   bool operator ==(Object other) {
     if (other is InlayHint && other.runtimeType == InlayHint) {
-      return position == other.position &&
-          label == other.label &&
+      return data == other.data &&
           kind == other.kind &&
+          label == other.label &&
+          paddingLeft == other.paddingLeft &&
+          paddingRight == other.paddingRight &&
+          position == other.position &&
           listEqual(
               textEdits, other.textEdits, (TextEdit a, TextEdit b) => a == b) &&
           tooltip == other.tooltip &&
-          paddingLeft == other.paddingLeft &&
-          paddingRight == other.paddingRight &&
-          data == other.data &&
           true;
     }
     return false;
@@ -21259,14 +20595,14 @@
 
   @override
   int get hashCode => Object.hash(
-        position,
-        label,
+        data,
         kind,
-        lspHashCode(textEdits),
-        tooltip,
+        label,
         paddingLeft,
         paddingRight,
-        data,
+        position,
+        lspHashCode(textEdits),
+        tooltip,
       );
 
   @override
@@ -21484,36 +20820,36 @@
   );
 
   InlayHintLabelPart({
-    required this.value,
-    this.tooltip,
-    this.location,
     this.command,
+    this.location,
+    this.tooltip,
+    required this.value,
   });
   static InlayHintLabelPart fromJson(Map<String, Object?> json) {
-    final valueJson = json['value'];
-    final value = valueJson as String;
-    final tooltipJson = json['tooltip'];
-    final tooltip = tooltipJson == null
-        ? null
-        : (tooltipJson is String
-            ? Either2<String, MarkupContent>.t1(tooltipJson)
-            : (MarkupContent.canParse(tooltipJson, nullLspJsonReporter)
-                ? Either2<String, MarkupContent>.t2(
-                    MarkupContent.fromJson(tooltipJson as Map<String, Object?>))
-                : (throw '''$tooltipJson was not one of (String, MarkupContent)''')));
-    final locationJson = json['location'];
-    final location = locationJson != null
-        ? Location.fromJson(locationJson as Map<String, Object?>)
-        : null;
     final commandJson = json['command'];
     final command = commandJson != null
         ? Command.fromJson(commandJson as Map<String, Object?>)
         : null;
+    final locationJson = json['location'];
+    final location = locationJson != null
+        ? Location.fromJson(locationJson as Map<String, Object?>)
+        : null;
+    final tooltipJson = json['tooltip'];
+    final tooltip = tooltipJson == null
+        ? null
+        : (MarkupContent.canParse(tooltipJson, nullLspJsonReporter)
+            ? Either2<MarkupContent, String>.t1(
+                MarkupContent.fromJson(tooltipJson as Map<String, Object?>))
+            : (tooltipJson is String
+                ? Either2<MarkupContent, String>.t2(tooltipJson)
+                : (throw '''$tooltipJson was not one of (MarkupContent, String)''')));
+    final valueJson = json['value'];
+    final value = valueJson as String;
     return InlayHintLabelPart(
-      value: value,
-      tooltip: tooltip,
-      location: location,
       command: command,
+      location: location,
+      tooltip: tooltip,
+      value: value,
     );
   }
 
@@ -21538,28 +20874,61 @@
   /// The tooltip text when you hover over this label part. Depending on the
   /// client capability `inlayHint.resolveSupport` clients might resolve this
   /// property late using the resolve request.
-  final Either2<String, MarkupContent>? tooltip;
+  final Either2<MarkupContent, String>? tooltip;
 
   /// The value of this label part.
   final String value;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['value'] = value;
-    if (tooltip != null) {
-      __result['tooltip'] = tooltip;
+    if (command != null) {
+      __result['command'] = command?.toJson();
     }
     if (location != null) {
       __result['location'] = location?.toJson();
     }
-    if (command != null) {
-      __result['command'] = command?.toJson();
+    if (tooltip != null) {
+      __result['tooltip'] = tooltip;
     }
+    __result['value'] = value;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('command');
+      try {
+        final command = obj['command'];
+        if (command != null && !(Command.canParse(command, reporter))) {
+          reporter.reportError('must be of type Command');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('location');
+      try {
+        final location = obj['location'];
+        if (location != null && !(Location.canParse(location, reporter))) {
+          reporter.reportError('must be of type Location');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tooltip');
+      try {
+        final tooltip = obj['tooltip'];
+        if (tooltip != null &&
+            !((MarkupContent.canParse(tooltip, reporter) ||
+                tooltip is String))) {
+          reporter
+              .reportError('must be of type Either2<MarkupContent, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('value');
       try {
         if (!obj.containsKey('value')) {
@@ -21578,39 +20947,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tooltip');
-      try {
-        final tooltip = obj['tooltip'];
-        if (tooltip != null &&
-            !((tooltip is String ||
-                MarkupContent.canParse(tooltip, reporter)))) {
-          reporter
-              .reportError('must be of type Either2<String, MarkupContent>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('location');
-      try {
-        final location = obj['location'];
-        if (location != null && !(Location.canParse(location, reporter))) {
-          reporter.reportError('must be of type Location');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('command');
-      try {
-        final command = obj['command'];
-        if (command != null && !(Command.canParse(command, reporter))) {
-          reporter.reportError('must be of type Command');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type InlayHintLabelPart');
@@ -21622,10 +20958,10 @@
   bool operator ==(Object other) {
     if (other is InlayHintLabelPart &&
         other.runtimeType == InlayHintLabelPart) {
-      return value == other.value &&
-          tooltip == other.tooltip &&
+      return command == other.command &&
           location == other.location &&
-          command == other.command &&
+          tooltip == other.tooltip &&
+          value == other.value &&
           true;
     }
     return false;
@@ -21633,10 +20969,10 @@
 
   @override
   int get hashCode => Object.hash(
-        value,
-        tooltip,
-        location,
         command,
+        location,
+        tooltip,
+        value,
       );
 
   @override
@@ -21743,16 +21079,16 @@
   );
 
   InlayHintParams({
-    required this.textDocument,
     required this.range,
+    required this.textDocument,
     this.workDoneToken,
   });
   static InlayHintParams fromJson(Map<String, Object?> json) {
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -21762,8 +21098,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return InlayHintParams(
-      textDocument: textDocument,
       range: range,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -21779,8 +21115,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['range'] = range.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -21789,24 +21125,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -21825,6 +21143,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -21846,8 +21182,8 @@
   @override
   bool operator ==(Object other) {
     if (other is InlayHintParams && other.runtimeType == InlayHintParams) {
-      return textDocument == other.textDocument &&
-          range == other.range &&
+      return range == other.range &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -21856,8 +21192,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         range,
+        textDocument,
         workDoneToken,
       );
 
@@ -21879,33 +21215,34 @@
   );
 
   InlayHintRegistrationOptions({
-    this.resolveProvider,
-    this.workDoneProgress,
     this.documentSelector,
     this.id,
+    this.resolveProvider,
+    this.workDoneProgress,
   });
   static InlayHintRegistrationOptions fromJson(Map<String, Object?> json) {
+    final documentSelectorJson = json['documentSelector'];
+    final documentSelector = (documentSelectorJson as List<Object?>?)
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
+        .toList();
+    final idJson = json['id'];
+    final id = idJson as String?;
     final resolveProviderJson = json['resolveProvider'];
     final resolveProvider = resolveProviderJson as bool?;
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
-    final documentSelectorJson = json['documentSelector'];
-    final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
-        .toList();
-    final idJson = json['id'];
-    final id = idJson as String?;
     return InlayHintRegistrationOptions(
-      resolveProvider: resolveProvider,
-      workDoneProgress: workDoneProgress,
       documentSelector: documentSelector,
       id: id,
+      resolveProvider: resolveProvider,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -21918,21 +21255,48 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['documentSelector'] = documentSelector;
+    if (id != null) {
+      __result['id'] = id;
+    }
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
-    __result['documentSelector'] = documentSelector;
-    if (id != null) {
-      __result['id'] = id;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final documentSelector = obj['documentSelector'];
+        if (documentSelector != null &&
+            !((documentSelector is List<Object?> &&
+                (documentSelector.every(
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('resolveProvider');
       try {
         final resolveProvider = obj['resolveProvider'];
@@ -21953,33 +21317,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentSelector');
-      try {
-        if (!obj.containsKey('documentSelector')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final documentSelector = obj['documentSelector'];
-        if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('id');
-      try {
-        final id = obj['id'];
-        if (id != null && !(id is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type InlayHintRegistrationOptions');
@@ -21991,11 +21328,11 @@
   bool operator ==(Object other) {
     if (other is InlayHintRegistrationOptions &&
         other.runtimeType == InlayHintRegistrationOptions) {
-      return resolveProvider == other.resolveProvider &&
-          workDoneProgress == other.workDoneProgress &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -22003,10 +21340,10 @@
 
   @override
   int get hashCode => Object.hash(
-        resolveProvider,
-        workDoneProgress,
         lspHashCode(documentSelector),
         id,
+        resolveProvider,
+        workDoneProgress,
       );
 
   @override
@@ -22238,17 +21575,17 @@
   );
 
   InlineValueEvaluatableExpression({
-    required this.range,
     this.expression,
+    required this.range,
   });
   static InlineValueEvaluatableExpression fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final expressionJson = json['expression'];
     final expression = expressionJson as String?;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return InlineValueEvaluatableExpression(
-      range: range,
       expression: expression,
+      range: range,
     );
   }
 
@@ -22261,15 +21598,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     if (expression != null) {
       __result['expression'] = expression;
     }
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('expression');
+      try {
+        final expression = obj['expression'];
+        if (expression != null && !(expression is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -22288,16 +21635,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('expression');
-      try {
-        final expression = obj['expression'];
-        if (expression != null && !(expression is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type InlineValueEvaluatableExpression');
@@ -22309,15 +21646,15 @@
   bool operator ==(Object other) {
     if (other is InlineValueEvaluatableExpression &&
         other.runtimeType == InlineValueEvaluatableExpression) {
-      return range == other.range && expression == other.expression && true;
+      return expression == other.expression && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         expression,
+        range,
       );
 
   @override
@@ -22400,20 +21737,20 @@
   );
 
   InlineValueParams({
-    required this.textDocument,
-    required this.range,
     required this.context,
+    required this.range,
+    required this.textDocument,
     this.workDoneToken,
   });
   static InlineValueParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final contextJson = json['context'];
     final context =
         InlineValueContext.fromJson(contextJson as Map<String, Object?>);
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -22423,9 +21760,9 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return InlineValueParams(
-      textDocument: textDocument,
-      range: range,
       context: context,
+      range: range,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -22445,9 +21782,9 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['range'] = range.toJson();
     __result['context'] = context.toJson();
+    __result['range'] = range.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -22456,19 +21793,19 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('context');
       try {
-        if (!obj.containsKey('textDocument')) {
+        if (!obj.containsKey('context')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
+        final context = obj['context'];
+        if (context == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        if (!(InlineValueContext.canParse(context, reporter))) {
+          reporter.reportError('must be of type InlineValueContext');
           return false;
         }
       } finally {
@@ -22492,19 +21829,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('context');
+      reporter.push('textDocument');
       try {
-        if (!obj.containsKey('context')) {
+        if (!obj.containsKey('textDocument')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final context = obj['context'];
-        if (context == null) {
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(InlineValueContext.canParse(context, reporter))) {
-          reporter.reportError('must be of type InlineValueContext');
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
@@ -22531,9 +21868,9 @@
   @override
   bool operator ==(Object other) {
     if (other is InlineValueParams && other.runtimeType == InlineValueParams) {
-      return textDocument == other.textDocument &&
+      return context == other.context &&
           range == other.range &&
-          context == other.context &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -22542,9 +21879,9 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        range,
         context,
+        range,
+        textDocument,
         workDoneToken,
       );
 
@@ -22566,29 +21903,30 @@
   );
 
   InlineValueRegistrationOptions({
-    this.workDoneProgress,
     this.documentSelector,
     this.id,
+    this.workDoneProgress,
   });
   static InlineValueRegistrationOptions fromJson(Map<String, Object?> json) {
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return InlineValueRegistrationOptions(
-      workDoneProgress: workDoneProgress,
       documentSelector: documentSelector,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -22597,28 +21935,18 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     __result['documentSelector'] = documentSelector;
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -22629,8 +21957,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -22646,6 +21974,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type InlineValueRegistrationOptions');
@@ -22657,10 +21995,10 @@
   bool operator ==(Object other) {
     if (other is InlineValueRegistrationOptions &&
         other.runtimeType == InlineValueRegistrationOptions) {
-      return workDoneProgress == other.workDoneProgress &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -22668,9 +22006,9 @@
 
   @override
   int get hashCode => Object.hash(
-        workDoneProgress,
         lspHashCode(documentSelector),
         id,
+        workDoneProgress,
       );
 
   @override
@@ -22790,21 +22128,21 @@
   );
 
   InlineValueVariableLookup({
+    required this.caseSensitiveLookup,
     required this.range,
     this.variableName,
-    required this.caseSensitiveLookup,
   });
   static InlineValueVariableLookup fromJson(Map<String, Object?> json) {
+    final caseSensitiveLookupJson = json['caseSensitiveLookup'];
+    final caseSensitiveLookup = caseSensitiveLookupJson as bool;
     final rangeJson = json['range'];
     final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final variableNameJson = json['variableName'];
     final variableName = variableNameJson as String?;
-    final caseSensitiveLookupJson = json['caseSensitiveLookup'];
-    final caseSensitiveLookup = caseSensitiveLookupJson as bool;
     return InlineValueVariableLookup(
+      caseSensitiveLookup: caseSensitiveLookup,
       range: range,
       variableName: variableName,
-      caseSensitiveLookup: caseSensitiveLookup,
     );
   }
 
@@ -22820,16 +22158,34 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['caseSensitiveLookup'] = caseSensitiveLookup;
     __result['range'] = range.toJson();
     if (variableName != null) {
       __result['variableName'] = variableName;
     }
-    __result['caseSensitiveLookup'] = caseSensitiveLookup;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('caseSensitiveLookup');
+      try {
+        if (!obj.containsKey('caseSensitiveLookup')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final caseSensitiveLookup = obj['caseSensitiveLookup'];
+        if (caseSensitiveLookup == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(caseSensitiveLookup is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -22858,24 +22214,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('caseSensitiveLookup');
-      try {
-        if (!obj.containsKey('caseSensitiveLookup')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final caseSensitiveLookup = obj['caseSensitiveLookup'];
-        if (caseSensitiveLookup == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(caseSensitiveLookup is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type InlineValueVariableLookup');
@@ -22887,9 +22225,9 @@
   bool operator ==(Object other) {
     if (other is InlineValueVariableLookup &&
         other.runtimeType == InlineValueVariableLookup) {
-      return range == other.range &&
+      return caseSensitiveLookup == other.caseSensitiveLookup &&
+          range == other.range &&
           variableName == other.variableName &&
-          caseSensitiveLookup == other.caseSensitiveLookup &&
           true;
     }
     return false;
@@ -22897,9 +22235,9 @@
 
   @override
   int get hashCode => Object.hash(
+        caseSensitiveLookup,
         range,
         variableName,
-        caseSensitiveLookup,
       );
 
   @override
@@ -22988,20 +22326,20 @@
   );
 
   InsertReplaceEdit({
-    required this.newText,
     required this.insert,
+    required this.newText,
     required this.replace,
   });
   static InsertReplaceEdit fromJson(Map<String, Object?> json) {
-    final newTextJson = json['newText'];
-    final newText = newTextJson as String;
     final insertJson = json['insert'];
     final insert = Range.fromJson(insertJson as Map<String, Object?>);
+    final newTextJson = json['newText'];
+    final newText = newTextJson as String;
     final replaceJson = json['replace'];
     final replace = Range.fromJson(replaceJson as Map<String, Object?>);
     return InsertReplaceEdit(
-      newText: newText,
       insert: insert,
+      newText: newText,
       replace: replace,
     );
   }
@@ -23017,32 +22355,14 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['newText'] = newText;
     __result['insert'] = insert.toJson();
+    __result['newText'] = newText;
     __result['replace'] = replace.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('newText');
-      try {
-        if (!obj.containsKey('newText')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final newText = obj['newText'];
-        if (newText == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(newText is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('insert');
       try {
         if (!obj.containsKey('insert')) {
@@ -23061,6 +22381,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('newText');
+      try {
+        if (!obj.containsKey('newText')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final newText = obj['newText'];
+        if (newText == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(newText is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('replace');
       try {
         if (!obj.containsKey('replace')) {
@@ -23089,8 +22427,8 @@
   @override
   bool operator ==(Object other) {
     if (other is InsertReplaceEdit && other.runtimeType == InsertReplaceEdit) {
-      return newText == other.newText &&
-          insert == other.insert &&
+      return insert == other.insert &&
+          newText == other.newText &&
           replace == other.replace &&
           true;
     }
@@ -23099,8 +22437,8 @@
 
   @override
   int get hashCode => Object.hash(
-        newText,
         insert,
+        newText,
         replace,
       );
 
@@ -23326,16 +22664,16 @@
   );
 
   LinkedEditingRangeParams({
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
     this.workDoneToken,
   });
   static LinkedEditingRangeParams fromJson(Map<String, Object?> json) {
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -23345,8 +22683,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return LinkedEditingRangeParams(
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -23362,8 +22700,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -23372,24 +22710,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -23408,6 +22728,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -23430,8 +22768,8 @@
   bool operator ==(Object other) {
     if (other is LinkedEditingRangeParams &&
         other.runtimeType == LinkedEditingRangeParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
+      return position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -23440,8 +22778,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         position,
+        textDocument,
         workDoneToken,
       );
 
@@ -23462,29 +22800,30 @@
 
   LinkedEditingRangeRegistrationOptions({
     this.documentSelector,
-    this.workDoneProgress,
     this.id,
+    this.workDoneProgress,
   });
   static LinkedEditingRangeRegistrationOptions fromJson(
       Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return LinkedEditingRangeRegistrationOptions(
       documentSelector: documentSelector,
-      workDoneProgress: workDoneProgress,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -23494,12 +22833,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -23515,18 +22854,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -23542,6 +22871,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter
@@ -23555,9 +22894,9 @@
     if (other is LinkedEditingRangeRegistrationOptions &&
         other.runtimeType == LinkedEditingRangeRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          workDoneProgress == other.workDoneProgress &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -23566,8 +22905,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        workDoneProgress,
         id,
+        workDoneProgress,
       );
 
   @override
@@ -23682,17 +23021,17 @@
   );
 
   Location({
-    required this.uri,
     required this.range,
+    required this.uri,
   });
   static Location fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final rangeJson = json['range'];
     final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return Location(
-      uri: uri,
       range: range,
+      uri: uri,
     );
   }
 
@@ -23701,31 +23040,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
     __result['range'] = range.toJson();
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final uri = obj['uri'];
-        if (uri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -23744,6 +23065,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type Location');
@@ -23754,15 +23093,15 @@
   @override
   bool operator ==(Object other) {
     if (other is Location && other.runtimeType == Location) {
-      return uri == other.uri && range == other.range && true;
+      return range == other.range && uri == other.uri && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        uri,
         range,
+        uri,
       );
 
   @override
@@ -23777,27 +23116,27 @@
 
   LocationLink({
     this.originSelectionRange,
-    required this.targetUri,
     required this.targetRange,
     required this.targetSelectionRange,
+    required this.targetUri,
   });
   static LocationLink fromJson(Map<String, Object?> json) {
     final originSelectionRangeJson = json['originSelectionRange'];
     final originSelectionRange = originSelectionRangeJson != null
         ? Range.fromJson(originSelectionRangeJson as Map<String, Object?>)
         : null;
-    final targetUriJson = json['targetUri'];
-    final targetUri = targetUriJson as String;
     final targetRangeJson = json['targetRange'];
     final targetRange = Range.fromJson(targetRangeJson as Map<String, Object?>);
     final targetSelectionRangeJson = json['targetSelectionRange'];
     final targetSelectionRange =
         Range.fromJson(targetSelectionRangeJson as Map<String, Object?>);
+    final targetUriJson = json['targetUri'];
+    final targetUri = targetUriJson as String;
     return LocationLink(
       originSelectionRange: originSelectionRange,
-      targetUri: targetUri,
       targetRange: targetRange,
       targetSelectionRange: targetSelectionRange,
+      targetUri: targetUri,
     );
   }
 
@@ -23826,9 +23165,9 @@
     if (originSelectionRange != null) {
       __result['originSelectionRange'] = originSelectionRange?.toJson();
     }
-    __result['targetUri'] = targetUri;
     __result['targetRange'] = targetRange.toJson();
     __result['targetSelectionRange'] = targetSelectionRange.toJson();
+    __result['targetUri'] = targetUri;
     return __result;
   }
 
@@ -23845,24 +23184,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('targetUri');
-      try {
-        if (!obj.containsKey('targetUri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final targetUri = obj['targetUri'];
-        if (targetUri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(targetUri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('targetRange');
       try {
         if (!obj.containsKey('targetRange')) {
@@ -23899,6 +23220,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('targetUri');
+      try {
+        if (!obj.containsKey('targetUri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final targetUri = obj['targetUri'];
+        if (targetUri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(targetUri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type LocationLink');
@@ -23910,9 +23249,9 @@
   bool operator ==(Object other) {
     if (other is LocationLink && other.runtimeType == LocationLink) {
       return originSelectionRange == other.originSelectionRange &&
-          targetUri == other.targetUri &&
           targetRange == other.targetRange &&
           targetSelectionRange == other.targetSelectionRange &&
+          targetUri == other.targetUri &&
           true;
     }
     return false;
@@ -23921,9 +23260,9 @@
   @override
   int get hashCode => Object.hash(
         originSelectionRange,
-        targetUri,
         targetRange,
         targetSelectionRange,
+        targetUri,
       );
 
   @override
@@ -23937,17 +23276,17 @@
   );
 
   LogMessageParams({
-    required this.type,
     required this.message,
+    required this.type,
   });
   static LogMessageParams fromJson(Map<String, Object?> json) {
-    final typeJson = json['type'];
-    final type = MessageType.fromJson(typeJson as int);
     final messageJson = json['message'];
     final message = messageJson as String;
+    final typeJson = json['type'];
+    final type = MessageType.fromJson(typeJson as int);
     return LogMessageParams(
-      type: type,
       message: message,
+      type: type,
     );
   }
 
@@ -23959,31 +23298,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['type'] = type.toJson();
     __result['message'] = message;
+    __result['type'] = type.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('type');
-      try {
-        if (!obj.containsKey('type')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final type = obj['type'];
-        if (type == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(MessageType.canParse(type, reporter))) {
-          reporter.reportError('must be of type MessageType');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
@@ -24002,6 +23323,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('type');
+      try {
+        if (!obj.containsKey('type')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final type = obj['type'];
+        if (type == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(MessageType.canParse(type, reporter))) {
+          reporter.reportError('must be of type MessageType');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type LogMessageParams');
@@ -24012,15 +23351,15 @@
   @override
   bool operator ==(Object other) {
     if (other is LogMessageParams && other.runtimeType == LogMessageParams) {
-      return type == other.type && message == other.message && true;
+      return message == other.message && type == other.type && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        type,
         message,
+        type,
       );
 
   @override
@@ -24128,23 +23467,23 @@
   );
 
   MarkdownClientCapabilities({
+    this.allowedTags,
     required this.parser,
     this.version,
-    this.allowedTags,
   });
   static MarkdownClientCapabilities fromJson(Map<String, Object?> json) {
-    final parserJson = json['parser'];
-    final parser = parserJson as String;
-    final versionJson = json['version'];
-    final version = versionJson as String?;
     final allowedTagsJson = json['allowedTags'];
     final allowedTags = (allowedTagsJson as List<Object?>?)
         ?.map((item) => item as String)
         .toList();
+    final parserJson = json['parser'];
+    final parser = parserJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as String?;
     return MarkdownClientCapabilities(
+      allowedTags: allowedTags,
       parser: parser,
       version: version,
-      allowedTags: allowedTags,
     );
   }
 
@@ -24160,18 +23499,30 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (allowedTags != null) {
+      __result['allowedTags'] = allowedTags;
+    }
     __result['parser'] = parser;
     if (version != null) {
       __result['version'] = version;
     }
-    if (allowedTags != null) {
-      __result['allowedTags'] = allowedTags;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('allowedTags');
+      try {
+        final allowedTags = obj['allowedTags'];
+        if (allowedTags != null &&
+            !((allowedTags is List<Object?> &&
+                (allowedTags.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('parser');
       try {
         if (!obj.containsKey('parser')) {
@@ -24200,18 +23551,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('allowedTags');
-      try {
-        final allowedTags = obj['allowedTags'];
-        if (allowedTags != null &&
-            !((allowedTags is List<Object?> &&
-                (allowedTags.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type MarkdownClientCapabilities');
@@ -24223,10 +23562,10 @@
   bool operator ==(Object other) {
     if (other is MarkdownClientCapabilities &&
         other.runtimeType == MarkdownClientCapabilities) {
-      return parser == other.parser &&
-          version == other.version &&
-          listEqual(
+      return listEqual(
               allowedTags, other.allowedTags, (String a, String b) => a == b) &&
+          parser == other.parser &&
+          version == other.version &&
           true;
     }
     return false;
@@ -24234,9 +23573,9 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(allowedTags),
         parser,
         version,
-        lspHashCode(allowedTags),
       );
 
   @override
@@ -24404,8 +23743,8 @@
   );
 
   Message({
-    required this.jsonrpc,
     this.clientRequestTime,
+    required this.jsonrpc,
   });
   static Message fromJson(Map<String, Object?> json) {
     if (RequestMessage.canParse(json, nullLspJsonReporter)) {
@@ -24417,13 +23756,13 @@
     if (NotificationMessage.canParse(json, nullLspJsonReporter)) {
       return NotificationMessage.fromJson(json);
     }
-    final jsonrpcJson = json['jsonrpc'];
-    final jsonrpc = jsonrpcJson as String;
     final clientRequestTimeJson = json['clientRequestTime'];
     final clientRequestTime = clientRequestTimeJson as int?;
+    final jsonrpcJson = json['jsonrpc'];
+    final jsonrpc = jsonrpcJson as String;
     return Message(
-      jsonrpc: jsonrpc,
       clientRequestTime: clientRequestTime,
+      jsonrpc: jsonrpc,
     );
   }
 
@@ -24432,15 +23771,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['jsonrpc'] = jsonrpc;
     if (clientRequestTime != null) {
       __result['clientRequestTime'] = clientRequestTime;
     }
+    __result['jsonrpc'] = jsonrpc;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('clientRequestTime');
+      try {
+        final clientRequestTime = obj['clientRequestTime'];
+        if (clientRequestTime != null && !(clientRequestTime is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
@@ -24459,16 +23808,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('clientRequestTime');
-      try {
-        final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type Message');
@@ -24479,8 +23818,8 @@
   @override
   bool operator ==(Object other) {
     if (other is Message && other.runtimeType == Message) {
-      return jsonrpc == other.jsonrpc &&
-          clientRequestTime == other.clientRequestTime &&
+      return clientRequestTime == other.clientRequestTime &&
+          jsonrpc == other.jsonrpc &&
           true;
     }
     return false;
@@ -24488,8 +23827,8 @@
 
   @override
   int get hashCode => Object.hash(
-        jsonrpc,
         clientRequestTime,
+        jsonrpc,
       );
 
   @override
@@ -24925,26 +24264,26 @@
   );
 
   Moniker({
-    required this.scheme,
     required this.identifier,
-    required this.unique,
     this.kind,
+    required this.scheme,
+    required this.unique,
   });
   static Moniker fromJson(Map<String, Object?> json) {
-    final schemeJson = json['scheme'];
-    final scheme = schemeJson as String;
     final identifierJson = json['identifier'];
     final identifier = identifierJson as String;
-    final uniqueJson = json['unique'];
-    final unique = UniquenessLevel.fromJson(uniqueJson as String);
     final kindJson = json['kind'];
     final kind =
         kindJson != null ? MonikerKind.fromJson(kindJson as String) : null;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String;
+    final uniqueJson = json['unique'];
+    final unique = UniquenessLevel.fromJson(uniqueJson as String);
     return Moniker(
-      scheme: scheme,
       identifier: identifier,
-      unique: unique,
       kind: kind,
+      scheme: scheme,
+      unique: unique,
     );
   }
 
@@ -24963,35 +24302,17 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['scheme'] = scheme;
     __result['identifier'] = identifier;
-    __result['unique'] = unique.toJson();
     if (kind != null) {
       __result['kind'] = kind?.toJson();
     }
+    __result['scheme'] = scheme;
+    __result['unique'] = unique.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('scheme');
-      try {
-        if (!obj.containsKey('scheme')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final scheme = obj['scheme'];
-        if (scheme == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(scheme is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('identifier');
       try {
         if (!obj.containsKey('identifier')) {
@@ -25010,6 +24331,34 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('kind');
+      try {
+        final kind = obj['kind'];
+        if (kind != null && !(MonikerKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type MonikerKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('scheme');
+      try {
+        if (!obj.containsKey('scheme')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final scheme = obj['scheme'];
+        if (scheme == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('unique');
       try {
         if (!obj.containsKey('unique')) {
@@ -25028,16 +24377,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('kind');
-      try {
-        final kind = obj['kind'];
-        if (kind != null && !(MonikerKind.canParse(kind, reporter))) {
-          reporter.reportError('must be of type MonikerKind');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type Moniker');
@@ -25048,10 +24387,10 @@
   @override
   bool operator ==(Object other) {
     if (other is Moniker && other.runtimeType == Moniker) {
-      return scheme == other.scheme &&
-          identifier == other.identifier &&
-          unique == other.unique &&
+      return identifier == other.identifier &&
           kind == other.kind &&
+          scheme == other.scheme &&
+          unique == other.unique &&
           true;
     }
     return false;
@@ -25059,10 +24398,10 @@
 
   @override
   int get hashCode => Object.hash(
-        scheme,
         identifier,
-        unique,
         kind,
+        scheme,
+        unique,
       );
 
   @override
@@ -25243,25 +24582,12 @@
   );
 
   MonikerParams({
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static MonikerParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -25270,11 +24596,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return MonikerParams(
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -25293,32 +24632,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -25342,22 +24674,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -25374,10 +24713,10 @@
   @override
   bool operator ==(Object other) {
     if (other is MonikerParams && other.runtimeType == MonikerParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -25385,10 +24724,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -25409,7 +24748,8 @@
   static MonikerRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -25421,7 +24761,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -25445,8 +24785,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -25474,7 +24814,7 @@
     if (other is MonikerRegistrationOptions &&
         other.runtimeType == MonikerRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -25504,28 +24844,28 @@
   );
 
   NotebookCell({
-    required this.kind,
     required this.document,
-    this.metadata,
     this.executionSummary,
+    required this.kind,
+    this.metadata,
   });
   static NotebookCell fromJson(Map<String, Object?> json) {
-    final kindJson = json['kind'];
-    final kind = NotebookCellKind.fromJson(kindJson as int);
     final documentJson = json['document'];
     final document = documentJson as String;
-    final metadataJson = json['metadata'];
-    final metadata = metadataJson;
     final executionSummaryJson = json['executionSummary'];
     final executionSummary = executionSummaryJson != null
         ? ExecutionSummary.fromJson(
             executionSummaryJson as Map<String, Object?>)
         : null;
+    final kindJson = json['kind'];
+    final kind = NotebookCellKind.fromJson(kindJson as int);
+    final metadataJson = json['metadata'];
+    final metadata = metadataJson;
     return NotebookCell(
-      kind: kind,
       document: document,
-      metadata: metadata,
       executionSummary: executionSummary,
+      kind: kind,
+      metadata: metadata,
     );
   }
 
@@ -25543,37 +24883,19 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind.toJson();
     __result['document'] = document;
-    if (metadata != null) {
-      __result['metadata'] = metadata;
-    }
     if (executionSummary != null) {
       __result['executionSummary'] = executionSummary?.toJson();
     }
+    __result['kind'] = kind.toJson();
+    if (metadata != null) {
+      __result['metadata'] = metadata;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('kind');
-      try {
-        if (!obj.containsKey('kind')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final kind = obj['kind'];
-        if (kind == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(NotebookCellKind.canParse(kind, reporter))) {
-          reporter.reportError('must be of type NotebookCellKind');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('document');
       try {
         if (!obj.containsKey('document')) {
@@ -25603,6 +24925,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(NotebookCellKind.canParse(kind, reporter))) {
+          reporter.reportError('must be of type NotebookCellKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type NotebookCell');
@@ -25613,10 +24953,10 @@
   @override
   bool operator ==(Object other) {
     if (other is NotebookCell && other.runtimeType == NotebookCell) {
-      return kind == other.kind &&
-          document == other.document &&
-          metadata == other.metadata &&
+      return document == other.document &&
           executionSummary == other.executionSummary &&
+          kind == other.kind &&
+          metadata == other.metadata &&
           true;
     }
     return false;
@@ -25624,10 +24964,10 @@
 
   @override
   int get hashCode => Object.hash(
-        kind,
         document,
-        metadata,
         executionSummary,
+        kind,
+        metadata,
       );
 
   @override
@@ -25643,23 +24983,23 @@
   );
 
   NotebookCellArrayChange({
-    required this.start,
-    required this.deleteCount,
     this.cells,
+    required this.deleteCount,
+    required this.start,
   });
   static NotebookCellArrayChange fromJson(Map<String, Object?> json) {
-    final startJson = json['start'];
-    final start = startJson as int;
-    final deleteCountJson = json['deleteCount'];
-    final deleteCount = deleteCountJson as int;
     final cellsJson = json['cells'];
     final cells = (cellsJson as List<Object?>?)
         ?.map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
         .toList();
+    final deleteCountJson = json['deleteCount'];
+    final deleteCount = deleteCountJson as int;
+    final startJson = json['start'];
+    final start = startJson as int;
     return NotebookCellArrayChange(
-      start: start,
-      deleteCount: deleteCount,
       cells: cells,
+      deleteCount: deleteCount,
+      start: start,
     );
   }
 
@@ -25674,29 +25014,24 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['start'] = start;
-    __result['deleteCount'] = deleteCount;
     if (cells != null) {
       __result['cells'] = cells?.map((item) => item.toJson()).toList();
     }
+    __result['deleteCount'] = deleteCount;
+    __result['start'] = start;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('start');
+      reporter.push('cells');
       try {
-        if (!obj.containsKey('start')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final start = obj['start'];
-        if (start == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(start is int)) {
-          reporter.reportError('must be of type int');
+        final cells = obj['cells'];
+        if (cells != null &&
+            !((cells is List<Object?> &&
+                (cells.every(
+                    (item) => NotebookCell.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<NotebookCell>');
           return false;
         }
       } finally {
@@ -25720,14 +25055,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('cells');
+      reporter.push('start');
       try {
-        final cells = obj['cells'];
-        if (cells != null &&
-            !((cells is List<Object?> &&
-                (cells.every(
-                    (item) => NotebookCell.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<NotebookCell>');
+        if (!obj.containsKey('start')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final start = obj['start'];
+        if (start == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(start is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -25744,10 +25084,10 @@
   bool operator ==(Object other) {
     if (other is NotebookCellArrayChange &&
         other.runtimeType == NotebookCellArrayChange) {
-      return start == other.start &&
-          deleteCount == other.deleteCount &&
-          listEqual(
+      return listEqual(
               cells, other.cells, (NotebookCell a, NotebookCell b) => a == b) &&
+          deleteCount == other.deleteCount &&
+          start == other.start &&
           true;
     }
     return false;
@@ -25755,9 +25095,9 @@
 
   @override
   int get hashCode => Object.hash(
-        start,
-        deleteCount,
         lspHashCode(cells),
+        deleteCount,
+        start,
       );
 
   @override
@@ -25803,34 +25143,31 @@
   );
 
   NotebookCellTextDocumentFilter({
-    required this.notebook,
     this.language,
+    required this.notebook,
   });
   static NotebookCellTextDocumentFilter fromJson(Map<String, Object?> json) {
-    final notebookJson = json['notebook'];
-    final notebook = notebookJson is String
-        ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t1(
-            notebookJson)
-        : ((NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
-                NotebookDocumentFilter2.canParse(
-                    notebookJson, nullLspJsonReporter) ||
-                NotebookDocumentFilter3.canParse(
-                    notebookJson, nullLspJsonReporter))
-            ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t2(
-                NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter)
-                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
-                        NotebookDocumentFilter1.fromJson(
-                            notebookJson as Map<String, Object?>))
-                    : (NotebookDocumentFilter2.canParse(notebookJson, nullLspJsonReporter)
-                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
-                            NotebookDocumentFilter2.fromJson(notebookJson as Map<String, Object?>))
-                        : (NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookJson as Map<String, Object?>)) : (throw '''$notebookJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
-            : (throw '''$notebookJson was not one of (String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>)'''));
     final languageJson = json['language'];
     final language = languageJson as String?;
+    final notebookJson = json['notebook'];
+    final notebook = (NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter) ||
+            NotebookDocumentFilter2.canParse(
+                notebookJson, nullLspJsonReporter) ||
+            NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter))
+        ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
+            NotebookDocumentFilter1.canParse(notebookJson, nullLspJsonReporter)
+                ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(NotebookDocumentFilter1.fromJson(
+                    notebookJson as Map<String, Object?>))
+                : (NotebookDocumentFilter2.canParse(notebookJson, nullLspJsonReporter)
+                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(NotebookDocumentFilter2.fromJson(
+                        notebookJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter3.canParse(notebookJson, nullLspJsonReporter)
+                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookJson as Map<String, Object?>))
+                        : (throw '''$notebookJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+        : (notebookJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookJson) : (throw '''$notebookJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)'''));
     return NotebookCellTextDocumentFilter(
-      notebook: notebook,
       language: language,
+      notebook: notebook,
     );
   }
 
@@ -25844,21 +25181,31 @@
   /// If a string value is provided it matches against the notebook type. '*'
   /// matches every notebook.
   final Either2<
-      String,
       Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
-          NotebookDocumentFilter3>> notebook;
+          NotebookDocumentFilter3>,
+      String> notebook;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['notebook'] = notebook;
     if (language != null) {
       __result['language'] = language;
     }
+    __result['notebook'] = notebook;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('language');
+      try {
+        final language = obj['language'];
+        if (language != null && !(language is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('notebook');
       try {
         if (!obj.containsKey('notebook')) {
@@ -25870,22 +25217,12 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((notebook is String ||
-            (NotebookDocumentFilter1.canParse(notebook, reporter) ||
+        if (!(((NotebookDocumentFilter1.canParse(notebook, reporter) ||
                 NotebookDocumentFilter2.canParse(notebook, reporter) ||
-                NotebookDocumentFilter3.canParse(notebook, reporter))))) {
+                NotebookDocumentFilter3.canParse(notebook, reporter)) ||
+            notebook is String))) {
           reporter.reportError(
-              'must be of type Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('language');
-      try {
-        final language = obj['language'];
-        if (language != null && !(language is String)) {
-          reporter.reportError('must be of type String');
+              'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
           return false;
         }
       } finally {
@@ -25902,15 +25239,15 @@
   bool operator ==(Object other) {
     if (other is NotebookCellTextDocumentFilter &&
         other.runtimeType == NotebookCellTextDocumentFilter) {
-      return notebook == other.notebook && language == other.language && true;
+      return language == other.language && notebook == other.notebook && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        notebook,
         language,
+        notebook,
       );
 
   @override
@@ -25926,31 +25263,31 @@
   );
 
   NotebookDocument({
-    required this.uri,
-    required this.notebookType,
-    required this.version,
-    this.metadata,
     required this.cells,
+    this.metadata,
+    required this.notebookType,
+    required this.uri,
+    required this.version,
   });
   static NotebookDocument fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
-    final notebookTypeJson = json['notebookType'];
-    final notebookType = notebookTypeJson as String;
-    final versionJson = json['version'];
-    final version = versionJson as int;
-    final metadataJson = json['metadata'];
-    final metadata = metadataJson;
     final cellsJson = json['cells'];
     final cells = (cellsJson as List<Object?>)
         .map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
         .toList();
+    final metadataJson = json['metadata'];
+    final metadata = metadataJson;
+    final notebookTypeJson = json['notebookType'];
+    final notebookType = notebookTypeJson as String;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int;
     return NotebookDocument(
-      uri: uri,
-      notebookType: notebookType,
-      version: version,
-      metadata: metadata,
       cells: cells,
+      metadata: metadata,
+      notebookType: notebookType,
+      uri: uri,
+      version: version,
     );
   }
 
@@ -25972,31 +25309,32 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
-    __result['notebookType'] = notebookType;
-    __result['version'] = version;
+    __result['cells'] = cells.map((item) => item.toJson()).toList();
     if (metadata != null) {
       __result['metadata'] = metadata;
     }
-    __result['cells'] = cells.map((item) => item.toJson()).toList();
+    __result['notebookType'] = notebookType;
+    __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
+      reporter.push('cells');
       try {
-        if (!obj.containsKey('uri')) {
+        if (!obj.containsKey('cells')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final uri = obj['uri'];
-        if (uri == null) {
+        final cells = obj['cells'];
+        if (cells == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
+        if (!((cells is List<Object?> &&
+            (cells.every((item) => NotebookCell.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<NotebookCell>');
           return false;
         }
       } finally {
@@ -26020,6 +25358,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('version');
       try {
         if (!obj.containsKey('version')) {
@@ -26038,25 +25394,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('cells');
-      try {
-        if (!obj.containsKey('cells')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final cells = obj['cells'];
-        if (cells == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((cells is List<Object?> &&
-            (cells.every((item) => NotebookCell.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<NotebookCell>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type NotebookDocument');
@@ -26067,12 +25404,12 @@
   @override
   bool operator ==(Object other) {
     if (other is NotebookDocument && other.runtimeType == NotebookDocument) {
-      return uri == other.uri &&
-          notebookType == other.notebookType &&
-          version == other.version &&
-          metadata == other.metadata &&
-          listEqual(
+      return listEqual(
               cells, other.cells, (NotebookCell a, NotebookCell b) => a == b) &&
+          metadata == other.metadata &&
+          notebookType == other.notebookType &&
+          uri == other.uri &&
+          version == other.version &&
           true;
     }
     return false;
@@ -26080,11 +25417,11 @@
 
   @override
   int get hashCode => Object.hash(
-        uri,
-        notebookType,
-        version,
-        metadata,
         lspHashCode(cells),
+        metadata,
+        notebookType,
+        uri,
+        version,
       );
 
   @override
@@ -26100,20 +25437,20 @@
   );
 
   NotebookDocumentChangeEvent({
-    this.metadata,
     this.cells,
+    this.metadata,
   });
   static NotebookDocumentChangeEvent fromJson(Map<String, Object?> json) {
-    final metadataJson = json['metadata'];
-    final metadata = metadataJson;
     final cellsJson = json['cells'];
     final cells = cellsJson != null
         ? NotebookDocumentChangeEventCells.fromJson(
             cellsJson as Map<String, Object?>)
         : null;
+    final metadataJson = json['metadata'];
+    final metadata = metadataJson;
     return NotebookDocumentChangeEvent(
-      metadata: metadata,
       cells: cells,
+      metadata: metadata,
     );
   }
 
@@ -26125,12 +25462,12 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (metadata != null) {
-      __result['metadata'] = metadata;
-    }
     if (cells != null) {
       __result['cells'] = cells?.toJson();
     }
+    if (metadata != null) {
+      __result['metadata'] = metadata;
+    }
     return __result;
   }
 
@@ -26159,15 +25496,15 @@
   bool operator ==(Object other) {
     if (other is NotebookDocumentChangeEvent &&
         other.runtimeType == NotebookDocumentChangeEvent) {
-      return metadata == other.metadata && cells == other.cells && true;
+      return cells == other.cells && metadata == other.metadata && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        metadata,
         cells,
+        metadata,
       );
 
   @override
@@ -26181,28 +25518,28 @@
   );
 
   NotebookDocumentChangeEventCells({
-    this.structure,
     this.data,
+    this.structure,
     this.textContent,
   });
   static NotebookDocumentChangeEventCells fromJson(Map<String, Object?> json) {
+    final dataJson = json['data'];
+    final data = (dataJson as List<Object?>?)
+        ?.map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
+        .toList();
     final structureJson = json['structure'];
     final structure = structureJson != null
         ? NotebookDocumentChangeEventStructure.fromJson(
             structureJson as Map<String, Object?>)
         : null;
-    final dataJson = json['data'];
-    final data = (dataJson as List<Object?>?)
-        ?.map((item) => NotebookCell.fromJson(item as Map<String, Object?>))
-        .toList();
     final textContentJson = json['textContent'];
     final textContent = (textContentJson as List<Object?>?)
         ?.map((item) => NotebookDocumentChangeEventTextContent.fromJson(
             item as Map<String, Object?>))
         .toList();
     return NotebookDocumentChangeEventCells(
-      structure: structure,
       data: data,
+      structure: structure,
       textContent: textContent,
     );
   }
@@ -26219,12 +25556,12 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (structure != null) {
-      __result['structure'] = structure?.toJson();
-    }
     if (data != null) {
       __result['data'] = data?.map((item) => item.toJson()).toList();
     }
+    if (structure != null) {
+      __result['structure'] = structure?.toJson();
+    }
     if (textContent != null) {
       __result['textContent'] =
           textContent?.map((item) => item.toJson()).toList();
@@ -26234,19 +25571,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('structure');
-      try {
-        final structure = obj['structure'];
-        if (structure != null &&
-            !(NotebookDocumentChangeEventStructure.canParse(
-                structure, reporter))) {
-          reporter.reportError(
-              'must be of type NotebookDocumentChangeEventStructure');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('data');
       try {
         final data = obj['data'];
@@ -26260,6 +25584,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('structure');
+      try {
+        final structure = obj['structure'];
+        if (structure != null &&
+            !(NotebookDocumentChangeEventStructure.canParse(
+                structure, reporter))) {
+          reporter.reportError(
+              'must be of type NotebookDocumentChangeEventStructure');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textContent');
       try {
         final textContent = obj['textContent'];
@@ -26286,9 +25623,9 @@
   bool operator ==(Object other) {
     if (other is NotebookDocumentChangeEventCells &&
         other.runtimeType == NotebookDocumentChangeEventCells) {
-      return structure == other.structure &&
-          listEqual(
+      return listEqual(
               data, other.data, (NotebookCell a, NotebookCell b) => a == b) &&
+          structure == other.structure &&
           listEqual(
               textContent,
               other.textContent,
@@ -26302,8 +25639,8 @@
 
   @override
   int get hashCode => Object.hash(
-        structure,
         lspHashCode(data),
+        structure,
         lspHashCode(textContent),
       );
 
@@ -26319,27 +25656,27 @@
 
   NotebookDocumentChangeEventStructure({
     required this.array,
-    this.didOpen,
     this.didClose,
+    this.didOpen,
   });
   static NotebookDocumentChangeEventStructure fromJson(
       Map<String, Object?> json) {
     final arrayJson = json['array'];
     final array =
         NotebookCellArrayChange.fromJson(arrayJson as Map<String, Object?>);
-    final didOpenJson = json['didOpen'];
-    final didOpen = (didOpenJson as List<Object?>?)
-        ?.map((item) => TextDocumentItem.fromJson(item as Map<String, Object?>))
-        .toList();
     final didCloseJson = json['didClose'];
     final didClose = (didCloseJson as List<Object?>?)
         ?.map((item) =>
             TextDocumentIdentifier.fromJson(item as Map<String, Object?>))
         .toList();
+    final didOpenJson = json['didOpen'];
+    final didOpen = (didOpenJson as List<Object?>?)
+        ?.map((item) => TextDocumentItem.fromJson(item as Map<String, Object?>))
+        .toList();
     return NotebookDocumentChangeEventStructure(
       array: array,
-      didOpen: didOpen,
       didClose: didClose,
+      didOpen: didOpen,
     );
   }
 
@@ -26355,12 +25692,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['array'] = array.toJson();
-    if (didOpen != null) {
-      __result['didOpen'] = didOpen?.map((item) => item.toJson()).toList();
-    }
     if (didClose != null) {
       __result['didClose'] = didClose?.map((item) => item.toJson()).toList();
     }
+    if (didOpen != null) {
+      __result['didOpen'] = didOpen?.map((item) => item.toJson()).toList();
+    }
     return __result;
   }
 
@@ -26384,19 +25721,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('didOpen');
-      try {
-        final didOpen = obj['didOpen'];
-        if (didOpen != null &&
-            !((didOpen is List<Object?> &&
-                (didOpen.every(
-                    (item) => TextDocumentItem.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TextDocumentItem>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('didClose');
       try {
         final didClose = obj['didClose'];
@@ -26410,6 +25734,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('didOpen');
+      try {
+        final didOpen = obj['didOpen'];
+        if (didOpen != null &&
+            !((didOpen is List<Object?> &&
+                (didOpen.every(
+                    (item) => TextDocumentItem.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentItem>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter
@@ -26423,10 +25760,10 @@
     if (other is NotebookDocumentChangeEventStructure &&
         other.runtimeType == NotebookDocumentChangeEventStructure) {
       return array == other.array &&
-          listEqual(didOpen, other.didOpen,
-              (TextDocumentItem a, TextDocumentItem b) => a == b) &&
           listEqual(didClose, other.didClose,
               (TextDocumentIdentifier a, TextDocumentIdentifier b) => a == b) &&
+          listEqual(didOpen, other.didOpen,
+              (TextDocumentItem a, TextDocumentItem b) => a == b) &&
           true;
     }
     return false;
@@ -26435,8 +25772,8 @@
   @override
   int get hashCode => Object.hash(
         array,
-        lspHashCode(didOpen),
         lspHashCode(didClose),
+        lspHashCode(didOpen),
       );
 
   @override
@@ -26450,14 +25787,11 @@
   );
 
   NotebookDocumentChangeEventTextContent({
-    required this.document,
     required this.changes,
+    required this.document,
   });
   static NotebookDocumentChangeEventTextContent fromJson(
       Map<String, Object?> json) {
-    final documentJson = json['document'];
-    final document = VersionedTextDocumentIdentifier.fromJson(
-        documentJson as Map<String, Object?>);
     final changesJson = json['changes'];
     final changes = (changesJson as List<Object?>)
         .map((item) => TextDocumentContentChangeEvent1.canParse(
@@ -26471,9 +25805,12 @@
                     TextDocumentContentChangeEvent2.fromJson(item as Map<String, Object?>))
                 : (throw '''$item was not one of (TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2)''')))
         .toList();
+    final documentJson = json['document'];
+    final document = VersionedTextDocumentIdentifier.fromJson(
+        documentJson as Map<String, Object?>);
     return NotebookDocumentChangeEventTextContent(
-      document: document,
       changes: changes,
+      document: document,
     );
   }
 
@@ -26484,32 +25821,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['document'] = document.toJson();
     __result['changes'] = changes;
+    __result['document'] = document.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('document');
-      try {
-        if (!obj.containsKey('document')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final document = obj['document'];
-        if (document == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(VersionedTextDocumentIdentifier.canParse(document, reporter))) {
-          reporter
-              .reportError('must be of type VersionedTextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('changes');
       try {
         if (!obj.containsKey('changes')) {
@@ -26532,6 +25850,25 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('document');
+      try {
+        if (!obj.containsKey('document')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final document = obj['document'];
+        if (document == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(VersionedTextDocumentIdentifier.canParse(document, reporter))) {
+          reporter
+              .reportError('must be of type VersionedTextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -26544,8 +25881,7 @@
   bool operator ==(Object other) {
     if (other is NotebookDocumentChangeEventTextContent &&
         other.runtimeType == NotebookDocumentChangeEventTextContent) {
-      return document == other.document &&
-          listEqual(
+      return listEqual(
               changes,
               other.changes,
               (Either2<TextDocumentContentChangeEvent1,
@@ -26555,6 +25891,7 @@
                               TextDocumentContentChangeEvent2>
                           b) =>
                   a == b) &&
+          document == other.document &&
           true;
     }
     return false;
@@ -26562,8 +25899,8 @@
 
   @override
   int get hashCode => Object.hash(
-        document,
         lspHashCode(changes),
+        document,
       );
 
   @override
@@ -26655,20 +25992,20 @@
 
   NotebookDocumentFilter1({
     required this.notebookType,
-    this.scheme,
     this.pattern,
+    this.scheme,
   });
   static NotebookDocumentFilter1 fromJson(Map<String, Object?> json) {
     final notebookTypeJson = json['notebookType'];
     final notebookType = notebookTypeJson as String;
-    final schemeJson = json['scheme'];
-    final scheme = schemeJson as String?;
     final patternJson = json['pattern'];
     final pattern = patternJson as String?;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String?;
     return NotebookDocumentFilter1(
       notebookType: notebookType,
-      scheme: scheme,
       pattern: pattern,
+      scheme: scheme,
     );
   }
 
@@ -26684,12 +26021,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['notebookType'] = notebookType;
-    if (scheme != null) {
-      __result['scheme'] = scheme;
-    }
     if (pattern != null) {
       __result['pattern'] = pattern;
     }
+    if (scheme != null) {
+      __result['scheme'] = scheme;
+    }
     return __result;
   }
 
@@ -26713,20 +26050,20 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('scheme');
+      reporter.push('pattern');
       try {
-        final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
+        final pattern = obj['pattern'];
+        if (pattern != null && !(pattern is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('pattern');
+      reporter.push('scheme');
       try {
-        final pattern = obj['pattern'];
-        if (pattern != null && !(pattern is String)) {
+        final scheme = obj['scheme'];
+        if (scheme != null && !(scheme is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -26745,8 +26082,8 @@
     if (other is NotebookDocumentFilter1 &&
         other.runtimeType == NotebookDocumentFilter1) {
       return notebookType == other.notebookType &&
-          scheme == other.scheme &&
           pattern == other.pattern &&
+          scheme == other.scheme &&
           true;
     }
     return false;
@@ -26755,8 +26092,8 @@
   @override
   int get hashCode => Object.hash(
         notebookType,
-        scheme,
         pattern,
+        scheme,
       );
 
   @override
@@ -26771,20 +26108,20 @@
 
   NotebookDocumentFilter2({
     this.notebookType,
-    required this.scheme,
     this.pattern,
+    required this.scheme,
   });
   static NotebookDocumentFilter2 fromJson(Map<String, Object?> json) {
     final notebookTypeJson = json['notebookType'];
     final notebookType = notebookTypeJson as String?;
-    final schemeJson = json['scheme'];
-    final scheme = schemeJson as String;
     final patternJson = json['pattern'];
     final pattern = patternJson as String?;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String;
     return NotebookDocumentFilter2(
       notebookType: notebookType,
-      scheme: scheme,
       pattern: pattern,
+      scheme: scheme,
     );
   }
 
@@ -26802,10 +26139,10 @@
     if (notebookType != null) {
       __result['notebookType'] = notebookType;
     }
-    __result['scheme'] = scheme;
     if (pattern != null) {
       __result['pattern'] = pattern;
     }
+    __result['scheme'] = scheme;
     return __result;
   }
 
@@ -26821,6 +26158,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('pattern');
+      try {
+        final pattern = obj['pattern'];
+        if (pattern != null && !(pattern is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('scheme');
       try {
         if (!obj.containsKey('scheme')) {
@@ -26839,16 +26186,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('pattern');
-      try {
-        final pattern = obj['pattern'];
-        if (pattern != null && !(pattern is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type NotebookDocumentFilter2');
@@ -26861,8 +26198,8 @@
     if (other is NotebookDocumentFilter2 &&
         other.runtimeType == NotebookDocumentFilter2) {
       return notebookType == other.notebookType &&
-          scheme == other.scheme &&
           pattern == other.pattern &&
+          scheme == other.scheme &&
           true;
     }
     return false;
@@ -26871,8 +26208,8 @@
   @override
   int get hashCode => Object.hash(
         notebookType,
-        scheme,
         pattern,
+        scheme,
       );
 
   @override
@@ -26887,20 +26224,20 @@
 
   NotebookDocumentFilter3({
     this.notebookType,
-    this.scheme,
     required this.pattern,
+    this.scheme,
   });
   static NotebookDocumentFilter3 fromJson(Map<String, Object?> json) {
     final notebookTypeJson = json['notebookType'];
     final notebookType = notebookTypeJson as String?;
-    final schemeJson = json['scheme'];
-    final scheme = schemeJson as String?;
     final patternJson = json['pattern'];
     final pattern = patternJson as String;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String?;
     return NotebookDocumentFilter3(
       notebookType: notebookType,
-      scheme: scheme,
       pattern: pattern,
+      scheme: scheme,
     );
   }
 
@@ -26918,10 +26255,10 @@
     if (notebookType != null) {
       __result['notebookType'] = notebookType;
     }
+    __result['pattern'] = pattern;
     if (scheme != null) {
       __result['scheme'] = scheme;
     }
-    __result['pattern'] = pattern;
     return __result;
   }
 
@@ -26937,16 +26274,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('scheme');
-      try {
-        final scheme = obj['scheme'];
-        if (scheme != null && !(scheme is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('pattern');
       try {
         if (!obj.containsKey('pattern')) {
@@ -26965,6 +26292,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('scheme');
+      try {
+        final scheme = obj['scheme'];
+        if (scheme != null && !(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type NotebookDocumentFilter3');
@@ -26977,8 +26314,8 @@
     if (other is NotebookDocumentFilter3 &&
         other.runtimeType == NotebookDocumentFilter3) {
       return notebookType == other.notebookType &&
-          scheme == other.scheme &&
           pattern == other.pattern &&
+          scheme == other.scheme &&
           true;
     }
     return false;
@@ -26987,8 +26324,8 @@
   @override
   int get hashCode => Object.hash(
         notebookType,
-        scheme,
         pattern,
+        scheme,
       );
 
   @override
@@ -27332,40 +26669,37 @@
   );
 
   NotebookDocumentSyncOptionsNotebookSelector({
-    this.notebookDocument,
     required this.cells,
+    this.notebookDocument,
   });
   static NotebookDocumentSyncOptionsNotebookSelector fromJson(
       Map<String, Object?> json) {
-    final notebookDocumentJson = json['notebookDocument'];
-    final notebookDocument = notebookDocumentJson == null
-        ? null
-        : (notebookDocumentJson is String
-            ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t1(
-                notebookDocumentJson)
-            : ((NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter) ||
-                    NotebookDocumentFilter2.canParse(
-                        notebookDocumentJson, nullLspJsonReporter) ||
-                    NotebookDocumentFilter3.canParse(
-                        notebookDocumentJson, nullLspJsonReporter))
-                ? Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>.t2(
-                    NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
-                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
-                            NotebookDocumentFilter1.fromJson(
-                                notebookDocumentJson as Map<String, Object?>))
-                        : (NotebookDocumentFilter2.canParse(
-                                notebookDocumentJson, nullLspJsonReporter)
-                            ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
-                            : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
-                : (throw '''$notebookDocumentJson was not one of (String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>)''')));
     final cellsJson = json['cells'];
     final cells = (cellsJson as List<Object?>)
         .map((item) => NotebookDocumentSyncOptionsCells.fromJson(
             item as Map<String, Object?>))
         .toList();
+    final notebookDocumentJson = json['notebookDocument'];
+    final notebookDocument = notebookDocumentJson == null
+        ? null
+        : ((NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter) ||
+                NotebookDocumentFilter2.canParse(
+                    notebookDocumentJson, nullLspJsonReporter) ||
+                NotebookDocumentFilter3.canParse(
+                    notebookDocumentJson, nullLspJsonReporter))
+            ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t1(
+                NotebookDocumentFilter1.canParse(notebookDocumentJson, nullLspJsonReporter)
+                    ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t1(
+                        NotebookDocumentFilter1.fromJson(
+                            notebookDocumentJson as Map<String, Object?>))
+                    : (NotebookDocumentFilter2.canParse(notebookDocumentJson, nullLspJsonReporter)
+                        ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t2(
+                            NotebookDocumentFilter2.fromJson(notebookDocumentJson as Map<String, Object?>))
+                        : (NotebookDocumentFilter3.canParse(notebookDocumentJson, nullLspJsonReporter) ? Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>.t3(NotebookDocumentFilter3.fromJson(notebookDocumentJson as Map<String, Object?>)) : (throw '''$notebookDocumentJson was not one of (NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3)'''))))
+            : (notebookDocumentJson is String ? Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>.t2(notebookDocumentJson) : (throw '''$notebookDocumentJson was not one of (Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String)''')));
     return NotebookDocumentSyncOptionsNotebookSelector(
-      notebookDocument: notebookDocument,
       cells: cells,
+      notebookDocument: notebookDocument,
     );
   }
 
@@ -27375,38 +26709,21 @@
   /// The notebook to be synced If a string value is provided it matches against
   /// the notebook type. '*' matches every notebook.
   final Either2<
-      String,
       Either3<NotebookDocumentFilter1, NotebookDocumentFilter2,
-          NotebookDocumentFilter3>>? notebookDocument;
+          NotebookDocumentFilter3>,
+      String>? notebookDocument;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['cells'] = cells.map((item) => item.toJson()).toList();
     if (notebookDocument != null) {
       __result['notebookDocument'] = notebookDocument;
     }
-    __result['cells'] = cells.map((item) => item.toJson()).toList();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('notebookDocument');
-      try {
-        final notebookDocument = obj['notebookDocument'];
-        if (notebookDocument != null &&
-            !((notebookDocument is String ||
-                (NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
-                    NotebookDocumentFilter2.canParse(
-                        notebookDocument, reporter) ||
-                    NotebookDocumentFilter3.canParse(
-                        notebookDocument, reporter))))) {
-          reporter.reportError(
-              'must be of type Either2<String, Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('cells');
       try {
         if (!obj.containsKey('cells')) {
@@ -27428,6 +26745,23 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('notebookDocument');
+      try {
+        final notebookDocument = obj['notebookDocument'];
+        if (notebookDocument != null &&
+            !(((NotebookDocumentFilter1.canParse(notebookDocument, reporter) ||
+                    NotebookDocumentFilter2.canParse(
+                        notebookDocument, reporter) ||
+                    NotebookDocumentFilter3.canParse(
+                        notebookDocument, reporter)) ||
+                notebookDocument is String))) {
+          reporter.reportError(
+              'must be of type Either2<Either3<NotebookDocumentFilter1, NotebookDocumentFilter2, NotebookDocumentFilter3>, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -27440,13 +26774,13 @@
   bool operator ==(Object other) {
     if (other is NotebookDocumentSyncOptionsNotebookSelector &&
         other.runtimeType == NotebookDocumentSyncOptionsNotebookSelector) {
-      return notebookDocument == other.notebookDocument &&
-          listEqual(
+      return listEqual(
               cells,
               other.cells,
               (NotebookDocumentSyncOptionsCells a,
                       NotebookDocumentSyncOptionsCells b) =>
                   a == b) &&
+          notebookDocument == other.notebookDocument &&
           true;
     }
     return false;
@@ -27454,8 +26788,8 @@
 
   @override
   int get hashCode => Object.hash(
-        notebookDocument,
         lspHashCode(cells),
+        notebookDocument,
       );
 
   @override
@@ -27475,12 +26809,14 @@
   );
 
   NotebookDocumentSyncRegistrationOptions({
+    this.id,
     required this.notebookSelector,
     this.save,
-    this.id,
   });
   static NotebookDocumentSyncRegistrationOptions fromJson(
       Map<String, Object?> json) {
+    final idJson = json['id'];
+    final id = idJson as String?;
     final notebookSelectorJson = json['notebookSelector'];
     final notebookSelector = (notebookSelectorJson as List<Object?>)
         .map((item) => NotebookDocumentSyncOptionsNotebookSelector.fromJson(
@@ -27488,12 +26824,10 @@
         .toList();
     final saveJson = json['save'];
     final save = saveJson as bool?;
-    final idJson = json['id'];
-    final id = idJson as String?;
     return NotebookDocumentSyncRegistrationOptions(
+      id: id,
       notebookSelector: notebookSelector,
       save: save,
-      id: id,
     );
   }
 
@@ -27510,19 +26844,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (id != null) {
+      __result['id'] = id;
+    }
     __result['notebookSelector'] =
         notebookSelector.map((item) => item.toJson()).toList();
     if (save != null) {
       __result['save'] = save;
     }
-    if (id != null) {
-      __result['id'] = id;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('notebookSelector');
       try {
         if (!obj.containsKey('notebookSelector')) {
@@ -27555,16 +26899,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('id');
-      try {
-        final id = obj['id'];
-        if (id != null && !(id is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError(
@@ -27577,14 +26911,14 @@
   bool operator ==(Object other) {
     if (other is NotebookDocumentSyncRegistrationOptions &&
         other.runtimeType == NotebookDocumentSyncRegistrationOptions) {
-      return listEqual(
+      return id == other.id &&
+          listEqual(
               notebookSelector,
               other.notebookSelector,
               (NotebookDocumentSyncOptionsNotebookSelector a,
                       NotebookDocumentSyncOptionsNotebookSelector b) =>
                   a == b) &&
           save == other.save &&
-          id == other.id &&
           true;
     }
     return false;
@@ -27592,9 +26926,9 @@
 
   @override
   int get hashCode => Object.hash(
+        id,
         lspHashCode(notebookSelector),
         save,
-        id,
       );
 
   @override
@@ -27608,25 +26942,25 @@
   );
 
   NotificationMessage({
+    this.clientRequestTime,
+    required this.jsonrpc,
     required this.method,
     this.params,
-    required this.jsonrpc,
-    this.clientRequestTime,
   });
   static NotificationMessage fromJson(Map<String, Object?> json) {
+    final clientRequestTimeJson = json['clientRequestTime'];
+    final clientRequestTime = clientRequestTimeJson as int?;
+    final jsonrpcJson = json['jsonrpc'];
+    final jsonrpc = jsonrpcJson as String;
     final methodJson = json['method'];
     final method = Method.fromJson(methodJson as String);
     final paramsJson = json['params'];
     final params = paramsJson;
-    final jsonrpcJson = json['jsonrpc'];
-    final jsonrpc = jsonrpcJson as String;
-    final clientRequestTimeJson = json['clientRequestTime'];
-    final clientRequestTime = clientRequestTimeJson as int?;
     return NotificationMessage(
+      clientRequestTime: clientRequestTime,
+      jsonrpc: jsonrpc,
       method: method,
       params: params,
-      jsonrpc: jsonrpc,
-      clientRequestTime: clientRequestTime,
     );
   }
 
@@ -27641,32 +26975,24 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (clientRequestTime != null) {
+      __result['clientRequestTime'] = clientRequestTime;
+    }
+    __result['jsonrpc'] = jsonrpc;
     __result['method'] = method.toJson();
     if (params != null) {
       __result['params'] = params;
     }
-    __result['jsonrpc'] = jsonrpc;
-    if (clientRequestTime != null) {
-      __result['clientRequestTime'] = clientRequestTime;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('method');
+      reporter.push('clientRequestTime');
       try {
-        if (!obj.containsKey('method')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final method = obj['method'];
-        if (method == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Method.canParse(method, reporter))) {
-          reporter.reportError('must be of type Method');
+        final clientRequestTime = obj['clientRequestTime'];
+        if (clientRequestTime != null && !(clientRequestTime is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -27690,11 +27016,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('clientRequestTime');
+      reporter.push('method');
       try {
-        final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
-          reporter.reportError('must be of type int');
+        if (!obj.containsKey('method')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final method = obj['method'];
+        if (method == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Method.canParse(method, reporter))) {
+          reporter.reportError('must be of type Method');
           return false;
         }
       } finally {
@@ -27711,10 +27045,10 @@
   bool operator ==(Object other) {
     if (other is NotificationMessage &&
         other.runtimeType == NotificationMessage) {
-      return method == other.method &&
-          params == other.params &&
+      return clientRequestTime == other.clientRequestTime &&
           jsonrpc == other.jsonrpc &&
-          clientRequestTime == other.clientRequestTime &&
+          method == other.method &&
+          params == other.params &&
           true;
     }
     return false;
@@ -27722,10 +27056,10 @@
 
   @override
   int get hashCode => Object.hash(
+        clientRequestTime,
+        jsonrpc,
         method,
         params,
-        jsonrpc,
-        clientRequestTime,
       );
 
   @override
@@ -27740,18 +27074,18 @@
   );
 
   OptionalVersionedTextDocumentIdentifier({
-    this.version,
     required this.uri,
+    this.version,
   });
   static OptionalVersionedTextDocumentIdentifier fromJson(
       Map<String, Object?> json) {
-    final versionJson = json['version'];
-    final version = versionJson as int?;
     final uriJson = json['uri'];
     final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int?;
     return OptionalVersionedTextDocumentIdentifier(
-      version: version,
       uri: uri,
+      version: version,
     );
   }
 
@@ -27771,27 +27105,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['version'] = version;
     __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('version');
-      try {
-        if (!obj.containsKey('version')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final version = obj['version'];
-        if (version != null && !(version is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -27810,6 +27130,20 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version != null && !(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -27822,15 +27156,15 @@
   bool operator ==(Object other) {
     if (other is OptionalVersionedTextDocumentIdentifier &&
         other.runtimeType == OptionalVersionedTextDocumentIdentifier) {
-      return version == other.version && uri == other.uri && true;
+      return uri == other.uri && version == other.version && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        version,
         uri,
+        version,
       );
 
   @override
@@ -27846,30 +27180,30 @@
   );
 
   ParameterInformation({
-    required this.label,
     this.documentation,
+    required this.label,
   });
   static ParameterInformation fromJson(Map<String, Object?> json) {
-    final labelJson = json['label'];
-    final label = labelJson as String;
     final documentationJson = json['documentation'];
     final documentation = documentationJson == null
         ? null
-        : (documentationJson is String
-            ? Either2<String, MarkupContent>.t1(documentationJson)
-            : (MarkupContent.canParse(documentationJson, nullLspJsonReporter)
-                ? Either2<String, MarkupContent>.t2(MarkupContent.fromJson(
-                    documentationJson as Map<String, Object?>))
-                : (throw '''$documentationJson was not one of (String, MarkupContent)''')));
+        : (MarkupContent.canParse(documentationJson, nullLspJsonReporter)
+            ? Either2<MarkupContent, String>.t1(MarkupContent.fromJson(
+                documentationJson as Map<String, Object?>))
+            : (documentationJson is String
+                ? Either2<MarkupContent, String>.t2(documentationJson)
+                : (throw '''$documentationJson was not one of (MarkupContent, String)''')));
+    final labelJson = json['label'];
+    final label = labelJson as String;
     return ParameterInformation(
-      label: label,
       documentation: documentation,
+      label: label,
     );
   }
 
   /// The human-readable doc-comment of this parameter. Will be shown in the UI
   /// but can be omitted.
-  final Either2<String, MarkupContent>? documentation;
+  final Either2<MarkupContent, String>? documentation;
 
   /// The label of this parameter information.
   ///
@@ -27885,15 +27219,28 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['label'] = label;
     if (documentation != null) {
       __result['documentation'] = documentation;
     }
+    __result['label'] = label;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('documentation');
+      try {
+        final documentation = obj['documentation'];
+        if (documentation != null &&
+            !((MarkupContent.canParse(documentation, reporter) ||
+                documentation is String))) {
+          reporter
+              .reportError('must be of type Either2<MarkupContent, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
@@ -27912,19 +27259,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentation');
-      try {
-        final documentation = obj['documentation'];
-        if (documentation != null &&
-            !((documentation is String ||
-                MarkupContent.canParse(documentation, reporter)))) {
-          reporter
-              .reportError('must be of type Either2<String, MarkupContent>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ParameterInformation');
@@ -27936,8 +27270,8 @@
   bool operator ==(Object other) {
     if (other is ParameterInformation &&
         other.runtimeType == ParameterInformation) {
-      return label == other.label &&
-          documentation == other.documentation &&
+      return documentation == other.documentation &&
+          label == other.label &&
           true;
     }
     return false;
@@ -27945,8 +27279,8 @@
 
   @override
   int get hashCode => Object.hash(
-        label,
         documentation,
+        label,
       );
 
   @override
@@ -28109,17 +27443,17 @@
   );
 
   Position({
-    required this.line,
     required this.character,
+    required this.line,
   });
   static Position fromJson(Map<String, Object?> json) {
-    final lineJson = json['line'];
-    final line = lineJson as int;
     final characterJson = json['character'];
     final character = characterJson as int;
+    final lineJson = json['line'];
+    final line = lineJson as int;
     return Position(
-      line: line,
       character: character,
+      line: line,
     );
   }
 
@@ -28135,31 +27469,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['line'] = line;
     __result['character'] = character;
+    __result['line'] = line;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('line');
-      try {
-        if (!obj.containsKey('line')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final line = obj['line'];
-        if (line == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(line is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('character');
       try {
         if (!obj.containsKey('character')) {
@@ -28178,6 +27494,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('line');
+      try {
+        if (!obj.containsKey('line')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final line = obj['line'];
+        if (line == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(line is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type Position');
@@ -28188,15 +27522,15 @@
   @override
   bool operator ==(Object other) {
     if (other is Position && other.runtimeType == Position) {
-      return line == other.line && character == other.character && true;
+      return character == other.character && line == other.line && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        line,
         character,
+        line,
       );
 
   @override
@@ -28248,18 +27582,18 @@
   );
 
   PrepareRenameParams({
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
   });
   static PrepareRenameParams fromJson(Map<String, Object?> json) {
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     return PrepareRenameParams(
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
     );
   }
 
@@ -28271,31 +27605,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -28314,6 +27630,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type PrepareRenameParams');
@@ -28325,8 +27659,8 @@
   bool operator ==(Object other) {
     if (other is PrepareRenameParams &&
         other.runtimeType == PrepareRenameParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
+      return position == other.position &&
+          textDocument == other.textDocument &&
           true;
     }
     return false;
@@ -28334,8 +27668,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         position,
+        textDocument,
       );
 
   @override
@@ -28557,14 +27891,18 @@
   );
 
   PublishDiagnosticsClientCapabilities({
+    this.codeDescriptionSupport,
+    this.dataSupport,
     this.relatedInformation,
     this.tagSupport,
     this.versionSupport,
-    this.codeDescriptionSupport,
-    this.dataSupport,
   });
   static PublishDiagnosticsClientCapabilities fromJson(
       Map<String, Object?> json) {
+    final codeDescriptionSupportJson = json['codeDescriptionSupport'];
+    final codeDescriptionSupport = codeDescriptionSupportJson as bool?;
+    final dataSupportJson = json['dataSupport'];
+    final dataSupport = dataSupportJson as bool?;
     final relatedInformationJson = json['relatedInformation'];
     final relatedInformation = relatedInformationJson as bool?;
     final tagSupportJson = json['tagSupport'];
@@ -28574,16 +27912,12 @@
         : null;
     final versionSupportJson = json['versionSupport'];
     final versionSupport = versionSupportJson as bool?;
-    final codeDescriptionSupportJson = json['codeDescriptionSupport'];
-    final codeDescriptionSupport = codeDescriptionSupportJson as bool?;
-    final dataSupportJson = json['dataSupport'];
-    final dataSupport = dataSupportJson as bool?;
     return PublishDiagnosticsClientCapabilities(
+      codeDescriptionSupport: codeDescriptionSupport,
+      dataSupport: dataSupport,
       relatedInformation: relatedInformation,
       tagSupport: tagSupport,
       versionSupport: versionSupport,
-      codeDescriptionSupport: codeDescriptionSupport,
-      dataSupport: dataSupport,
     );
   }
 
@@ -28612,6 +27946,12 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (codeDescriptionSupport != null) {
+      __result['codeDescriptionSupport'] = codeDescriptionSupport;
+    }
+    if (dataSupport != null) {
+      __result['dataSupport'] = dataSupport;
+    }
     if (relatedInformation != null) {
       __result['relatedInformation'] = relatedInformation;
     }
@@ -28621,17 +27961,32 @@
     if (versionSupport != null) {
       __result['versionSupport'] = versionSupport;
     }
-    if (codeDescriptionSupport != null) {
-      __result['codeDescriptionSupport'] = codeDescriptionSupport;
-    }
-    if (dataSupport != null) {
-      __result['dataSupport'] = dataSupport;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('codeDescriptionSupport');
+      try {
+        final codeDescriptionSupport = obj['codeDescriptionSupport'];
+        if (codeDescriptionSupport != null &&
+            !(codeDescriptionSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('dataSupport');
+      try {
+        final dataSupport = obj['dataSupport'];
+        if (dataSupport != null && !(dataSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('relatedInformation');
       try {
         final relatedInformation = obj['relatedInformation'];
@@ -28665,27 +28020,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('codeDescriptionSupport');
-      try {
-        final codeDescriptionSupport = obj['codeDescriptionSupport'];
-        if (codeDescriptionSupport != null &&
-            !(codeDescriptionSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('dataSupport');
-      try {
-        final dataSupport = obj['dataSupport'];
-        if (dataSupport != null && !(dataSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter
@@ -28698,11 +28032,11 @@
   bool operator ==(Object other) {
     if (other is PublishDiagnosticsClientCapabilities &&
         other.runtimeType == PublishDiagnosticsClientCapabilities) {
-      return relatedInformation == other.relatedInformation &&
+      return codeDescriptionSupport == other.codeDescriptionSupport &&
+          dataSupport == other.dataSupport &&
+          relatedInformation == other.relatedInformation &&
           tagSupport == other.tagSupport &&
           versionSupport == other.versionSupport &&
-          codeDescriptionSupport == other.codeDescriptionSupport &&
-          dataSupport == other.dataSupport &&
           true;
     }
     return false;
@@ -28710,11 +28044,11 @@
 
   @override
   int get hashCode => Object.hash(
+        codeDescriptionSupport,
+        dataSupport,
         relatedInformation,
         tagSupport,
         versionSupport,
-        codeDescriptionSupport,
-        dataSupport,
       );
 
   @override
@@ -28805,23 +28139,23 @@
   );
 
   PublishDiagnosticsParams({
+    required this.diagnostics,
     required this.uri,
     this.version,
-    required this.diagnostics,
   });
   static PublishDiagnosticsParams fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
-    final versionJson = json['version'];
-    final version = versionJson as int?;
     final diagnosticsJson = json['diagnostics'];
     final diagnostics = (diagnosticsJson as List<Object?>)
         .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
         .toList();
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int?;
     return PublishDiagnosticsParams(
+      diagnostics: diagnostics,
       uri: uri,
       version: version,
-      diagnostics: diagnostics,
     );
   }
 
@@ -28838,16 +28172,36 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
     __result['uri'] = uri;
     if (version != null) {
       __result['version'] = version;
     }
-    __result['diagnostics'] = diagnostics.map((item) => item.toJson()).toList();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('diagnostics');
+      try {
+        if (!obj.containsKey('diagnostics')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final diagnostics = obj['diagnostics'];
+        if (diagnostics == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((diagnostics is List<Object?> &&
+            (diagnostics
+                .every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -28876,26 +28230,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('diagnostics');
-      try {
-        if (!obj.containsKey('diagnostics')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final diagnostics = obj['diagnostics'];
-        if (diagnostics == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((diagnostics is List<Object?> &&
-            (diagnostics
-                .every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<Diagnostic>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type PublishDiagnosticsParams');
@@ -28907,10 +28241,10 @@
   bool operator ==(Object other) {
     if (other is PublishDiagnosticsParams &&
         other.runtimeType == PublishDiagnosticsParams) {
-      return uri == other.uri &&
-          version == other.version &&
-          listEqual(diagnostics, other.diagnostics,
+      return listEqual(diagnostics, other.diagnostics,
               (Diagnostic a, Diagnostic b) => a == b) &&
+          uri == other.uri &&
+          version == other.version &&
           true;
     }
     return false;
@@ -28918,9 +28252,9 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(diagnostics),
         uri,
         version,
-        lspHashCode(diagnostics),
       );
 
   @override
@@ -28934,17 +28268,17 @@
   );
 
   Range({
-    required this.start,
     required this.end,
+    required this.start,
   });
   static Range fromJson(Map<String, Object?> json) {
-    final startJson = json['start'];
-    final start = Position.fromJson(startJson as Map<String, Object?>);
     final endJson = json['end'];
     final end = Position.fromJson(endJson as Map<String, Object?>);
+    final startJson = json['start'];
+    final start = Position.fromJson(startJson as Map<String, Object?>);
     return Range(
-      start: start,
       end: end,
+      start: start,
     );
   }
 
@@ -28956,31 +28290,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['start'] = start.toJson();
     __result['end'] = end.toJson();
+    __result['start'] = start.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('start');
-      try {
-        if (!obj.containsKey('start')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final start = obj['start'];
-        if (start == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Position.canParse(start, reporter))) {
-          reporter.reportError('must be of type Position');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('end');
       try {
         if (!obj.containsKey('end')) {
@@ -28999,6 +28315,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('start');
+      try {
+        if (!obj.containsKey('start')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final start = obj['start'];
+        if (start == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(start, reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type Range');
@@ -29009,15 +28343,15 @@
   @override
   bool operator ==(Object other) {
     if (other is Range && other.runtimeType == Range) {
-      return start == other.start && end == other.end && true;
+      return end == other.end && start == other.start && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        start,
         end,
+        start,
       );
 
   @override
@@ -29031,17 +28365,17 @@
   );
 
   RangeAndPlaceholder({
-    required this.range,
     required this.placeholder,
+    required this.range,
   });
   static RangeAndPlaceholder fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final placeholderJson = json['placeholder'];
     final placeholder = placeholderJson as String;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return RangeAndPlaceholder(
-      range: range,
       placeholder: placeholder,
+      range: range,
     );
   }
 
@@ -29050,31 +28384,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     __result['placeholder'] = placeholder;
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
-      try {
-        if (!obj.containsKey('range')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final range = obj['range'];
-        if (range == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('placeholder');
       try {
         if (!obj.containsKey('placeholder')) {
@@ -29093,6 +28409,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type RangeAndPlaceholder');
@@ -29104,15 +28438,15 @@
   bool operator ==(Object other) {
     if (other is RangeAndPlaceholder &&
         other.runtimeType == RangeAndPlaceholder) {
-      return range == other.range && placeholder == other.placeholder && true;
+      return placeholder == other.placeholder && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         placeholder,
+        range,
       );
 
   @override
@@ -29327,28 +28661,15 @@
 
   ReferenceParams({
     required this.context,
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static ReferenceParams fromJson(Map<String, Object?> json) {
     final contextJson = json['context'];
     final context =
         ReferenceContext.fromJson(contextJson as Map<String, Object?>);
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -29357,12 +28678,25 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return ReferenceParams(
       context: context,
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -29384,14 +28718,14 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['context'] = context.toJson();
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -29415,19 +28749,12 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -29451,22 +28778,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -29484,10 +28818,10 @@
   bool operator ==(Object other) {
     if (other is ReferenceParams && other.runtimeType == ReferenceParams) {
       return context == other.context &&
-          textDocument == other.textDocument &&
-          position == other.position &&
-          workDoneToken == other.workDoneToken &&
           partialResultToken == other.partialResultToken &&
+          position == other.position &&
+          textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -29496,10 +28830,10 @@
   @override
   int get hashCode => Object.hash(
         context,
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -29520,7 +28854,8 @@
   static ReferenceRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
@@ -29532,7 +28867,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
   final bool? workDoneProgress;
 
   Map<String, Object?> toJson() {
@@ -29556,8 +28891,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -29585,7 +28920,7 @@
     if (other is ReferenceRegistrationOptions &&
         other.runtimeType == ReferenceRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -29895,10 +29230,10 @@
   );
 
   RelatedFullDocumentDiagnosticReport({
-    this.relatedDocuments,
-    this.kind = 'full',
-    this.resultId,
     required this.items,
+    this.kind = 'full',
+    this.relatedDocuments,
+    this.resultId,
   }) {
     if (kind != 'full') {
       throw 'kind may only be the literal \'full\'';
@@ -29906,6 +29241,12 @@
   }
   static RelatedFullDocumentDiagnosticReport fromJson(
       Map<String, Object?> json) {
+    final itemsJson = json['items'];
+    final items = (itemsJson as List<Object?>)
+        .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
+        .toList();
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
     final relatedDocumentsJson = json['relatedDocuments'];
     final relatedDocuments = (relatedDocumentsJson as Map<Object, Object?>?)
         ?.map((key, value) => MapEntry(
@@ -29920,19 +29261,13 @@
                         UnchangedDocumentDiagnosticReport.fromJson(
                             value as Map<String, Object?>))
                     : (throw '''$value was not one of (FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport)'''))));
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
     final resultIdJson = json['resultId'];
     final resultId = resultIdJson as String?;
-    final itemsJson = json['items'];
-    final items = (itemsJson as List<Object?>)
-        .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
-        .toList();
     return RelatedFullDocumentDiagnosticReport(
-      relatedDocuments: relatedDocuments,
-      kind: kind,
-      resultId: resultId,
       items: items,
+      kind: kind,
+      relatedDocuments: relatedDocuments,
+      resultId: resultId,
     );
   }
 
@@ -29959,33 +29294,33 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['items'] = items.map((item) => item.toJson()).toList();
+    __result['kind'] = kind;
     if (relatedDocuments != null) {
       __result['relatedDocuments'] = relatedDocuments;
     }
-    __result['kind'] = kind;
     if (resultId != null) {
       __result['resultId'] = resultId;
     }
-    __result['items'] = items.map((item) => item.toJson()).toList();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('relatedDocuments');
+      reporter.push('items');
       try {
-        final relatedDocuments = obj['relatedDocuments'];
-        if (relatedDocuments != null &&
-            !((relatedDocuments is Map &&
-                (relatedDocuments.keys.every((item) =>
-                    item is String &&
-                    relatedDocuments.values.every((item) =>
-                        (FullDocumentDiagnosticReport.canParse(
-                                item, reporter) ||
-                            UnchangedDocumentDiagnosticReport.canParse(
-                                item, reporter)))))))) {
-          reporter.reportError(
-              'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
+        if (!obj.containsKey('items')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final items = obj['items'];
+        if (items == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((items is List<Object?> &&
+            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
       } finally {
@@ -30009,30 +29344,30 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('resultId');
+      reporter.push('relatedDocuments');
       try {
-        final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
-          reporter.reportError('must be of type String');
+        final relatedDocuments = obj['relatedDocuments'];
+        if (relatedDocuments != null &&
+            !((relatedDocuments is Map &&
+                (relatedDocuments.keys.every((item) =>
+                    item is String &&
+                    relatedDocuments.values.every((item) =>
+                        (FullDocumentDiagnosticReport.canParse(
+                                item, reporter) ||
+                            UnchangedDocumentDiagnosticReport.canParse(
+                                item, reporter)))))))) {
+          reporter.reportError(
+              'must be of type Map<String, Either2<FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport>>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('items');
+      reporter.push('resultId');
       try {
-        if (!obj.containsKey('items')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final items = obj['items'];
-        if (items == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((items is List<Object?> &&
-            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<Diagnostic>');
+        final resultId = obj['resultId'];
+        if (resultId != null && !(resultId is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -30050,7 +29385,10 @@
   bool operator ==(Object other) {
     if (other is RelatedFullDocumentDiagnosticReport &&
         other.runtimeType == RelatedFullDocumentDiagnosticReport) {
-      return mapEqual(
+      return listEqual(
+              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
+          kind == other.kind &&
+          mapEqual(
               relatedDocuments,
               other.relatedDocuments,
               (Either2<FullDocumentDiagnosticReport,
@@ -30060,10 +29398,7 @@
                               UnchangedDocumentDiagnosticReport>
                           b) =>
                   a == b) &&
-          kind == other.kind &&
           resultId == other.resultId &&
-          listEqual(
-              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
           true;
     }
     return false;
@@ -30071,10 +29406,10 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(relatedDocuments),
-        kind,
-        resultId,
         lspHashCode(items),
+        kind,
+        lspHashCode(relatedDocuments),
+        resultId,
       );
 
   @override
@@ -30091,8 +29426,8 @@
   );
 
   RelatedUnchangedDocumentDiagnosticReport({
-    this.relatedDocuments,
     this.kind = 'unchanged',
+    this.relatedDocuments,
     required this.resultId,
   }) {
     if (kind != 'unchanged') {
@@ -30101,6 +29436,8 @@
   }
   static RelatedUnchangedDocumentDiagnosticReport fromJson(
       Map<String, Object?> json) {
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
     final relatedDocumentsJson = json['relatedDocuments'];
     final relatedDocuments = (relatedDocumentsJson as Map<Object, Object?>?)
         ?.map((key, value) => MapEntry(
@@ -30115,13 +29452,11 @@
                         UnchangedDocumentDiagnosticReport.fromJson(
                             value as Map<String, Object?>))
                     : (throw '''$value was not one of (FullDocumentDiagnosticReport, UnchangedDocumentDiagnosticReport)'''))));
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
     final resultIdJson = json['resultId'];
     final resultId = resultIdJson as String;
     return RelatedUnchangedDocumentDiagnosticReport(
-      relatedDocuments: relatedDocuments,
       kind: kind,
+      relatedDocuments: relatedDocuments,
       resultId: resultId,
     );
   }
@@ -30147,16 +29482,34 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['kind'] = kind;
     if (relatedDocuments != null) {
       __result['relatedDocuments'] = relatedDocuments;
     }
-    __result['kind'] = kind;
     __result['resultId'] = resultId;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('kind');
+      try {
+        if (!obj.containsKey('kind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final kind = obj['kind'];
+        if (kind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(kind == 'unchanged')) {
+          reporter.reportError('must be the literal \'unchanged\'');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('relatedDocuments');
       try {
         final relatedDocuments = obj['relatedDocuments'];
@@ -30176,24 +29529,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('kind');
-      try {
-        if (!obj.containsKey('kind')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final kind = obj['kind'];
-        if (kind == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(kind == 'unchanged')) {
-          reporter.reportError('must be the literal \'unchanged\'');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('resultId');
       try {
         if (!obj.containsKey('resultId')) {
@@ -30224,7 +29559,8 @@
   bool operator ==(Object other) {
     if (other is RelatedUnchangedDocumentDiagnosticReport &&
         other.runtimeType == RelatedUnchangedDocumentDiagnosticReport) {
-      return mapEqual(
+      return kind == other.kind &&
+          mapEqual(
               relatedDocuments,
               other.relatedDocuments,
               (Either2<FullDocumentDiagnosticReport,
@@ -30234,7 +29570,6 @@
                               UnchangedDocumentDiagnosticReport>
                           b) =>
                   a == b) &&
-          kind == other.kind &&
           resultId == other.resultId &&
           true;
     }
@@ -30243,8 +29578,8 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(relatedDocuments),
         kind,
+        lspHashCode(relatedDocuments),
         resultId,
       );
 
@@ -30268,12 +29603,12 @@
   });
   static RelativePattern fromJson(Map<String, Object?> json) {
     final baseUriJson = json['baseUri'];
-    final baseUri = WorkspaceFolder.canParse(baseUriJson, nullLspJsonReporter)
-        ? Either2<WorkspaceFolder, String>.t1(
-            WorkspaceFolder.fromJson(baseUriJson as Map<String, Object?>))
-        : (baseUriJson is String
-            ? Either2<WorkspaceFolder, String>.t2(baseUriJson)
-            : (throw '''$baseUriJson was not one of (WorkspaceFolder, String)'''));
+    final baseUri = baseUriJson is String
+        ? Either2<String, WorkspaceFolder>.t1(baseUriJson)
+        : (WorkspaceFolder.canParse(baseUriJson, nullLspJsonReporter)
+            ? Either2<String, WorkspaceFolder>.t2(
+                WorkspaceFolder.fromJson(baseUriJson as Map<String, Object?>))
+            : (throw '''$baseUriJson was not one of (String, WorkspaceFolder)'''));
     final patternJson = json['pattern'];
     final pattern = patternJson as String;
     return RelativePattern(
@@ -30284,7 +29619,7 @@
 
   /// A workspace folder or a base URI to which this pattern will be matched
   /// against relatively.
-  final Either2<WorkspaceFolder, String> baseUri;
+  final Either2<String, WorkspaceFolder> baseUri;
 
   /// The actual glob pattern;
   final String pattern;
@@ -30309,10 +29644,10 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((WorkspaceFolder.canParse(baseUri, reporter) ||
-            baseUri is String))) {
+        if (!((baseUri is String ||
+            WorkspaceFolder.canParse(baseUri, reporter)))) {
           reporter
-              .reportError('must be of type Either2<WorkspaceFolder, String>');
+              .reportError('must be of type Either2<String, WorkspaceFolder>');
           return false;
         }
       } finally {
@@ -30369,13 +29704,15 @@
 
   RenameClientCapabilities({
     this.dynamicRegistration,
+    this.honorsChangeAnnotations,
     this.prepareSupport,
     this.prepareSupportDefaultBehavior,
-    this.honorsChangeAnnotations,
   });
   static RenameClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final honorsChangeAnnotationsJson = json['honorsChangeAnnotations'];
+    final honorsChangeAnnotations = honorsChangeAnnotationsJson as bool?;
     final prepareSupportJson = json['prepareSupport'];
     final prepareSupport = prepareSupportJson as bool?;
     final prepareSupportDefaultBehaviorJson =
@@ -30385,13 +29722,11 @@
             ? PrepareSupportDefaultBehavior.fromJson(
                 prepareSupportDefaultBehaviorJson as int)
             : null;
-    final honorsChangeAnnotationsJson = json['honorsChangeAnnotations'];
-    final honorsChangeAnnotations = honorsChangeAnnotationsJson as bool?;
     return RenameClientCapabilities(
       dynamicRegistration: dynamicRegistration,
+      honorsChangeAnnotations: honorsChangeAnnotations,
       prepareSupport: prepareSupport,
       prepareSupportDefaultBehavior: prepareSupportDefaultBehavior,
-      honorsChangeAnnotations: honorsChangeAnnotations,
     );
   }
 
@@ -30422,6 +29757,9 @@
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
+    if (honorsChangeAnnotations != null) {
+      __result['honorsChangeAnnotations'] = honorsChangeAnnotations;
+    }
     if (prepareSupport != null) {
       __result['prepareSupport'] = prepareSupport;
     }
@@ -30429,9 +29767,6 @@
       __result['prepareSupportDefaultBehavior'] =
           prepareSupportDefaultBehavior?.toJson();
     }
-    if (honorsChangeAnnotations != null) {
-      __result['honorsChangeAnnotations'] = honorsChangeAnnotations;
-    }
     return __result;
   }
 
@@ -30447,6 +29782,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('honorsChangeAnnotations');
+      try {
+        final honorsChangeAnnotations = obj['honorsChangeAnnotations'];
+        if (honorsChangeAnnotations != null &&
+            !(honorsChangeAnnotations is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('prepareSupport');
       try {
         final prepareSupport = obj['prepareSupport'];
@@ -30470,17 +29816,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('honorsChangeAnnotations');
-      try {
-        final honorsChangeAnnotations = obj['honorsChangeAnnotations'];
-        if (honorsChangeAnnotations != null &&
-            !(honorsChangeAnnotations is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type RenameClientCapabilities');
@@ -30493,10 +29828,10 @@
     if (other is RenameClientCapabilities &&
         other.runtimeType == RenameClientCapabilities) {
       return dynamicRegistration == other.dynamicRegistration &&
+          honorsChangeAnnotations == other.honorsChangeAnnotations &&
           prepareSupport == other.prepareSupport &&
           prepareSupportDefaultBehavior ==
               other.prepareSupportDefaultBehavior &&
-          honorsChangeAnnotations == other.honorsChangeAnnotations &&
           true;
     }
     return false;
@@ -30505,9 +29840,9 @@
   @override
   int get hashCode => Object.hash(
         dynamicRegistration,
+        honorsChangeAnnotations,
         prepareSupport,
         prepareSupportDefaultBehavior,
-        honorsChangeAnnotations,
       );
 
   @override
@@ -30522,35 +29857,35 @@
   );
 
   RenameFile({
-    this.kind = 'rename',
-    required this.oldUri,
-    required this.newUri,
-    this.options,
     this.annotationId,
+    this.kind = 'rename',
+    required this.newUri,
+    required this.oldUri,
+    this.options,
   }) {
     if (kind != 'rename') {
       throw 'kind may only be the literal \'rename\'';
     }
   }
   static RenameFile fromJson(Map<String, Object?> json) {
+    final annotationIdJson = json['annotationId'];
+    final annotationId = annotationIdJson as String?;
     final kindJson = json['kind'];
     final kind = kindJson as String;
-    final oldUriJson = json['oldUri'];
-    final oldUri = oldUriJson as String;
     final newUriJson = json['newUri'];
     final newUri = newUriJson as String;
+    final oldUriJson = json['oldUri'];
+    final oldUri = oldUriJson as String;
     final optionsJson = json['options'];
     final options = optionsJson != null
         ? RenameFileOptions.fromJson(optionsJson as Map<String, Object?>)
         : null;
-    final annotationIdJson = json['annotationId'];
-    final annotationId = annotationIdJson as String?;
     return RenameFile(
-      kind: kind,
-      oldUri: oldUri,
-      newUri: newUri,
-      options: options,
       annotationId: annotationId,
+      kind: kind,
+      newUri: newUri,
+      oldUri: oldUri,
+      options: options,
     );
   }
 
@@ -30572,20 +29907,30 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind;
-    __result['oldUri'] = oldUri;
-    __result['newUri'] = newUri;
-    if (options != null) {
-      __result['options'] = options?.toJson();
-    }
     if (annotationId != null) {
       __result['annotationId'] = annotationId;
     }
+    __result['kind'] = kind;
+    __result['newUri'] = newUri;
+    __result['oldUri'] = oldUri;
+    if (options != null) {
+      __result['options'] = options?.toJson();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('annotationId');
+      try {
+        final annotationId = obj['annotationId'];
+        if (annotationId != null && !(annotationId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -30604,24 +29949,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('oldUri');
-      try {
-        if (!obj.containsKey('oldUri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final oldUri = obj['oldUri'];
-        if (oldUri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(oldUri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('newUri');
       try {
         if (!obj.containsKey('newUri')) {
@@ -30640,6 +29967,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('oldUri');
+      try {
+        if (!obj.containsKey('oldUri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final oldUri = obj['oldUri'];
+        if (oldUri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(oldUri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('options');
       try {
         final options = obj['options'];
@@ -30651,16 +29996,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('annotationId');
-      try {
-        final annotationId = obj['annotationId'];
-        if (annotationId != null && !(annotationId is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type RenameFile');
@@ -30671,11 +30006,11 @@
   @override
   bool operator ==(Object other) {
     if (other is RenameFile && other.runtimeType == RenameFile) {
-      return kind == other.kind &&
-          oldUri == other.oldUri &&
+      return annotationId == other.annotationId &&
+          kind == other.kind &&
           newUri == other.newUri &&
+          oldUri == other.oldUri &&
           options == other.options &&
-          annotationId == other.annotationId &&
           true;
     }
     return false;
@@ -30683,11 +30018,11 @@
 
   @override
   int get hashCode => Object.hash(
-        kind,
-        oldUri,
-        newUri,
-        options,
         annotationId,
+        kind,
+        newUri,
+        oldUri,
+        options,
       );
 
   @override
@@ -30702,17 +30037,17 @@
   );
 
   RenameFileOptions({
-    this.overwrite,
     this.ignoreIfExists,
+    this.overwrite,
   });
   static RenameFileOptions fromJson(Map<String, Object?> json) {
-    final overwriteJson = json['overwrite'];
-    final overwrite = overwriteJson as bool?;
     final ignoreIfExistsJson = json['ignoreIfExists'];
     final ignoreIfExists = ignoreIfExistsJson as bool?;
+    final overwriteJson = json['overwrite'];
+    final overwrite = overwriteJson as bool?;
     return RenameFileOptions(
-      overwrite: overwrite,
       ignoreIfExists: ignoreIfExists,
+      overwrite: overwrite,
     );
   }
 
@@ -30724,31 +30059,31 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (overwrite != null) {
-      __result['overwrite'] = overwrite;
-    }
     if (ignoreIfExists != null) {
       __result['ignoreIfExists'] = ignoreIfExists;
     }
+    if (overwrite != null) {
+      __result['overwrite'] = overwrite;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('overwrite');
+      reporter.push('ignoreIfExists');
       try {
-        final overwrite = obj['overwrite'];
-        if (overwrite != null && !(overwrite is bool)) {
+        final ignoreIfExists = obj['ignoreIfExists'];
+        if (ignoreIfExists != null && !(ignoreIfExists is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('ignoreIfExists');
+      reporter.push('overwrite');
       try {
-        final ignoreIfExists = obj['ignoreIfExists'];
-        if (ignoreIfExists != null && !(ignoreIfExists is bool)) {
+        final overwrite = obj['overwrite'];
+        if (overwrite != null && !(overwrite is bool)) {
           reporter.reportError('must be of type bool');
           return false;
         }
@@ -30765,8 +30100,8 @@
   @override
   bool operator ==(Object other) {
     if (other is RenameFileOptions && other.runtimeType == RenameFileOptions) {
-      return overwrite == other.overwrite &&
-          ignoreIfExists == other.ignoreIfExists &&
+      return ignoreIfExists == other.ignoreIfExists &&
+          overwrite == other.overwrite &&
           true;
     }
     return false;
@@ -30774,8 +30109,8 @@
 
   @override
   int get hashCode => Object.hash(
-        overwrite,
         ignoreIfExists,
+        overwrite,
       );
 
   @override
@@ -30956,18 +30291,18 @@
 
   RenameParams({
     required this.newName,
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
     this.workDoneToken,
   });
   static RenameParams fromJson(Map<String, Object?> json) {
     final newNameJson = json['newName'];
     final newName = newNameJson as String;
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -30978,8 +30313,8 @@
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return RenameParams(
       newName: newName,
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -31000,8 +30335,8 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['newName'] = newName;
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -31028,24 +30363,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -31064,6 +30381,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -31086,8 +30421,8 @@
   bool operator ==(Object other) {
     if (other is RenameParams && other.runtimeType == RenameParams) {
       return newName == other.newName &&
-          textDocument == other.textDocument &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -31097,8 +30432,8 @@
   @override
   int get hashCode => Object.hash(
         newName,
-        textDocument,
         position,
+        textDocument,
         workDoneToken,
       );
 
@@ -31121,7 +30456,8 @@
   static RenameRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final prepareProviderJson = json['prepareProvider'];
     final prepareProvider = prepareProviderJson as bool?;
@@ -31136,7 +30472,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// Renames should be checked and tested before being executed.
   final bool? prepareProvider;
@@ -31166,8 +30502,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -31205,7 +30541,7 @@
     if (other is RenameRegistrationOptions &&
         other.runtimeType == RenameRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           prepareProvider == other.prepareProvider &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -31231,33 +30567,33 @@
   );
 
   RequestMessage({
+    this.clientRequestTime,
     required this.id,
+    required this.jsonrpc,
     required this.method,
     this.params,
-    required this.jsonrpc,
-    this.clientRequestTime,
   });
   static RequestMessage fromJson(Map<String, Object?> json) {
+    final clientRequestTimeJson = json['clientRequestTime'];
+    final clientRequestTime = clientRequestTimeJson as int?;
     final idJson = json['id'];
     final id = idJson is int
         ? Either2<int, String>.t1(idJson)
         : (idJson is String
             ? Either2<int, String>.t2(idJson)
             : (throw '''$idJson was not one of (int, String)'''));
+    final jsonrpcJson = json['jsonrpc'];
+    final jsonrpc = jsonrpcJson as String;
     final methodJson = json['method'];
     final method = Method.fromJson(methodJson as String);
     final paramsJson = json['params'];
     final params = paramsJson;
-    final jsonrpcJson = json['jsonrpc'];
-    final jsonrpc = jsonrpcJson as String;
-    final clientRequestTimeJson = json['clientRequestTime'];
-    final clientRequestTime = clientRequestTimeJson as int?;
     return RequestMessage(
+      clientRequestTime: clientRequestTime,
       id: id,
+      jsonrpc: jsonrpc,
       method: method,
       params: params,
-      jsonrpc: jsonrpc,
-      clientRequestTime: clientRequestTime,
     );
   }
 
@@ -31275,20 +30611,30 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (clientRequestTime != null) {
+      __result['clientRequestTime'] = clientRequestTime;
+    }
     __result['id'] = id;
+    __result['jsonrpc'] = jsonrpc;
     __result['method'] = method.toJson();
     if (params != null) {
       __result['params'] = params;
     }
-    __result['jsonrpc'] = jsonrpc;
-    if (clientRequestTime != null) {
-      __result['clientRequestTime'] = clientRequestTime;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('clientRequestTime');
+      try {
+        final clientRequestTime = obj['clientRequestTime'];
+        if (clientRequestTime != null && !(clientRequestTime is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('id');
       try {
         if (!obj.containsKey('id')) {
@@ -31307,24 +30653,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('method');
-      try {
-        if (!obj.containsKey('method')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final method = obj['method'];
-        if (method == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Method.canParse(method, reporter))) {
-          reporter.reportError('must be of type Method');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
@@ -31343,11 +30671,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('clientRequestTime');
+      reporter.push('method');
       try {
-        final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
-          reporter.reportError('must be of type int');
+        if (!obj.containsKey('method')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final method = obj['method'];
+        if (method == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Method.canParse(method, reporter))) {
+          reporter.reportError('must be of type Method');
           return false;
         }
       } finally {
@@ -31363,11 +30699,11 @@
   @override
   bool operator ==(Object other) {
     if (other is RequestMessage && other.runtimeType == RequestMessage) {
-      return id == other.id &&
+      return clientRequestTime == other.clientRequestTime &&
+          id == other.id &&
+          jsonrpc == other.jsonrpc &&
           method == other.method &&
           params == other.params &&
-          jsonrpc == other.jsonrpc &&
-          clientRequestTime == other.clientRequestTime &&
           true;
     }
     return false;
@@ -31375,11 +30711,11 @@
 
   @override
   int get hashCode => Object.hash(
+        clientRequestTime,
         id,
+        jsonrpc,
         method,
         params,
-        jsonrpc,
-        clientRequestTime,
       );
 
   @override
@@ -31431,20 +30767,20 @@
 
   ResponseError({
     required this.code,
-    required this.message,
     this.data,
+    required this.message,
   });
   static ResponseError fromJson(Map<String, Object?> json) {
     final codeJson = json['code'];
     final code = ErrorCodes.fromJson(codeJson as int);
-    final messageJson = json['message'];
-    final message = messageJson as String;
     final dataJson = json['data'];
     final data = dataJson as String?;
+    final messageJson = json['message'];
+    final message = messageJson as String;
     return ResponseError(
       code: code,
-      message: message,
       data: data,
+      message: message,
     );
   }
 
@@ -31461,10 +30797,10 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['code'] = code.toJson();
-    __result['message'] = message;
     if (data != null) {
       __result['data'] = data;
     }
+    __result['message'] = message;
     return __result;
   }
 
@@ -31488,6 +30824,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('data');
+      try {
+        final data = obj['data'];
+        if (data != null && !(data is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
@@ -31506,16 +30852,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('data');
-      try {
-        final data = obj['data'];
-        if (data != null && !(data is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ResponseError');
@@ -31527,8 +30863,8 @@
   bool operator ==(Object other) {
     if (other is ResponseError && other.runtimeType == ResponseError) {
       return code == other.code &&
-          message == other.message &&
           data == other.data &&
+          message == other.message &&
           true;
     }
     return false;
@@ -31537,8 +30873,8 @@
   @override
   int get hashCode => Object.hash(
         code,
-        message,
         data,
+        message,
       );
 
   @override
@@ -31552,13 +30888,19 @@
   );
 
   ResponseMessage({
-    this.id,
-    this.result,
-    this.error,
-    required this.jsonrpc,
     this.clientRequestTime,
+    this.error,
+    this.id,
+    required this.jsonrpc,
+    this.result,
   });
   static ResponseMessage fromJson(Map<String, Object?> json) {
+    final clientRequestTimeJson = json['clientRequestTime'];
+    final clientRequestTime = clientRequestTimeJson as int?;
+    final errorJson = json['error'];
+    final error = errorJson != null
+        ? ResponseError.fromJson(errorJson as Map<String, Object?>)
+        : null;
     final idJson = json['id'];
     final id = idJson == null
         ? null
@@ -31567,22 +30909,16 @@
             : (idJson is String
                 ? Either2<int, String>.t2(idJson)
                 : (throw '''$idJson was not one of (int, String)''')));
-    final resultJson = json['result'];
-    final result = resultJson;
-    final errorJson = json['error'];
-    final error = errorJson != null
-        ? ResponseError.fromJson(errorJson as Map<String, Object?>)
-        : null;
     final jsonrpcJson = json['jsonrpc'];
     final jsonrpc = jsonrpcJson as String;
-    final clientRequestTimeJson = json['clientRequestTime'];
-    final clientRequestTime = clientRequestTimeJson as int?;
+    final resultJson = json['result'];
+    final result = resultJson;
     return ResponseMessage(
-      id: id,
-      result: result,
-      error: error,
-      jsonrpc: jsonrpc,
       clientRequestTime: clientRequestTime,
+      error: error,
+      id: id,
+      jsonrpc: jsonrpc,
+      result: result,
     );
   }
 
@@ -31601,11 +30937,11 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['id'] = id;
-    __result['jsonrpc'] = jsonrpc;
     if (clientRequestTime != null) {
       __result['clientRequestTime'] = clientRequestTime;
     }
+    __result['id'] = id;
+    __result['jsonrpc'] = jsonrpc;
     if (error != null && result != null) {
       throw 'result and error cannot both be set';
     } else if (error != null) {
@@ -31618,15 +30954,11 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('id');
+      reporter.push('clientRequestTime');
       try {
-        if (!obj.containsKey('id')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final id = obj['id'];
-        if (id != null && !((id is int || id is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        final clientRequestTime = obj['clientRequestTime'];
+        if (clientRequestTime != null && !(clientRequestTime is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -31642,6 +30974,20 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('id');
+      try {
+        if (!obj.containsKey('id')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final id = obj['id'];
+        if (id != null && !((id is int || id is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('jsonrpc');
       try {
         if (!obj.containsKey('jsonrpc')) {
@@ -31660,16 +31006,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('clientRequestTime');
-      try {
-        final clientRequestTime = obj['clientRequestTime'];
-        if (clientRequestTime != null && !(clientRequestTime is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ResponseMessage');
@@ -31680,11 +31016,11 @@
   @override
   bool operator ==(Object other) {
     if (other is ResponseMessage && other.runtimeType == ResponseMessage) {
-      return id == other.id &&
-          result == other.result &&
+      return clientRequestTime == other.clientRequestTime &&
           error == other.error &&
+          id == other.id &&
           jsonrpc == other.jsonrpc &&
-          clientRequestTime == other.clientRequestTime &&
+          result == other.result &&
           true;
     }
     return false;
@@ -31692,11 +31028,11 @@
 
   @override
   int get hashCode => Object.hash(
-        id,
-        result,
-        error,
-        jsonrpc,
         clientRequestTime,
+        error,
+        id,
+        jsonrpc,
+        result,
       );
 
   @override
@@ -31772,19 +31108,19 @@
   );
 
   SelectionRange({
-    required this.range,
     this.parent,
+    required this.range,
   });
   static SelectionRange fromJson(Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final parentJson = json['parent'];
     final parent = parentJson != null
         ? SelectionRange.fromJson(parentJson as Map<String, Object?>)
         : null;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return SelectionRange(
-      range: range,
       parent: parent,
+      range: range,
     );
   }
 
@@ -31797,15 +31133,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     if (parent != null) {
       __result['parent'] = parent?.toJson();
     }
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('parent');
+      try {
+        final parent = obj['parent'];
+        if (parent != null && !(SelectionRange.canParse(parent, reporter))) {
+          reporter.reportError('must be of type SelectionRange');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('range');
       try {
         if (!obj.containsKey('range')) {
@@ -31824,16 +31170,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('parent');
-      try {
-        final parent = obj['parent'];
-        if (parent != null && !(SelectionRange.canParse(parent, reporter))) {
-          reporter.reportError('must be of type SelectionRange');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type SelectionRange');
@@ -31844,15 +31180,15 @@
   @override
   bool operator ==(Object other) {
     if (other is SelectionRange && other.runtimeType == SelectionRange) {
-      return range == other.range && parent == other.parent && true;
+      return parent == other.parent && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         parent,
+        range,
       );
 
   @override
@@ -31998,27 +31334,12 @@
   );
 
   SelectionRangeParams({
-    required this.textDocument,
-    required this.positions,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.positions,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static SelectionRangeParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionsJson = json['positions'];
-    final positions = (positionsJson as List<Object?>)
-        .map((item) => Position.fromJson(item as Map<String, Object?>))
-        .toList();
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -32027,11 +31348,26 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionsJson = json['positions'];
+    final positions = (positionsJson as List<Object?>)
+        .map((item) => Position.fromJson(item as Map<String, Object?>))
+        .toList();
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return SelectionRangeParams(
-      textDocument: textDocument,
-      positions: positions,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      positions: positions,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -32050,32 +31386,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['positions'] = positions.map((item) => item.toJson()).toList();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['positions'] = positions.map((item) => item.toJson()).toList();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -32100,22 +31429,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -32133,11 +31469,11 @@
   bool operator ==(Object other) {
     if (other is SelectionRangeParams &&
         other.runtimeType == SelectionRangeParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           listEqual(
               positions, other.positions, (Position a, Position b) => a == b) &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -32145,10 +31481,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        lspHashCode(positions),
-        workDoneToken,
         partialResultToken,
+        lspHashCode(positions),
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -32167,29 +31503,30 @@
   );
 
   SelectionRangeRegistrationOptions({
-    this.workDoneProgress,
     this.documentSelector,
     this.id,
+    this.workDoneProgress,
   });
   static SelectionRangeRegistrationOptions fromJson(Map<String, Object?> json) {
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return SelectionRangeRegistrationOptions(
-      workDoneProgress: workDoneProgress,
       documentSelector: documentSelector,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -32198,28 +31535,18 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     __result['documentSelector'] = documentSelector;
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -32230,8 +31557,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -32247,6 +31574,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SelectionRangeRegistrationOptions');
@@ -32258,10 +31595,10 @@
   bool operator ==(Object other) {
     if (other is SelectionRangeRegistrationOptions &&
         other.runtimeType == SelectionRangeRegistrationOptions) {
-      return workDoneProgress == other.workDoneProgress &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -32269,9 +31606,9 @@
 
   @override
   int get hashCode => Object.hash(
-        workDoneProgress,
         lspHashCode(documentSelector),
         id,
+        workDoneProgress,
       );
 
   @override
@@ -32365,18 +31702,18 @@
   );
 
   SemanticTokens({
-    this.resultId,
     required this.data,
+    this.resultId,
   });
   static SemanticTokens fromJson(Map<String, Object?> json) {
-    final resultIdJson = json['resultId'];
-    final resultId = resultIdJson as String?;
     final dataJson = json['data'];
     final data =
         (dataJson as List<Object?>).map((item) => item as int).toList();
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
     return SemanticTokens(
-      resultId: resultId,
       data: data,
+      resultId: resultId,
     );
   }
 
@@ -32391,25 +31728,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['data'] = data;
     if (resultId != null) {
       __result['resultId'] = resultId;
     }
-    __result['data'] = data;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('resultId');
-      try {
-        final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('data');
       try {
         if (!obj.containsKey('data')) {
@@ -32428,6 +31755,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('resultId');
+      try {
+        final resultId = obj['resultId'];
+        if (resultId != null && !(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SemanticTokens');
@@ -32438,8 +31775,8 @@
   @override
   bool operator ==(Object other) {
     if (other is SemanticTokens && other.runtimeType == SemanticTokens) {
-      return resultId == other.resultId &&
-          listEqual(data, other.data, (int a, int b) => a == b) &&
+      return listEqual(data, other.data, (int a, int b) => a == b) &&
+          resultId == other.resultId &&
           true;
     }
     return false;
@@ -32447,8 +31784,8 @@
 
   @override
   int get hashCode => Object.hash(
-        resultId,
         lspHashCode(data),
+        resultId,
       );
 
   @override
@@ -32462,52 +31799,52 @@
   );
 
   SemanticTokensClientCapabilities({
-    this.dynamicRegistration,
-    required this.requests,
-    required this.tokenTypes,
-    required this.tokenModifiers,
-    required this.formats,
-    this.overlappingTokenSupport,
-    this.multilineTokenSupport,
-    this.serverCancelSupport,
     this.augmentsSyntaxTokens,
+    this.dynamicRegistration,
+    required this.formats,
+    this.multilineTokenSupport,
+    this.overlappingTokenSupport,
+    required this.requests,
+    this.serverCancelSupport,
+    required this.tokenModifiers,
+    required this.tokenTypes,
   });
   static SemanticTokensClientCapabilities fromJson(Map<String, Object?> json) {
+    final augmentsSyntaxTokensJson = json['augmentsSyntaxTokens'];
+    final augmentsSyntaxTokens = augmentsSyntaxTokensJson as bool?;
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
-    final requestsJson = json['requests'];
-    final requests = SemanticTokensClientCapabilitiesRequests.fromJson(
-        requestsJson as Map<String, Object?>);
-    final tokenTypesJson = json['tokenTypes'];
-    final tokenTypes = (tokenTypesJson as List<Object?>)
-        .map((item) => item as String)
-        .toList();
-    final tokenModifiersJson = json['tokenModifiers'];
-    final tokenModifiers = (tokenModifiersJson as List<Object?>)
-        .map((item) => item as String)
-        .toList();
     final formatsJson = json['formats'];
     final formats = (formatsJson as List<Object?>)
         .map((item) => TokenFormat.fromJson(item as String))
         .toList();
-    final overlappingTokenSupportJson = json['overlappingTokenSupport'];
-    final overlappingTokenSupport = overlappingTokenSupportJson as bool?;
     final multilineTokenSupportJson = json['multilineTokenSupport'];
     final multilineTokenSupport = multilineTokenSupportJson as bool?;
+    final overlappingTokenSupportJson = json['overlappingTokenSupport'];
+    final overlappingTokenSupport = overlappingTokenSupportJson as bool?;
+    final requestsJson = json['requests'];
+    final requests = SemanticTokensClientCapabilitiesRequests.fromJson(
+        requestsJson as Map<String, Object?>);
     final serverCancelSupportJson = json['serverCancelSupport'];
     final serverCancelSupport = serverCancelSupportJson as bool?;
-    final augmentsSyntaxTokensJson = json['augmentsSyntaxTokens'];
-    final augmentsSyntaxTokens = augmentsSyntaxTokensJson as bool?;
+    final tokenModifiersJson = json['tokenModifiers'];
+    final tokenModifiers = (tokenModifiersJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
+    final tokenTypesJson = json['tokenTypes'];
+    final tokenTypes = (tokenTypesJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
     return SemanticTokensClientCapabilities(
-      dynamicRegistration: dynamicRegistration,
-      requests: requests,
-      tokenTypes: tokenTypes,
-      tokenModifiers: tokenModifiers,
-      formats: formats,
-      overlappingTokenSupport: overlappingTokenSupport,
-      multilineTokenSupport: multilineTokenSupport,
-      serverCancelSupport: serverCancelSupport,
       augmentsSyntaxTokens: augmentsSyntaxTokens,
+      dynamicRegistration: dynamicRegistration,
+      formats: formats,
+      multilineTokenSupport: multilineTokenSupport,
+      overlappingTokenSupport: overlappingTokenSupport,
+      requests: requests,
+      serverCancelSupport: serverCancelSupport,
+      tokenModifiers: tokenModifiers,
+      tokenTypes: tokenTypes,
     );
   }
 
@@ -32559,30 +31896,40 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (dynamicRegistration != null) {
-      __result['dynamicRegistration'] = dynamicRegistration;
-    }
-    __result['requests'] = requests.toJson();
-    __result['tokenTypes'] = tokenTypes;
-    __result['tokenModifiers'] = tokenModifiers;
-    __result['formats'] = formats.map((item) => item.toJson()).toList();
-    if (overlappingTokenSupport != null) {
-      __result['overlappingTokenSupport'] = overlappingTokenSupport;
-    }
-    if (multilineTokenSupport != null) {
-      __result['multilineTokenSupport'] = multilineTokenSupport;
-    }
-    if (serverCancelSupport != null) {
-      __result['serverCancelSupport'] = serverCancelSupport;
-    }
     if (augmentsSyntaxTokens != null) {
       __result['augmentsSyntaxTokens'] = augmentsSyntaxTokens;
     }
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    __result['formats'] = formats.map((item) => item.toJson()).toList();
+    if (multilineTokenSupport != null) {
+      __result['multilineTokenSupport'] = multilineTokenSupport;
+    }
+    if (overlappingTokenSupport != null) {
+      __result['overlappingTokenSupport'] = overlappingTokenSupport;
+    }
+    __result['requests'] = requests.toJson();
+    if (serverCancelSupport != null) {
+      __result['serverCancelSupport'] = serverCancelSupport;
+    }
+    __result['tokenModifiers'] = tokenModifiers;
+    __result['tokenTypes'] = tokenTypes;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('augmentsSyntaxTokens');
+      try {
+        final augmentsSyntaxTokens = obj['augmentsSyntaxTokens'];
+        if (augmentsSyntaxTokens != null && !(augmentsSyntaxTokens is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
@@ -32593,6 +31940,46 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('formats');
+      try {
+        if (!obj.containsKey('formats')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final formats = obj['formats'];
+        if (formats == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((formats is List<Object?> &&
+            (formats.every((item) => TokenFormat.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TokenFormat>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('multilineTokenSupport');
+      try {
+        final multilineTokenSupport = obj['multilineTokenSupport'];
+        if (multilineTokenSupport != null && !(multilineTokenSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('overlappingTokenSupport');
+      try {
+        final overlappingTokenSupport = obj['overlappingTokenSupport'];
+        if (overlappingTokenSupport != null &&
+            !(overlappingTokenSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('requests');
       try {
         if (!obj.containsKey('requests')) {
@@ -32613,20 +32000,11 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tokenTypes');
+      reporter.push('serverCancelSupport');
       try {
-        if (!obj.containsKey('tokenTypes')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final tokenTypes = obj['tokenTypes'];
-        if (tokenTypes == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((tokenTypes is List<Object?> &&
-            (tokenTypes.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
+        final serverCancelSupport = obj['serverCancelSupport'];
+        if (serverCancelSupport != null && !(serverCancelSupport is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -32651,61 +32029,20 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('formats');
+      reporter.push('tokenTypes');
       try {
-        if (!obj.containsKey('formats')) {
+        if (!obj.containsKey('tokenTypes')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final formats = obj['formats'];
-        if (formats == null) {
+        final tokenTypes = obj['tokenTypes'];
+        if (tokenTypes == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((formats is List<Object?> &&
-            (formats.every((item) => TokenFormat.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<TokenFormat>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('overlappingTokenSupport');
-      try {
-        final overlappingTokenSupport = obj['overlappingTokenSupport'];
-        if (overlappingTokenSupport != null &&
-            !(overlappingTokenSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('multilineTokenSupport');
-      try {
-        final multilineTokenSupport = obj['multilineTokenSupport'];
-        if (multilineTokenSupport != null && !(multilineTokenSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('serverCancelSupport');
-      try {
-        final serverCancelSupport = obj['serverCancelSupport'];
-        if (serverCancelSupport != null && !(serverCancelSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('augmentsSyntaxTokens');
-      try {
-        final augmentsSyntaxTokens = obj['augmentsSyntaxTokens'];
-        if (augmentsSyntaxTokens != null && !(augmentsSyntaxTokens is bool)) {
-          reporter.reportError('must be of type bool');
+        if (!((tokenTypes is List<Object?> &&
+            (tokenTypes.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
           return false;
         }
       } finally {
@@ -32722,18 +32059,18 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensClientCapabilities &&
         other.runtimeType == SemanticTokensClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration &&
-          requests == other.requests &&
-          listEqual(
-              tokenTypes, other.tokenTypes, (String a, String b) => a == b) &&
-          listEqual(tokenModifiers, other.tokenModifiers,
-              (String a, String b) => a == b) &&
+      return augmentsSyntaxTokens == other.augmentsSyntaxTokens &&
+          dynamicRegistration == other.dynamicRegistration &&
           listEqual(formats, other.formats,
               (TokenFormat a, TokenFormat b) => a == b) &&
-          overlappingTokenSupport == other.overlappingTokenSupport &&
           multilineTokenSupport == other.multilineTokenSupport &&
+          overlappingTokenSupport == other.overlappingTokenSupport &&
+          requests == other.requests &&
           serverCancelSupport == other.serverCancelSupport &&
-          augmentsSyntaxTokens == other.augmentsSyntaxTokens &&
+          listEqual(tokenModifiers, other.tokenModifiers,
+              (String a, String b) => a == b) &&
+          listEqual(
+              tokenTypes, other.tokenTypes, (String a, String b) => a == b) &&
           true;
     }
     return false;
@@ -32741,15 +32078,15 @@
 
   @override
   int get hashCode => Object.hash(
-        dynamicRegistration,
-        requests,
-        lspHashCode(tokenTypes),
-        lspHashCode(tokenModifiers),
-        lspHashCode(formats),
-        overlappingTokenSupport,
-        multilineTokenSupport,
-        serverCancelSupport,
         augmentsSyntaxTokens,
+        dynamicRegistration,
+        lspHashCode(formats),
+        multilineTokenSupport,
+        overlappingTokenSupport,
+        requests,
+        serverCancelSupport,
+        lspHashCode(tokenModifiers),
+        lspHashCode(tokenTypes),
       );
 
   @override
@@ -32871,22 +32208,11 @@
   );
 
   SemanticTokensClientCapabilitiesRequests({
-    this.range,
     this.full,
+    this.range,
   });
   static SemanticTokensClientCapabilitiesRequests fromJson(
       Map<String, Object?> json) {
-    final rangeJson = json['range'];
-    final range = rangeJson == null
-        ? null
-        : (rangeJson is bool
-            ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t1(rangeJson)
-            : (SemanticTokensClientCapabilitiesRange.canParse(
-                    rangeJson, nullLspJsonReporter)
-                ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t2(
-                    SemanticTokensClientCapabilitiesRange.fromJson(
-                        rangeJson as Map<String, Object?>))
-                : (throw '''$rangeJson was not one of (bool, SemanticTokensClientCapabilitiesRange)''')));
     final fullJson = json['full'];
     final full = fullJson == null
         ? null
@@ -32898,9 +32224,20 @@
                     SemanticTokensClientCapabilitiesFull.fromJson(
                         fullJson as Map<String, Object?>))
                 : (throw '''$fullJson was not one of (bool, SemanticTokensClientCapabilitiesFull)''')));
+    final rangeJson = json['range'];
+    final range = rangeJson == null
+        ? null
+        : (rangeJson is bool
+            ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t1(rangeJson)
+            : (SemanticTokensClientCapabilitiesRange.canParse(
+                    rangeJson, nullLspJsonReporter)
+                ? Either2<bool, SemanticTokensClientCapabilitiesRange>.t2(
+                    SemanticTokensClientCapabilitiesRange.fromJson(
+                        rangeJson as Map<String, Object?>))
+                : (throw '''$rangeJson was not one of (bool, SemanticTokensClientCapabilitiesRange)''')));
     return SemanticTokensClientCapabilitiesRequests(
-      range: range,
       full: full,
+      range: range,
     );
   }
 
@@ -32914,31 +32251,17 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (range != null) {
-      __result['range'] = range;
-    }
     if (full != null) {
       __result['full'] = full;
     }
+    if (range != null) {
+      __result['range'] = range;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
-      try {
-        final range = obj['range'];
-        if (range != null &&
-            !((range is bool ||
-                SemanticTokensClientCapabilitiesRange.canParse(
-                    range, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<bool, SemanticTokensClientCapabilitiesRange>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('full');
       try {
         final full = obj['full'];
@@ -32953,6 +32276,20 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('range');
+      try {
+        final range = obj['range'];
+        if (range != null &&
+            !((range is bool ||
+                SemanticTokensClientCapabilitiesRange.canParse(
+                    range, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, SemanticTokensClientCapabilitiesRange>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -32965,15 +32302,15 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensClientCapabilitiesRequests &&
         other.runtimeType == SemanticTokensClientCapabilitiesRequests) {
-      return range == other.range && full == other.full && true;
+      return full == other.full && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         full,
+        range,
       );
 
   @override
@@ -32987,20 +32324,20 @@
   );
 
   SemanticTokensDelta({
-    this.resultId,
     required this.edits,
+    this.resultId,
   });
   static SemanticTokensDelta fromJson(Map<String, Object?> json) {
-    final resultIdJson = json['resultId'];
-    final resultId = resultIdJson as String?;
     final editsJson = json['edits'];
     final edits = (editsJson as List<Object?>)
         .map(
             (item) => SemanticTokensEdit.fromJson(item as Map<String, Object?>))
         .toList();
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
     return SemanticTokensDelta(
-      resultId: resultId,
       edits: edits,
+      resultId: resultId,
     );
   }
 
@@ -33010,25 +32347,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['edits'] = edits.map((item) => item.toJson()).toList();
     if (resultId != null) {
       __result['resultId'] = resultId;
     }
-    __result['edits'] = edits.map((item) => item.toJson()).toList();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('resultId');
-      try {
-        final resultId = obj['resultId'];
-        if (resultId != null && !(resultId is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('edits');
       try {
         if (!obj.containsKey('edits')) {
@@ -33049,6 +32376,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('resultId');
+      try {
+        final resultId = obj['resultId'];
+        if (resultId != null && !(resultId is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SemanticTokensDelta');
@@ -33060,9 +32397,9 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensDelta &&
         other.runtimeType == SemanticTokensDelta) {
-      return resultId == other.resultId &&
-          listEqual(edits, other.edits,
+      return listEqual(edits, other.edits,
               (SemanticTokensEdit a, SemanticTokensEdit b) => a == b) &&
+          resultId == other.resultId &&
           true;
     }
     return false;
@@ -33070,8 +32407,8 @@
 
   @override
   int get hashCode => Object.hash(
-        resultId,
         lspHashCode(edits),
+        resultId,
       );
 
   @override
@@ -33086,25 +32423,12 @@
   );
 
   SemanticTokensDeltaParams({
-    required this.textDocument,
-    required this.previousResultId,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.previousResultId,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static SemanticTokensDeltaParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final previousResultIdJson = json['previousResultId'];
-    final previousResultId = previousResultIdJson as String;
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -33113,11 +32437,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final previousResultIdJson = json['previousResultId'];
+    final previousResultId = previousResultIdJson as String;
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return SemanticTokensDeltaParams(
-      textDocument: textDocument,
-      previousResultId: previousResultId,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      previousResultId: previousResultId,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -33137,32 +32474,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['previousResultId'] = previousResultId;
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['previousResultId'] = previousResultId;
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -33186,22 +32516,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -33219,10 +32556,10 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensDeltaParams &&
         other.runtimeType == SemanticTokensDeltaParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           previousResultId == other.previousResultId &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -33230,10 +32567,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        previousResultId,
-        workDoneToken,
         partialResultToken,
+        previousResultId,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -33322,22 +32659,22 @@
   );
 
   SemanticTokensEdit({
-    required this.start,
-    required this.deleteCount,
     this.data,
+    required this.deleteCount,
+    required this.start,
   });
   static SemanticTokensEdit fromJson(Map<String, Object?> json) {
-    final startJson = json['start'];
-    final start = startJson as int;
-    final deleteCountJson = json['deleteCount'];
-    final deleteCount = deleteCountJson as int;
     final dataJson = json['data'];
     final data =
         (dataJson as List<Object?>?)?.map((item) => item as int).toList();
+    final deleteCountJson = json['deleteCount'];
+    final deleteCount = deleteCountJson as int;
+    final startJson = json['start'];
+    final start = startJson as int;
     return SemanticTokensEdit(
-      start: start,
-      deleteCount: deleteCount,
       data: data,
+      deleteCount: deleteCount,
+      start: start,
     );
   }
 
@@ -33352,29 +32689,22 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['start'] = start;
-    __result['deleteCount'] = deleteCount;
     if (data != null) {
       __result['data'] = data;
     }
+    __result['deleteCount'] = deleteCount;
+    __result['start'] = start;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('start');
+      reporter.push('data');
       try {
-        if (!obj.containsKey('start')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final start = obj['start'];
-        if (start == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(start is int)) {
-          reporter.reportError('must be of type int');
+        final data = obj['data'];
+        if (data != null &&
+            !((data is List<Object?> && (data.every((item) => item is int))))) {
+          reporter.reportError('must be of type List<int>');
           return false;
         }
       } finally {
@@ -33398,12 +32728,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('data');
+      reporter.push('start');
       try {
-        final data = obj['data'];
-        if (data != null &&
-            !((data is List<Object?> && (data.every((item) => item is int))))) {
-          reporter.reportError('must be of type List<int>');
+        if (!obj.containsKey('start')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final start = obj['start'];
+        if (start == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(start is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -33420,9 +32757,9 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensEdit &&
         other.runtimeType == SemanticTokensEdit) {
-      return start == other.start &&
+      return listEqual(data, other.data, (int a, int b) => a == b) &&
           deleteCount == other.deleteCount &&
-          listEqual(data, other.data, (int a, int b) => a == b) &&
+          start == other.start &&
           true;
     }
     return false;
@@ -33430,9 +32767,9 @@
 
   @override
   int get hashCode => Object.hash(
-        start,
-        deleteCount,
         lspHashCode(data),
+        deleteCount,
+        start,
       );
 
   @override
@@ -33446,21 +32783,21 @@
   );
 
   SemanticTokensLegend({
-    required this.tokenTypes,
     required this.tokenModifiers,
+    required this.tokenTypes,
   });
   static SemanticTokensLegend fromJson(Map<String, Object?> json) {
-    final tokenTypesJson = json['tokenTypes'];
-    final tokenTypes = (tokenTypesJson as List<Object?>)
-        .map((item) => item as String)
-        .toList();
     final tokenModifiersJson = json['tokenModifiers'];
     final tokenModifiers = (tokenModifiersJson as List<Object?>)
         .map((item) => item as String)
         .toList();
+    final tokenTypesJson = json['tokenTypes'];
+    final tokenTypes = (tokenTypesJson as List<Object?>)
+        .map((item) => item as String)
+        .toList();
     return SemanticTokensLegend(
-      tokenTypes: tokenTypes,
       tokenModifiers: tokenModifiers,
+      tokenTypes: tokenTypes,
     );
   }
 
@@ -33472,32 +32809,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['tokenTypes'] = tokenTypes;
     __result['tokenModifiers'] = tokenModifiers;
+    __result['tokenTypes'] = tokenTypes;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('tokenTypes');
-      try {
-        if (!obj.containsKey('tokenTypes')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final tokenTypes = obj['tokenTypes'];
-        if (tokenTypes == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((tokenTypes is List<Object?> &&
-            (tokenTypes.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('tokenModifiers');
       try {
         if (!obj.containsKey('tokenModifiers')) {
@@ -33517,6 +32835,25 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('tokenTypes');
+      try {
+        if (!obj.containsKey('tokenTypes')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final tokenTypes = obj['tokenTypes'];
+        if (tokenTypes == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((tokenTypes is List<Object?> &&
+            (tokenTypes.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SemanticTokensLegend');
@@ -33528,10 +32865,10 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensLegend &&
         other.runtimeType == SemanticTokensLegend) {
-      return listEqual(
-              tokenTypes, other.tokenTypes, (String a, String b) => a == b) &&
-          listEqual(tokenModifiers, other.tokenModifiers,
+      return listEqual(tokenModifiers, other.tokenModifiers,
               (String a, String b) => a == b) &&
+          listEqual(
+              tokenTypes, other.tokenTypes, (String a, String b) => a == b) &&
           true;
     }
     return false;
@@ -33539,8 +32876,8 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(tokenTypes),
         lspHashCode(tokenModifiers),
+        lspHashCode(tokenTypes),
       );
 
   @override
@@ -33554,15 +32891,25 @@
   );
 
   SemanticTokensOptions({
+    this.full,
     required this.legend,
     this.range,
-    this.full,
     this.workDoneProgress,
   });
   static SemanticTokensOptions fromJson(Map<String, Object?> json) {
     if (SemanticTokensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return SemanticTokensRegistrationOptions.fromJson(json);
     }
+    final fullJson = json['full'];
+    final full = fullJson == null
+        ? null
+        : (fullJson is bool
+            ? Either2<bool, SemanticTokensOptionsFull>.t1(fullJson)
+            : (SemanticTokensOptionsFull.canParse(fullJson, nullLspJsonReporter)
+                ? Either2<bool, SemanticTokensOptionsFull>.t2(
+                    SemanticTokensOptionsFull.fromJson(
+                        fullJson as Map<String, Object?>))
+                : (throw '''$fullJson was not one of (bool, SemanticTokensOptionsFull)''')));
     final legendJson = json['legend'];
     final legend =
         SemanticTokensLegend.fromJson(legendJson as Map<String, Object?>);
@@ -33577,22 +32924,12 @@
                     SemanticTokensOptionsRange.fromJson(
                         rangeJson as Map<String, Object?>))
                 : (throw '''$rangeJson was not one of (bool, SemanticTokensOptionsRange)''')));
-    final fullJson = json['full'];
-    final full = fullJson == null
-        ? null
-        : (fullJson is bool
-            ? Either2<bool, SemanticTokensOptionsFull>.t1(fullJson)
-            : (SemanticTokensOptionsFull.canParse(fullJson, nullLspJsonReporter)
-                ? Either2<bool, SemanticTokensOptionsFull>.t2(
-                    SemanticTokensOptionsFull.fromJson(
-                        fullJson as Map<String, Object?>))
-                : (throw '''$fullJson was not one of (bool, SemanticTokensOptionsFull)''')));
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return SemanticTokensOptions(
+      full: full,
       legend: legend,
       range: range,
-      full: full,
       workDoneProgress: workDoneProgress,
     );
   }
@@ -33610,13 +32947,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (full != null) {
+      __result['full'] = full;
+    }
     __result['legend'] = legend.toJson();
     if (range != null) {
       __result['range'] = range;
     }
-    if (full != null) {
-      __result['full'] = full;
-    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -33625,6 +32962,19 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('full');
+      try {
+        final full = obj['full'];
+        if (full != null &&
+            !((full is bool ||
+                SemanticTokensOptionsFull.canParse(full, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, SemanticTokensOptionsFull>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('legend');
       try {
         if (!obj.containsKey('legend')) {
@@ -33656,19 +33006,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('full');
-      try {
-        final full = obj['full'];
-        if (full != null &&
-            !((full is bool ||
-                SemanticTokensOptionsFull.canParse(full, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<bool, SemanticTokensOptionsFull>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -33690,9 +33027,9 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensOptions &&
         other.runtimeType == SemanticTokensOptions) {
-      return legend == other.legend &&
+      return full == other.full &&
+          legend == other.legend &&
           range == other.range &&
-          full == other.full &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -33701,9 +33038,9 @@
 
   @override
   int get hashCode => Object.hash(
+        full,
         legend,
         range,
-        full,
         workDoneProgress,
       );
 
@@ -33822,11 +33159,19 @@
   );
 
   SemanticTokensParams({
+    this.partialResultToken,
     required this.textDocument,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static SemanticTokensParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
@@ -33838,18 +33183,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return SemanticTokensParams(
+      partialResultToken: partialResultToken,
       textDocument: textDocument,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -33865,18 +33202,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -33906,17 +33254,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type SemanticTokensParams');
@@ -33928,9 +33265,9 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensParams &&
         other.runtimeType == SemanticTokensParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -33938,9 +33275,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         textDocument,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -34024,25 +33361,12 @@
   );
 
   SemanticTokensRangeParams({
-    required this.textDocument,
-    required this.range,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.range,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static SemanticTokensRangeParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -34051,11 +33375,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return SemanticTokensRangeParams(
-      textDocument: textDocument,
-      range: range,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      range: range,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -34074,32 +33411,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['range'] = range.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['range'] = range.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -34123,22 +33453,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -34156,10 +33493,10 @@
   bool operator ==(Object other) {
     if (other is SemanticTokensRangeParams &&
         other.runtimeType == SemanticTokensRangeParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           range == other.range &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -34167,10 +33504,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        range,
-        workDoneToken,
         partialResultToken,
+        range,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -34190,17 +33527,30 @@
 
   SemanticTokensRegistrationOptions({
     this.documentSelector,
+    this.full,
+    this.id,
     required this.legend,
     this.range,
-    this.full,
     this.workDoneProgress,
-    this.id,
   });
   static SemanticTokensRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
+    final fullJson = json['full'];
+    final full = fullJson == null
+        ? null
+        : (fullJson is bool
+            ? Either2<bool, SemanticTokensOptionsFull>.t1(fullJson)
+            : (SemanticTokensOptionsFull.canParse(fullJson, nullLspJsonReporter)
+                ? Either2<bool, SemanticTokensOptionsFull>.t2(
+                    SemanticTokensOptionsFull.fromJson(
+                        fullJson as Map<String, Object?>))
+                : (throw '''$fullJson was not one of (bool, SemanticTokensOptionsFull)''')));
+    final idJson = json['id'];
+    final id = idJson as String?;
     final legendJson = json['legend'];
     final legend =
         SemanticTokensLegend.fromJson(legendJson as Map<String, Object?>);
@@ -34215,33 +33565,21 @@
                     SemanticTokensOptionsRange.fromJson(
                         rangeJson as Map<String, Object?>))
                 : (throw '''$rangeJson was not one of (bool, SemanticTokensOptionsRange)''')));
-    final fullJson = json['full'];
-    final full = fullJson == null
-        ? null
-        : (fullJson is bool
-            ? Either2<bool, SemanticTokensOptionsFull>.t1(fullJson)
-            : (SemanticTokensOptionsFull.canParse(fullJson, nullLspJsonReporter)
-                ? Either2<bool, SemanticTokensOptionsFull>.t2(
-                    SemanticTokensOptionsFull.fromJson(
-                        fullJson as Map<String, Object?>))
-                : (throw '''$fullJson was not one of (bool, SemanticTokensOptionsFull)''')));
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
-    final idJson = json['id'];
-    final id = idJson as String?;
     return SemanticTokensRegistrationOptions(
       documentSelector: documentSelector,
+      full: full,
+      id: id,
       legend: legend,
       range: range,
-      full: full,
       workDoneProgress: workDoneProgress,
-      id: id,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// Server supports providing semantic tokens for a full document.
   final Either2<bool, SemanticTokensOptionsFull>? full;
@@ -34261,19 +33599,19 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
+    if (full != null) {
+      __result['full'] = full;
+    }
+    if (id != null) {
+      __result['id'] = id;
+    }
     __result['legend'] = legend.toJson();
     if (range != null) {
       __result['range'] = range;
     }
-    if (full != null) {
-      __result['full'] = full;
-    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
-    if (id != null) {
-      __result['id'] = id;
-    }
     return __result;
   }
 
@@ -34289,8 +33627,31 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('full');
+      try {
+        final full = obj['full'];
+        if (full != null &&
+            !((full is bool ||
+                SemanticTokensOptionsFull.canParse(full, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, SemanticTokensOptionsFull>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        final id = obj['id'];
+        if (id != null && !(id is String)) {
+          reporter.reportError('must be of type String');
           return false;
         }
       } finally {
@@ -34327,19 +33688,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('full');
-      try {
-        final full = obj['full'];
-        if (full != null &&
-            !((full is bool ||
-                SemanticTokensOptionsFull.canParse(full, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<bool, SemanticTokensOptionsFull>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -34350,16 +33698,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('id');
-      try {
-        final id = obj['id'];
-        if (id != null && !(id is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type SemanticTokensRegistrationOptions');
@@ -34372,12 +33710,12 @@
     if (other is SemanticTokensRegistrationOptions &&
         other.runtimeType == SemanticTokensRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          full == other.full &&
+          id == other.id &&
           legend == other.legend &&
           range == other.range &&
-          full == other.full &&
           workDoneProgress == other.workDoneProgress &&
-          id == other.id &&
           true;
     }
     return false;
@@ -34386,11 +33724,11 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
+        full,
+        id,
         legend,
         range,
-        full,
         workDoneProgress,
-        id,
       );
 
   @override
@@ -34475,93 +33813,96 @@
   );
 
   ServerCapabilities({
-    this.positionEncoding,
-    this.textDocumentSync,
-    this.notebookDocumentSync,
-    this.completionProvider,
-    this.hoverProvider,
-    this.signatureHelpProvider,
-    this.declarationProvider,
-    this.definitionProvider,
-    this.typeDefinitionProvider,
-    this.implementationProvider,
-    this.referencesProvider,
-    this.documentHighlightProvider,
-    this.documentSymbolProvider,
+    this.callHierarchyProvider,
     this.codeActionProvider,
     this.codeLensProvider,
-    this.documentLinkProvider,
     this.colorProvider,
-    this.documentFormattingProvider,
-    this.documentRangeFormattingProvider,
-    this.documentOnTypeFormattingProvider,
-    this.renameProvider,
-    this.foldingRangeProvider,
-    this.executeCommandProvider,
-    this.selectionRangeProvider,
-    this.linkedEditingRangeProvider,
-    this.callHierarchyProvider,
-    this.semanticTokensProvider,
-    this.monikerProvider,
-    this.typeHierarchyProvider,
-    this.inlineValueProvider,
-    this.inlayHintProvider,
+    this.completionProvider,
+    this.declarationProvider,
+    this.definitionProvider,
     this.diagnosticProvider,
-    this.workspaceSymbolProvider,
-    this.workspace,
+    this.documentFormattingProvider,
+    this.documentHighlightProvider,
+    this.documentLinkProvider,
+    this.documentOnTypeFormattingProvider,
+    this.documentRangeFormattingProvider,
+    this.documentSymbolProvider,
+    this.executeCommandProvider,
     this.experimental,
+    this.foldingRangeProvider,
+    this.hoverProvider,
+    this.implementationProvider,
+    this.inlayHintProvider,
+    this.inlineValueProvider,
+    this.linkedEditingRangeProvider,
+    this.monikerProvider,
+    this.notebookDocumentSync,
+    this.positionEncoding,
+    this.referencesProvider,
+    this.renameProvider,
+    this.selectionRangeProvider,
+    this.semanticTokensProvider,
+    this.signatureHelpProvider,
+    this.textDocumentSync,
+    this.typeDefinitionProvider,
+    this.typeHierarchyProvider,
+    this.workspace,
+    this.workspaceSymbolProvider,
   });
   static ServerCapabilities fromJson(Map<String, Object?> json) {
-    final positionEncodingJson = json['positionEncoding'];
-    final positionEncoding = positionEncodingJson != null
-        ? PositionEncodingKind.fromJson(positionEncodingJson as String)
+    final callHierarchyProviderJson = json['callHierarchyProvider'];
+    final callHierarchyProvider = callHierarchyProviderJson == null
+        ? null
+        : (callHierarchyProviderJson is bool
+            ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t1(
+                callHierarchyProviderJson)
+            : (CallHierarchyOptions.canParse(
+                    callHierarchyProviderJson, nullLspJsonReporter)
+                ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t2(
+                    CallHierarchyOptions.fromJson(
+                        callHierarchyProviderJson as Map<String, Object?>))
+                : (CallHierarchyRegistrationOptions.canParse(
+                        callHierarchyProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t3(
+                        CallHierarchyRegistrationOptions.fromJson(
+                            callHierarchyProviderJson as Map<String, Object?>))
+                    : (throw '''$callHierarchyProviderJson was not one of (bool, CallHierarchyOptions, CallHierarchyRegistrationOptions)'''))));
+    final codeActionProviderJson = json['codeActionProvider'];
+    final codeActionProvider = codeActionProviderJson == null
+        ? null
+        : (codeActionProviderJson is bool
+            ? Either2<bool, CodeActionOptions>.t1(codeActionProviderJson)
+            : (CodeActionOptions.canParse(
+                    codeActionProviderJson, nullLspJsonReporter)
+                ? Either2<bool, CodeActionOptions>.t2(
+                    CodeActionOptions.fromJson(
+                        codeActionProviderJson as Map<String, Object?>))
+                : (throw '''$codeActionProviderJson was not one of (bool, CodeActionOptions)''')));
+    final codeLensProviderJson = json['codeLensProvider'];
+    final codeLensProvider = codeLensProviderJson != null
+        ? CodeLensOptions.fromJson(codeLensProviderJson as Map<String, Object?>)
         : null;
-    final textDocumentSyncJson = json['textDocumentSync'];
-    final textDocumentSync = textDocumentSyncJson == null
+    final colorProviderJson = json['colorProvider'];
+    final colorProvider = colorProviderJson == null
         ? null
-        : (TextDocumentSyncOptions.canParse(
-                textDocumentSyncJson, nullLspJsonReporter)
-            ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t1(
-                TextDocumentSyncOptions.fromJson(
-                    textDocumentSyncJson as Map<String, Object?>))
-            : (TextDocumentSyncKind.canParse(
-                    textDocumentSyncJson, nullLspJsonReporter)
-                ? Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t2(
-                    TextDocumentSyncKind.fromJson(textDocumentSyncJson as int))
-                : (throw '''$textDocumentSyncJson was not one of (TextDocumentSyncOptions, TextDocumentSyncKind)''')));
-    final notebookDocumentSyncJson = json['notebookDocumentSync'];
-    final notebookDocumentSync = notebookDocumentSyncJson == null
-        ? null
-        : (NotebookDocumentSyncOptions.canParse(notebookDocumentSyncJson, nullLspJsonReporter)
-            ? Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>.t1(
-                NotebookDocumentSyncOptions.fromJson(
-                    notebookDocumentSyncJson as Map<String, Object?>))
-            : (NotebookDocumentSyncRegistrationOptions.canParse(
-                    notebookDocumentSyncJson, nullLspJsonReporter)
-                ? Either2<NotebookDocumentSyncOptions,
-                        NotebookDocumentSyncRegistrationOptions>.t2(
-                    NotebookDocumentSyncRegistrationOptions.fromJson(
-                        notebookDocumentSyncJson as Map<String, Object?>))
-                : (throw '''$notebookDocumentSyncJson was not one of (NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions)''')));
+        : (colorProviderJson is bool
+            ? Either3<bool, DocumentColorOptions,
+                DocumentColorRegistrationOptions>.t1(colorProviderJson)
+            : (DocumentColorOptions.canParse(colorProviderJson, nullLspJsonReporter)
+                ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t2(
+                    DocumentColorOptions.fromJson(
+                        colorProviderJson as Map<String, Object?>))
+                : (DocumentColorRegistrationOptions.canParse(
+                        colorProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t3(
+                        DocumentColorRegistrationOptions.fromJson(
+                            colorProviderJson as Map<String, Object?>))
+                    : (throw '''$colorProviderJson was not one of (bool, DocumentColorOptions, DocumentColorRegistrationOptions)'''))));
     final completionProviderJson = json['completionProvider'];
     final completionProvider = completionProviderJson != null
         ? CompletionOptions.fromJson(
             completionProviderJson as Map<String, Object?>)
         : null;
-    final hoverProviderJson = json['hoverProvider'];
-    final hoverProvider = hoverProviderJson == null
-        ? null
-        : (hoverProviderJson is bool
-            ? Either2<bool, HoverOptions>.t1(hoverProviderJson)
-            : (HoverOptions.canParse(hoverProviderJson, nullLspJsonReporter)
-                ? Either2<bool, HoverOptions>.t2(HoverOptions.fromJson(
-                    hoverProviderJson as Map<String, Object?>))
-                : (throw '''$hoverProviderJson was not one of (bool, HoverOptions)''')));
-    final signatureHelpProviderJson = json['signatureHelpProvider'];
-    final signatureHelpProvider = signatureHelpProviderJson != null
-        ? SignatureHelpOptions.fromJson(
-            signatureHelpProviderJson as Map<String, Object?>)
-        : null;
     final declarationProviderJson = json['declarationProvider'];
     final declarationProvider = declarationProviderJson == null
         ? null
@@ -34590,110 +33931,20 @@
                     DefinitionOptions.fromJson(
                         definitionProviderJson as Map<String, Object?>))
                 : (throw '''$definitionProviderJson was not one of (bool, DefinitionOptions)''')));
-    final typeDefinitionProviderJson = json['typeDefinitionProvider'];
-    final typeDefinitionProvider = typeDefinitionProviderJson == null
+    final diagnosticProviderJson = json['diagnosticProvider'];
+    final diagnosticProvider = diagnosticProviderJson == null
         ? null
-        : (typeDefinitionProviderJson is bool
-            ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t1(
-                typeDefinitionProviderJson)
-            : (TypeDefinitionOptions.canParse(
-                    typeDefinitionProviderJson, nullLspJsonReporter)
-                ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t2(
-                    TypeDefinitionOptions.fromJson(
-                        typeDefinitionProviderJson as Map<String, Object?>))
-                : (TypeDefinitionRegistrationOptions.canParse(
-                        typeDefinitionProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t3(
-                        TypeDefinitionRegistrationOptions.fromJson(
-                            typeDefinitionProviderJson as Map<String, Object?>))
-                    : (throw '''$typeDefinitionProviderJson was not one of (bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions)'''))));
-    final implementationProviderJson = json['implementationProvider'];
-    final implementationProvider = implementationProviderJson == null
-        ? null
-        : (implementationProviderJson is bool
-            ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t1(
-                implementationProviderJson)
-            : (ImplementationOptions.canParse(
-                    implementationProviderJson, nullLspJsonReporter)
-                ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t2(
-                    ImplementationOptions.fromJson(
-                        implementationProviderJson as Map<String, Object?>))
-                : (ImplementationRegistrationOptions.canParse(
-                        implementationProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t3(
-                        ImplementationRegistrationOptions.fromJson(
-                            implementationProviderJson as Map<String, Object?>))
-                    : (throw '''$implementationProviderJson was not one of (bool, ImplementationOptions, ImplementationRegistrationOptions)'''))));
-    final referencesProviderJson = json['referencesProvider'];
-    final referencesProvider = referencesProviderJson == null
-        ? null
-        : (referencesProviderJson is bool
-            ? Either2<bool, ReferenceOptions>.t1(referencesProviderJson)
-            : (ReferenceOptions.canParse(
-                    referencesProviderJson, nullLspJsonReporter)
-                ? Either2<bool, ReferenceOptions>.t2(ReferenceOptions.fromJson(
-                    referencesProviderJson as Map<String, Object?>))
-                : (throw '''$referencesProviderJson was not one of (bool, ReferenceOptions)''')));
-    final documentHighlightProviderJson = json['documentHighlightProvider'];
-    final documentHighlightProvider = documentHighlightProviderJson == null
-        ? null
-        : (documentHighlightProviderJson is bool
-            ? Either2<bool, DocumentHighlightOptions>.t1(
-                documentHighlightProviderJson)
-            : (DocumentHighlightOptions.canParse(
-                    documentHighlightProviderJson, nullLspJsonReporter)
-                ? Either2<bool, DocumentHighlightOptions>.t2(
-                    DocumentHighlightOptions.fromJson(
-                        documentHighlightProviderJson as Map<String, Object?>))
-                : (throw '''$documentHighlightProviderJson was not one of (bool, DocumentHighlightOptions)''')));
-    final documentSymbolProviderJson = json['documentSymbolProvider'];
-    final documentSymbolProvider = documentSymbolProviderJson == null
-        ? null
-        : (documentSymbolProviderJson is bool
-            ? Either2<bool, DocumentSymbolOptions>.t1(
-                documentSymbolProviderJson)
-            : (DocumentSymbolOptions.canParse(
-                    documentSymbolProviderJson, nullLspJsonReporter)
-                ? Either2<bool, DocumentSymbolOptions>.t2(
-                    DocumentSymbolOptions.fromJson(
-                        documentSymbolProviderJson as Map<String, Object?>))
-                : (throw '''$documentSymbolProviderJson was not one of (bool, DocumentSymbolOptions)''')));
-    final codeActionProviderJson = json['codeActionProvider'];
-    final codeActionProvider = codeActionProviderJson == null
-        ? null
-        : (codeActionProviderJson is bool
-            ? Either2<bool, CodeActionOptions>.t1(codeActionProviderJson)
-            : (CodeActionOptions.canParse(
-                    codeActionProviderJson, nullLspJsonReporter)
-                ? Either2<bool, CodeActionOptions>.t2(
-                    CodeActionOptions.fromJson(
-                        codeActionProviderJson as Map<String, Object?>))
-                : (throw '''$codeActionProviderJson was not one of (bool, CodeActionOptions)''')));
-    final codeLensProviderJson = json['codeLensProvider'];
-    final codeLensProvider = codeLensProviderJson != null
-        ? CodeLensOptions.fromJson(codeLensProviderJson as Map<String, Object?>)
-        : null;
-    final documentLinkProviderJson = json['documentLinkProvider'];
-    final documentLinkProvider = documentLinkProviderJson != null
-        ? DocumentLinkOptions.fromJson(
-            documentLinkProviderJson as Map<String, Object?>)
-        : null;
-    final colorProviderJson = json['colorProvider'];
-    final colorProvider = colorProviderJson == null
-        ? null
-        : (colorProviderJson is bool
-            ? Either3<bool, DocumentColorOptions,
-                DocumentColorRegistrationOptions>.t1(colorProviderJson)
-            : (DocumentColorOptions.canParse(colorProviderJson, nullLspJsonReporter)
-                ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t2(
-                    DocumentColorOptions.fromJson(
-                        colorProviderJson as Map<String, Object?>))
-                : (DocumentColorRegistrationOptions.canParse(
-                        colorProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t3(
-                        DocumentColorRegistrationOptions.fromJson(
-                            colorProviderJson as Map<String, Object?>))
-                    : (throw '''$colorProviderJson was not one of (bool, DocumentColorOptions, DocumentColorRegistrationOptions)'''))));
+        : (DiagnosticOptions.canParse(
+                diagnosticProviderJson, nullLspJsonReporter)
+            ? Either2<DiagnosticOptions, DiagnosticRegistrationOptions>.t1(
+                DiagnosticOptions.fromJson(
+                    diagnosticProviderJson as Map<String, Object?>))
+            : (DiagnosticRegistrationOptions.canParse(
+                    diagnosticProviderJson, nullLspJsonReporter)
+                ? Either2<DiagnosticOptions, DiagnosticRegistrationOptions>.t2(
+                    DiagnosticRegistrationOptions.fromJson(
+                        diagnosticProviderJson as Map<String, Object?>))
+                : (throw '''$diagnosticProviderJson was not one of (DiagnosticOptions, DiagnosticRegistrationOptions)''')));
     final documentFormattingProviderJson = json['documentFormattingProvider'];
     final documentFormattingProvider = documentFormattingProviderJson == null
         ? null
@@ -34706,6 +33957,30 @@
                     DocumentFormattingOptions.fromJson(
                         documentFormattingProviderJson as Map<String, Object?>))
                 : (throw '''$documentFormattingProviderJson was not one of (bool, DocumentFormattingOptions)''')));
+    final documentHighlightProviderJson = json['documentHighlightProvider'];
+    final documentHighlightProvider = documentHighlightProviderJson == null
+        ? null
+        : (documentHighlightProviderJson is bool
+            ? Either2<bool, DocumentHighlightOptions>.t1(
+                documentHighlightProviderJson)
+            : (DocumentHighlightOptions.canParse(
+                    documentHighlightProviderJson, nullLspJsonReporter)
+                ? Either2<bool, DocumentHighlightOptions>.t2(
+                    DocumentHighlightOptions.fromJson(
+                        documentHighlightProviderJson as Map<String, Object?>))
+                : (throw '''$documentHighlightProviderJson was not one of (bool, DocumentHighlightOptions)''')));
+    final documentLinkProviderJson = json['documentLinkProvider'];
+    final documentLinkProvider = documentLinkProviderJson != null
+        ? DocumentLinkOptions.fromJson(
+            documentLinkProviderJson as Map<String, Object?>)
+        : null;
+    final documentOnTypeFormattingProviderJson =
+        json['documentOnTypeFormattingProvider'];
+    final documentOnTypeFormattingProvider =
+        documentOnTypeFormattingProviderJson != null
+            ? DocumentOnTypeFormattingOptions.fromJson(
+                documentOnTypeFormattingProviderJson as Map<String, Object?>)
+            : null;
     final documentRangeFormattingProviderJson =
         json['documentRangeFormattingProvider'];
     final documentRangeFormattingProvider = documentRangeFormattingProviderJson ==
@@ -34721,22 +33996,25 @@
                         documentRangeFormattingProviderJson
                             as Map<String, Object?>))
                 : (throw '''$documentRangeFormattingProviderJson was not one of (bool, DocumentRangeFormattingOptions)''')));
-    final documentOnTypeFormattingProviderJson =
-        json['documentOnTypeFormattingProvider'];
-    final documentOnTypeFormattingProvider =
-        documentOnTypeFormattingProviderJson != null
-            ? DocumentOnTypeFormattingOptions.fromJson(
-                documentOnTypeFormattingProviderJson as Map<String, Object?>)
-            : null;
-    final renameProviderJson = json['renameProvider'];
-    final renameProvider = renameProviderJson == null
+    final documentSymbolProviderJson = json['documentSymbolProvider'];
+    final documentSymbolProvider = documentSymbolProviderJson == null
         ? null
-        : (renameProviderJson is bool
-            ? Either2<bool, RenameOptions>.t1(renameProviderJson)
-            : (RenameOptions.canParse(renameProviderJson, nullLspJsonReporter)
-                ? Either2<bool, RenameOptions>.t2(RenameOptions.fromJson(
-                    renameProviderJson as Map<String, Object?>))
-                : (throw '''$renameProviderJson was not one of (bool, RenameOptions)''')));
+        : (documentSymbolProviderJson is bool
+            ? Either2<bool, DocumentSymbolOptions>.t1(
+                documentSymbolProviderJson)
+            : (DocumentSymbolOptions.canParse(
+                    documentSymbolProviderJson, nullLspJsonReporter)
+                ? Either2<bool, DocumentSymbolOptions>.t2(
+                    DocumentSymbolOptions.fromJson(
+                        documentSymbolProviderJson as Map<String, Object?>))
+                : (throw '''$documentSymbolProviderJson was not one of (bool, DocumentSymbolOptions)''')));
+    final executeCommandProviderJson = json['executeCommandProvider'];
+    final executeCommandProvider = executeCommandProviderJson != null
+        ? ExecuteCommandOptions.fromJson(
+            executeCommandProviderJson as Map<String, Object?>)
+        : null;
+    final experimentalJson = json['experimental'];
+    final experimental = experimentalJson;
     final foldingRangeProviderJson = json['foldingRangeProvider'];
     final foldingRangeProvider = foldingRangeProviderJson == null
         ? null
@@ -34754,127 +34032,32 @@
                         FoldingRangeRegistrationOptions.fromJson(
                             foldingRangeProviderJson as Map<String, Object?>))
                     : (throw '''$foldingRangeProviderJson was not one of (bool, FoldingRangeOptions, FoldingRangeRegistrationOptions)'''))));
-    final executeCommandProviderJson = json['executeCommandProvider'];
-    final executeCommandProvider = executeCommandProviderJson != null
-        ? ExecuteCommandOptions.fromJson(
-            executeCommandProviderJson as Map<String, Object?>)
-        : null;
-    final selectionRangeProviderJson = json['selectionRangeProvider'];
-    final selectionRangeProvider = selectionRangeProviderJson == null
+    final hoverProviderJson = json['hoverProvider'];
+    final hoverProvider = hoverProviderJson == null
         ? null
-        : (selectionRangeProviderJson is bool
-            ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t1(
-                selectionRangeProviderJson)
-            : (SelectionRangeOptions.canParse(
-                    selectionRangeProviderJson, nullLspJsonReporter)
-                ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t2(
-                    SelectionRangeOptions.fromJson(
-                        selectionRangeProviderJson as Map<String, Object?>))
-                : (SelectionRangeRegistrationOptions.canParse(
-                        selectionRangeProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t3(
-                        SelectionRangeRegistrationOptions.fromJson(
-                            selectionRangeProviderJson as Map<String, Object?>))
-                    : (throw '''$selectionRangeProviderJson was not one of (bool, SelectionRangeOptions, SelectionRangeRegistrationOptions)'''))));
-    final linkedEditingRangeProviderJson = json['linkedEditingRangeProvider'];
-    final linkedEditingRangeProvider = linkedEditingRangeProviderJson == null
+        : (hoverProviderJson is bool
+            ? Either2<bool, HoverOptions>.t1(hoverProviderJson)
+            : (HoverOptions.canParse(hoverProviderJson, nullLspJsonReporter)
+                ? Either2<bool, HoverOptions>.t2(HoverOptions.fromJson(
+                    hoverProviderJson as Map<String, Object?>))
+                : (throw '''$hoverProviderJson was not one of (bool, HoverOptions)''')));
+    final implementationProviderJson = json['implementationProvider'];
+    final implementationProvider = implementationProviderJson == null
         ? null
-        : (linkedEditingRangeProviderJson is bool
-            ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t1(
-                linkedEditingRangeProviderJson)
-            : (LinkedEditingRangeOptions.canParse(
-                    linkedEditingRangeProviderJson, nullLspJsonReporter)
-                ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t2(
-                    LinkedEditingRangeOptions.fromJson(
-                        linkedEditingRangeProviderJson as Map<String, Object?>))
-                : (LinkedEditingRangeRegistrationOptions.canParse(
-                        linkedEditingRangeProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t3(
-                        LinkedEditingRangeRegistrationOptions.fromJson(
-                            linkedEditingRangeProviderJson as Map<String, Object?>))
-                    : (throw '''$linkedEditingRangeProviderJson was not one of (bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions)'''))));
-    final callHierarchyProviderJson = json['callHierarchyProvider'];
-    final callHierarchyProvider = callHierarchyProviderJson == null
-        ? null
-        : (callHierarchyProviderJson is bool
-            ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t1(
-                callHierarchyProviderJson)
-            : (CallHierarchyOptions.canParse(
-                    callHierarchyProviderJson, nullLspJsonReporter)
-                ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t2(
-                    CallHierarchyOptions.fromJson(
-                        callHierarchyProviderJson as Map<String, Object?>))
-                : (CallHierarchyRegistrationOptions.canParse(
-                        callHierarchyProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>.t3(
-                        CallHierarchyRegistrationOptions.fromJson(
-                            callHierarchyProviderJson as Map<String, Object?>))
-                    : (throw '''$callHierarchyProviderJson was not one of (bool, CallHierarchyOptions, CallHierarchyRegistrationOptions)'''))));
-    final semanticTokensProviderJson = json['semanticTokensProvider'];
-    final semanticTokensProvider = semanticTokensProviderJson == null
-        ? null
-        : (SemanticTokensOptions.canParse(
-                semanticTokensProviderJson, nullLspJsonReporter)
-            ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t1(
-                SemanticTokensOptions.fromJson(
-                    semanticTokensProviderJson as Map<String, Object?>))
-            : (SemanticTokensRegistrationOptions.canParse(
-                    semanticTokensProviderJson, nullLspJsonReporter)
-                ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t2(
-                    SemanticTokensRegistrationOptions.fromJson(
-                        semanticTokensProviderJson as Map<String, Object?>))
-                : (throw '''$semanticTokensProviderJson was not one of (SemanticTokensOptions, SemanticTokensRegistrationOptions)''')));
-    final monikerProviderJson = json['monikerProvider'];
-    final monikerProvider = monikerProviderJson == null
-        ? null
-        : (monikerProviderJson is bool
-            ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t1(
-                monikerProviderJson)
-            : (MonikerOptions.canParse(monikerProviderJson, nullLspJsonReporter)
-                ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t2(
-                    MonikerOptions.fromJson(
-                        monikerProviderJson as Map<String, Object?>))
-                : (MonikerRegistrationOptions.canParse(
-                        monikerProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, MonikerOptions,
-                            MonikerRegistrationOptions>.t3(
-                        MonikerRegistrationOptions.fromJson(
-                            monikerProviderJson as Map<String, Object?>))
-                    : (throw '''$monikerProviderJson was not one of (bool, MonikerOptions, MonikerRegistrationOptions)'''))));
-    final typeHierarchyProviderJson = json['typeHierarchyProvider'];
-    final typeHierarchyProvider = typeHierarchyProviderJson == null
-        ? null
-        : (typeHierarchyProviderJson is bool
-            ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t1(
-                typeHierarchyProviderJson)
-            : (TypeHierarchyOptions.canParse(
-                    typeHierarchyProviderJson, nullLspJsonReporter)
-                ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t2(
-                    TypeHierarchyOptions.fromJson(
-                        typeHierarchyProviderJson as Map<String, Object?>))
-                : (TypeHierarchyRegistrationOptions.canParse(
-                        typeHierarchyProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t3(
-                        TypeHierarchyRegistrationOptions.fromJson(
-                            typeHierarchyProviderJson as Map<String, Object?>))
-                    : (throw '''$typeHierarchyProviderJson was not one of (bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions)'''))));
-    final inlineValueProviderJson = json['inlineValueProvider'];
-    final inlineValueProvider = inlineValueProviderJson == null
-        ? null
-        : (inlineValueProviderJson is bool
-            ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t1(
-                inlineValueProviderJson)
-            : (InlineValueOptions.canParse(
-                    inlineValueProviderJson, nullLspJsonReporter)
-                ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t2(
-                    InlineValueOptions.fromJson(
-                        inlineValueProviderJson as Map<String, Object?>))
-                : (InlineValueRegistrationOptions.canParse(
-                        inlineValueProviderJson, nullLspJsonReporter)
-                    ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t3(
-                        InlineValueRegistrationOptions.fromJson(
-                            inlineValueProviderJson as Map<String, Object?>))
-                    : (throw '''$inlineValueProviderJson was not one of (bool, InlineValueOptions, InlineValueRegistrationOptions)'''))));
+        : (implementationProviderJson is bool
+            ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t1(
+                implementationProviderJson)
+            : (ImplementationOptions.canParse(
+                    implementationProviderJson, nullLspJsonReporter)
+                ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t2(
+                    ImplementationOptions.fromJson(
+                        implementationProviderJson as Map<String, Object?>))
+                : (ImplementationRegistrationOptions.canParse(
+                        implementationProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t3(
+                        ImplementationRegistrationOptions.fromJson(
+                            implementationProviderJson as Map<String, Object?>))
+                    : (throw '''$implementationProviderJson was not one of (bool, ImplementationOptions, ImplementationRegistrationOptions)'''))));
     final inlayHintProviderJson = json['inlayHintProvider'];
     final inlayHintProvider = inlayHintProviderJson == null
         ? null
@@ -34892,20 +34075,182 @@
                         InlayHintRegistrationOptions.fromJson(
                             inlayHintProviderJson as Map<String, Object?>))
                     : (throw '''$inlayHintProviderJson was not one of (bool, InlayHintOptions, InlayHintRegistrationOptions)'''))));
-    final diagnosticProviderJson = json['diagnosticProvider'];
-    final diagnosticProvider = diagnosticProviderJson == null
+    final inlineValueProviderJson = json['inlineValueProvider'];
+    final inlineValueProvider = inlineValueProviderJson == null
         ? null
-        : (DiagnosticOptions.canParse(
-                diagnosticProviderJson, nullLspJsonReporter)
-            ? Either2<DiagnosticOptions, DiagnosticRegistrationOptions>.t1(
-                DiagnosticOptions.fromJson(
-                    diagnosticProviderJson as Map<String, Object?>))
-            : (DiagnosticRegistrationOptions.canParse(
-                    diagnosticProviderJson, nullLspJsonReporter)
-                ? Either2<DiagnosticOptions, DiagnosticRegistrationOptions>.t2(
-                    DiagnosticRegistrationOptions.fromJson(
-                        diagnosticProviderJson as Map<String, Object?>))
-                : (throw '''$diagnosticProviderJson was not one of (DiagnosticOptions, DiagnosticRegistrationOptions)''')));
+        : (inlineValueProviderJson is bool
+            ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t1(
+                inlineValueProviderJson)
+            : (InlineValueOptions.canParse(
+                    inlineValueProviderJson, nullLspJsonReporter)
+                ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t2(
+                    InlineValueOptions.fromJson(
+                        inlineValueProviderJson as Map<String, Object?>))
+                : (InlineValueRegistrationOptions.canParse(
+                        inlineValueProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>.t3(
+                        InlineValueRegistrationOptions.fromJson(
+                            inlineValueProviderJson as Map<String, Object?>))
+                    : (throw '''$inlineValueProviderJson was not one of (bool, InlineValueOptions, InlineValueRegistrationOptions)'''))));
+    final linkedEditingRangeProviderJson = json['linkedEditingRangeProvider'];
+    final linkedEditingRangeProvider = linkedEditingRangeProviderJson == null
+        ? null
+        : (linkedEditingRangeProviderJson is bool
+            ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t1(
+                linkedEditingRangeProviderJson)
+            : (LinkedEditingRangeOptions.canParse(
+                    linkedEditingRangeProviderJson, nullLspJsonReporter)
+                ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t2(
+                    LinkedEditingRangeOptions.fromJson(
+                        linkedEditingRangeProviderJson as Map<String, Object?>))
+                : (LinkedEditingRangeRegistrationOptions.canParse(
+                        linkedEditingRangeProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions>.t3(
+                        LinkedEditingRangeRegistrationOptions.fromJson(
+                            linkedEditingRangeProviderJson as Map<String, Object?>))
+                    : (throw '''$linkedEditingRangeProviderJson was not one of (bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions)'''))));
+    final monikerProviderJson = json['monikerProvider'];
+    final monikerProvider = monikerProviderJson == null
+        ? null
+        : (monikerProviderJson is bool
+            ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t1(
+                monikerProviderJson)
+            : (MonikerOptions.canParse(monikerProviderJson, nullLspJsonReporter)
+                ? Either3<bool, MonikerOptions, MonikerRegistrationOptions>.t2(
+                    MonikerOptions.fromJson(
+                        monikerProviderJson as Map<String, Object?>))
+                : (MonikerRegistrationOptions.canParse(
+                        monikerProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, MonikerOptions,
+                            MonikerRegistrationOptions>.t3(
+                        MonikerRegistrationOptions.fromJson(
+                            monikerProviderJson as Map<String, Object?>))
+                    : (throw '''$monikerProviderJson was not one of (bool, MonikerOptions, MonikerRegistrationOptions)'''))));
+    final notebookDocumentSyncJson = json['notebookDocumentSync'];
+    final notebookDocumentSync = notebookDocumentSyncJson == null
+        ? null
+        : (NotebookDocumentSyncOptions.canParse(notebookDocumentSyncJson, nullLspJsonReporter)
+            ? Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>.t1(
+                NotebookDocumentSyncOptions.fromJson(
+                    notebookDocumentSyncJson as Map<String, Object?>))
+            : (NotebookDocumentSyncRegistrationOptions.canParse(
+                    notebookDocumentSyncJson, nullLspJsonReporter)
+                ? Either2<NotebookDocumentSyncOptions,
+                        NotebookDocumentSyncRegistrationOptions>.t2(
+                    NotebookDocumentSyncRegistrationOptions.fromJson(
+                        notebookDocumentSyncJson as Map<String, Object?>))
+                : (throw '''$notebookDocumentSyncJson was not one of (NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions)''')));
+    final positionEncodingJson = json['positionEncoding'];
+    final positionEncoding = positionEncodingJson != null
+        ? PositionEncodingKind.fromJson(positionEncodingJson as String)
+        : null;
+    final referencesProviderJson = json['referencesProvider'];
+    final referencesProvider = referencesProviderJson == null
+        ? null
+        : (referencesProviderJson is bool
+            ? Either2<bool, ReferenceOptions>.t1(referencesProviderJson)
+            : (ReferenceOptions.canParse(
+                    referencesProviderJson, nullLspJsonReporter)
+                ? Either2<bool, ReferenceOptions>.t2(ReferenceOptions.fromJson(
+                    referencesProviderJson as Map<String, Object?>))
+                : (throw '''$referencesProviderJson was not one of (bool, ReferenceOptions)''')));
+    final renameProviderJson = json['renameProvider'];
+    final renameProvider = renameProviderJson == null
+        ? null
+        : (renameProviderJson is bool
+            ? Either2<bool, RenameOptions>.t1(renameProviderJson)
+            : (RenameOptions.canParse(renameProviderJson, nullLspJsonReporter)
+                ? Either2<bool, RenameOptions>.t2(RenameOptions.fromJson(
+                    renameProviderJson as Map<String, Object?>))
+                : (throw '''$renameProviderJson was not one of (bool, RenameOptions)''')));
+    final selectionRangeProviderJson = json['selectionRangeProvider'];
+    final selectionRangeProvider = selectionRangeProviderJson == null
+        ? null
+        : (selectionRangeProviderJson is bool
+            ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t1(
+                selectionRangeProviderJson)
+            : (SelectionRangeOptions.canParse(
+                    selectionRangeProviderJson, nullLspJsonReporter)
+                ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t2(
+                    SelectionRangeOptions.fromJson(
+                        selectionRangeProviderJson as Map<String, Object?>))
+                : (SelectionRangeRegistrationOptions.canParse(
+                        selectionRangeProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>.t3(
+                        SelectionRangeRegistrationOptions.fromJson(
+                            selectionRangeProviderJson as Map<String, Object?>))
+                    : (throw '''$selectionRangeProviderJson was not one of (bool, SelectionRangeOptions, SelectionRangeRegistrationOptions)'''))));
+    final semanticTokensProviderJson = json['semanticTokensProvider'];
+    final semanticTokensProvider = semanticTokensProviderJson == null
+        ? null
+        : (SemanticTokensOptions.canParse(
+                semanticTokensProviderJson, nullLspJsonReporter)
+            ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t1(
+                SemanticTokensOptions.fromJson(
+                    semanticTokensProviderJson as Map<String, Object?>))
+            : (SemanticTokensRegistrationOptions.canParse(
+                    semanticTokensProviderJson, nullLspJsonReporter)
+                ? Either2<SemanticTokensOptions, SemanticTokensRegistrationOptions>.t2(
+                    SemanticTokensRegistrationOptions.fromJson(
+                        semanticTokensProviderJson as Map<String, Object?>))
+                : (throw '''$semanticTokensProviderJson was not one of (SemanticTokensOptions, SemanticTokensRegistrationOptions)''')));
+    final signatureHelpProviderJson = json['signatureHelpProvider'];
+    final signatureHelpProvider = signatureHelpProviderJson != null
+        ? SignatureHelpOptions.fromJson(
+            signatureHelpProviderJson as Map<String, Object?>)
+        : null;
+    final textDocumentSyncJson = json['textDocumentSync'];
+    final textDocumentSync = textDocumentSyncJson == null
+        ? null
+        : (TextDocumentSyncKind.canParse(
+                textDocumentSyncJson, nullLspJsonReporter)
+            ? Either2<TextDocumentSyncKind, TextDocumentSyncOptions>.t1(
+                TextDocumentSyncKind.fromJson(textDocumentSyncJson as int))
+            : (TextDocumentSyncOptions.canParse(
+                    textDocumentSyncJson, nullLspJsonReporter)
+                ? Either2<TextDocumentSyncKind, TextDocumentSyncOptions>.t2(
+                    TextDocumentSyncOptions.fromJson(
+                        textDocumentSyncJson as Map<String, Object?>))
+                : (throw '''$textDocumentSyncJson was not one of (TextDocumentSyncKind, TextDocumentSyncOptions)''')));
+    final typeDefinitionProviderJson = json['typeDefinitionProvider'];
+    final typeDefinitionProvider = typeDefinitionProviderJson == null
+        ? null
+        : (typeDefinitionProviderJson is bool
+            ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t1(
+                typeDefinitionProviderJson)
+            : (TypeDefinitionOptions.canParse(
+                    typeDefinitionProviderJson, nullLspJsonReporter)
+                ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t2(
+                    TypeDefinitionOptions.fromJson(
+                        typeDefinitionProviderJson as Map<String, Object?>))
+                : (TypeDefinitionRegistrationOptions.canParse(
+                        typeDefinitionProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t3(
+                        TypeDefinitionRegistrationOptions.fromJson(
+                            typeDefinitionProviderJson as Map<String, Object?>))
+                    : (throw '''$typeDefinitionProviderJson was not one of (bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions)'''))));
+    final typeHierarchyProviderJson = json['typeHierarchyProvider'];
+    final typeHierarchyProvider = typeHierarchyProviderJson == null
+        ? null
+        : (typeHierarchyProviderJson is bool
+            ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t1(
+                typeHierarchyProviderJson)
+            : (TypeHierarchyOptions.canParse(
+                    typeHierarchyProviderJson, nullLspJsonReporter)
+                ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t2(
+                    TypeHierarchyOptions.fromJson(
+                        typeHierarchyProviderJson as Map<String, Object?>))
+                : (TypeHierarchyRegistrationOptions.canParse(
+                        typeHierarchyProviderJson, nullLspJsonReporter)
+                    ? Either3<bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions>.t3(
+                        TypeHierarchyRegistrationOptions.fromJson(
+                            typeHierarchyProviderJson as Map<String, Object?>))
+                    : (throw '''$typeHierarchyProviderJson was not one of (bool, TypeHierarchyOptions, TypeHierarchyRegistrationOptions)'''))));
+    final workspaceJson = json['workspace'];
+    final workspace = workspaceJson != null
+        ? ServerCapabilitiesWorkspace.fromJson(
+            workspaceJson as Map<String, Object?>)
+        : null;
     final workspaceSymbolProviderJson = json['workspaceSymbolProvider'];
     final workspaceSymbolProvider = workspaceSymbolProviderJson == null
         ? null
@@ -34918,49 +34263,42 @@
                     WorkspaceSymbolOptions.fromJson(
                         workspaceSymbolProviderJson as Map<String, Object?>))
                 : (throw '''$workspaceSymbolProviderJson was not one of (bool, WorkspaceSymbolOptions)''')));
-    final workspaceJson = json['workspace'];
-    final workspace = workspaceJson != null
-        ? ServerCapabilitiesWorkspace.fromJson(
-            workspaceJson as Map<String, Object?>)
-        : null;
-    final experimentalJson = json['experimental'];
-    final experimental = experimentalJson;
     return ServerCapabilities(
-      positionEncoding: positionEncoding,
-      textDocumentSync: textDocumentSync,
-      notebookDocumentSync: notebookDocumentSync,
-      completionProvider: completionProvider,
-      hoverProvider: hoverProvider,
-      signatureHelpProvider: signatureHelpProvider,
-      declarationProvider: declarationProvider,
-      definitionProvider: definitionProvider,
-      typeDefinitionProvider: typeDefinitionProvider,
-      implementationProvider: implementationProvider,
-      referencesProvider: referencesProvider,
-      documentHighlightProvider: documentHighlightProvider,
-      documentSymbolProvider: documentSymbolProvider,
+      callHierarchyProvider: callHierarchyProvider,
       codeActionProvider: codeActionProvider,
       codeLensProvider: codeLensProvider,
-      documentLinkProvider: documentLinkProvider,
       colorProvider: colorProvider,
-      documentFormattingProvider: documentFormattingProvider,
-      documentRangeFormattingProvider: documentRangeFormattingProvider,
-      documentOnTypeFormattingProvider: documentOnTypeFormattingProvider,
-      renameProvider: renameProvider,
-      foldingRangeProvider: foldingRangeProvider,
-      executeCommandProvider: executeCommandProvider,
-      selectionRangeProvider: selectionRangeProvider,
-      linkedEditingRangeProvider: linkedEditingRangeProvider,
-      callHierarchyProvider: callHierarchyProvider,
-      semanticTokensProvider: semanticTokensProvider,
-      monikerProvider: monikerProvider,
-      typeHierarchyProvider: typeHierarchyProvider,
-      inlineValueProvider: inlineValueProvider,
-      inlayHintProvider: inlayHintProvider,
+      completionProvider: completionProvider,
+      declarationProvider: declarationProvider,
+      definitionProvider: definitionProvider,
       diagnosticProvider: diagnosticProvider,
-      workspaceSymbolProvider: workspaceSymbolProvider,
-      workspace: workspace,
+      documentFormattingProvider: documentFormattingProvider,
+      documentHighlightProvider: documentHighlightProvider,
+      documentLinkProvider: documentLinkProvider,
+      documentOnTypeFormattingProvider: documentOnTypeFormattingProvider,
+      documentRangeFormattingProvider: documentRangeFormattingProvider,
+      documentSymbolProvider: documentSymbolProvider,
+      executeCommandProvider: executeCommandProvider,
       experimental: experimental,
+      foldingRangeProvider: foldingRangeProvider,
+      hoverProvider: hoverProvider,
+      implementationProvider: implementationProvider,
+      inlayHintProvider: inlayHintProvider,
+      inlineValueProvider: inlineValueProvider,
+      linkedEditingRangeProvider: linkedEditingRangeProvider,
+      monikerProvider: monikerProvider,
+      notebookDocumentSync: notebookDocumentSync,
+      positionEncoding: positionEncoding,
+      referencesProvider: referencesProvider,
+      renameProvider: renameProvider,
+      selectionRangeProvider: selectionRangeProvider,
+      semanticTokensProvider: semanticTokensProvider,
+      signatureHelpProvider: signatureHelpProvider,
+      textDocumentSync: textDocumentSync,
+      typeDefinitionProvider: typeDefinitionProvider,
+      typeHierarchyProvider: typeHierarchyProvider,
+      workspace: workspace,
+      workspaceSymbolProvider: workspaceSymbolProvider,
     );
   }
 
@@ -35096,7 +34434,7 @@
   /// defining each notification or for backwards compatibility the
   /// TextDocumentSyncKind number. If omitted it defaults to
   /// `TextDocumentSyncKind.None`.
-  final Either2<TextDocumentSyncOptions, TextDocumentSyncKind>?
+  final Either2<TextDocumentSyncKind, TextDocumentSyncOptions>?
       textDocumentSync;
 
   /// The server provides goto type definition support.
@@ -35117,44 +34455,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (positionEncoding != null) {
-      __result['positionEncoding'] = positionEncoding?.toJson();
-    }
-    if (textDocumentSync != null) {
-      __result['textDocumentSync'] = textDocumentSync;
-    }
-    if (notebookDocumentSync != null) {
-      __result['notebookDocumentSync'] = notebookDocumentSync;
-    }
-    if (completionProvider != null) {
-      __result['completionProvider'] = completionProvider?.toJson();
-    }
-    if (hoverProvider != null) {
-      __result['hoverProvider'] = hoverProvider;
-    }
-    if (signatureHelpProvider != null) {
-      __result['signatureHelpProvider'] = signatureHelpProvider?.toJson();
-    }
-    if (declarationProvider != null) {
-      __result['declarationProvider'] = declarationProvider;
-    }
-    if (definitionProvider != null) {
-      __result['definitionProvider'] = definitionProvider;
-    }
-    if (typeDefinitionProvider != null) {
-      __result['typeDefinitionProvider'] = typeDefinitionProvider;
-    }
-    if (implementationProvider != null) {
-      __result['implementationProvider'] = implementationProvider;
-    }
-    if (referencesProvider != null) {
-      __result['referencesProvider'] = referencesProvider;
-    }
-    if (documentHighlightProvider != null) {
-      __result['documentHighlightProvider'] = documentHighlightProvider;
-    }
-    if (documentSymbolProvider != null) {
-      __result['documentSymbolProvider'] = documentSymbolProvider;
+    if (callHierarchyProvider != null) {
+      __result['callHierarchyProvider'] = callHierarchyProvider;
     }
     if (codeActionProvider != null) {
       __result['codeActionProvider'] = codeActionProvider;
@@ -35162,107 +34464,159 @@
     if (codeLensProvider != null) {
       __result['codeLensProvider'] = codeLensProvider?.toJson();
     }
-    if (documentLinkProvider != null) {
-      __result['documentLinkProvider'] = documentLinkProvider?.toJson();
-    }
     if (colorProvider != null) {
       __result['colorProvider'] = colorProvider;
     }
+    if (completionProvider != null) {
+      __result['completionProvider'] = completionProvider?.toJson();
+    }
+    if (declarationProvider != null) {
+      __result['declarationProvider'] = declarationProvider;
+    }
+    if (definitionProvider != null) {
+      __result['definitionProvider'] = definitionProvider;
+    }
+    if (diagnosticProvider != null) {
+      __result['diagnosticProvider'] = diagnosticProvider;
+    }
     if (documentFormattingProvider != null) {
       __result['documentFormattingProvider'] = documentFormattingProvider;
     }
-    if (documentRangeFormattingProvider != null) {
-      __result['documentRangeFormattingProvider'] =
-          documentRangeFormattingProvider;
+    if (documentHighlightProvider != null) {
+      __result['documentHighlightProvider'] = documentHighlightProvider;
+    }
+    if (documentLinkProvider != null) {
+      __result['documentLinkProvider'] = documentLinkProvider?.toJson();
     }
     if (documentOnTypeFormattingProvider != null) {
       __result['documentOnTypeFormattingProvider'] =
           documentOnTypeFormattingProvider?.toJson();
     }
-    if (renameProvider != null) {
-      __result['renameProvider'] = renameProvider;
+    if (documentRangeFormattingProvider != null) {
+      __result['documentRangeFormattingProvider'] =
+          documentRangeFormattingProvider;
     }
-    if (foldingRangeProvider != null) {
-      __result['foldingRangeProvider'] = foldingRangeProvider;
+    if (documentSymbolProvider != null) {
+      __result['documentSymbolProvider'] = documentSymbolProvider;
     }
     if (executeCommandProvider != null) {
       __result['executeCommandProvider'] = executeCommandProvider?.toJson();
     }
-    if (selectionRangeProvider != null) {
-      __result['selectionRangeProvider'] = selectionRangeProvider;
+    if (experimental != null) {
+      __result['experimental'] = experimental;
     }
-    if (linkedEditingRangeProvider != null) {
-      __result['linkedEditingRangeProvider'] = linkedEditingRangeProvider;
+    if (foldingRangeProvider != null) {
+      __result['foldingRangeProvider'] = foldingRangeProvider;
     }
-    if (callHierarchyProvider != null) {
-      __result['callHierarchyProvider'] = callHierarchyProvider;
+    if (hoverProvider != null) {
+      __result['hoverProvider'] = hoverProvider;
     }
-    if (semanticTokensProvider != null) {
-      __result['semanticTokensProvider'] = semanticTokensProvider;
-    }
-    if (monikerProvider != null) {
-      __result['monikerProvider'] = monikerProvider;
-    }
-    if (typeHierarchyProvider != null) {
-      __result['typeHierarchyProvider'] = typeHierarchyProvider;
-    }
-    if (inlineValueProvider != null) {
-      __result['inlineValueProvider'] = inlineValueProvider;
+    if (implementationProvider != null) {
+      __result['implementationProvider'] = implementationProvider;
     }
     if (inlayHintProvider != null) {
       __result['inlayHintProvider'] = inlayHintProvider;
     }
-    if (diagnosticProvider != null) {
-      __result['diagnosticProvider'] = diagnosticProvider;
+    if (inlineValueProvider != null) {
+      __result['inlineValueProvider'] = inlineValueProvider;
     }
-    if (workspaceSymbolProvider != null) {
-      __result['workspaceSymbolProvider'] = workspaceSymbolProvider;
+    if (linkedEditingRangeProvider != null) {
+      __result['linkedEditingRangeProvider'] = linkedEditingRangeProvider;
+    }
+    if (monikerProvider != null) {
+      __result['monikerProvider'] = monikerProvider;
+    }
+    if (notebookDocumentSync != null) {
+      __result['notebookDocumentSync'] = notebookDocumentSync;
+    }
+    if (positionEncoding != null) {
+      __result['positionEncoding'] = positionEncoding?.toJson();
+    }
+    if (referencesProvider != null) {
+      __result['referencesProvider'] = referencesProvider;
+    }
+    if (renameProvider != null) {
+      __result['renameProvider'] = renameProvider;
+    }
+    if (selectionRangeProvider != null) {
+      __result['selectionRangeProvider'] = selectionRangeProvider;
+    }
+    if (semanticTokensProvider != null) {
+      __result['semanticTokensProvider'] = semanticTokensProvider;
+    }
+    if (signatureHelpProvider != null) {
+      __result['signatureHelpProvider'] = signatureHelpProvider?.toJson();
+    }
+    if (textDocumentSync != null) {
+      __result['textDocumentSync'] = textDocumentSync;
+    }
+    if (typeDefinitionProvider != null) {
+      __result['typeDefinitionProvider'] = typeDefinitionProvider;
+    }
+    if (typeHierarchyProvider != null) {
+      __result['typeHierarchyProvider'] = typeHierarchyProvider;
     }
     if (workspace != null) {
       __result['workspace'] = workspace?.toJson();
     }
-    if (experimental != null) {
-      __result['experimental'] = experimental;
+    if (workspaceSymbolProvider != null) {
+      __result['workspaceSymbolProvider'] = workspaceSymbolProvider;
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('positionEncoding');
+      reporter.push('callHierarchyProvider');
       try {
-        final positionEncoding = obj['positionEncoding'];
-        if (positionEncoding != null &&
-            !(PositionEncodingKind.canParse(positionEncoding, reporter))) {
-          reporter.reportError('must be of type PositionEncodingKind');
+        final callHierarchyProvider = obj['callHierarchyProvider'];
+        if (callHierarchyProvider != null &&
+            !((callHierarchyProvider is bool ||
+                CallHierarchyOptions.canParse(
+                    callHierarchyProvider, reporter) ||
+                CallHierarchyRegistrationOptions.canParse(
+                    callHierarchyProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('textDocumentSync');
+      reporter.push('codeActionProvider');
       try {
-        final textDocumentSync = obj['textDocumentSync'];
-        if (textDocumentSync != null &&
-            !((TextDocumentSyncOptions.canParse(textDocumentSync, reporter) ||
-                TextDocumentSyncKind.canParse(textDocumentSync, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<TextDocumentSyncOptions, TextDocumentSyncKind>');
+        final codeActionProvider = obj['codeActionProvider'];
+        if (codeActionProvider != null &&
+            !((codeActionProvider is bool ||
+                CodeActionOptions.canParse(codeActionProvider, reporter)))) {
+          reporter
+              .reportError('must be of type Either2<bool, CodeActionOptions>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('notebookDocumentSync');
+      reporter.push('codeLensProvider');
       try {
-        final notebookDocumentSync = obj['notebookDocumentSync'];
-        if (notebookDocumentSync != null &&
-            !((NotebookDocumentSyncOptions.canParse(
-                    notebookDocumentSync, reporter) ||
-                NotebookDocumentSyncRegistrationOptions.canParse(
-                    notebookDocumentSync, reporter)))) {
+        final codeLensProvider = obj['codeLensProvider'];
+        if (codeLensProvider != null &&
+            !(CodeLensOptions.canParse(codeLensProvider, reporter))) {
+          reporter.reportError('must be of type CodeLensOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('colorProvider');
+      try {
+        final colorProvider = obj['colorProvider'];
+        if (colorProvider != null &&
+            !((colorProvider is bool ||
+                DocumentColorOptions.canParse(colorProvider, reporter) ||
+                DocumentColorRegistrationOptions.canParse(
+                    colorProvider, reporter)))) {
           reporter.reportError(
-              'must be of type Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>');
+              'must be of type Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>');
           return false;
         }
       } finally {
@@ -35279,29 +34633,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('hoverProvider');
-      try {
-        final hoverProvider = obj['hoverProvider'];
-        if (hoverProvider != null &&
-            !((hoverProvider is bool ||
-                HoverOptions.canParse(hoverProvider, reporter)))) {
-          reporter.reportError('must be of type Either2<bool, HoverOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('signatureHelpProvider');
-      try {
-        final signatureHelpProvider = obj['signatureHelpProvider'];
-        if (signatureHelpProvider != null &&
-            !(SignatureHelpOptions.canParse(signatureHelpProvider, reporter))) {
-          reporter.reportError('must be of type SignatureHelpOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('declarationProvider');
       try {
         final declarationProvider = obj['declarationProvider'];
@@ -35330,17 +34661,136 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('typeDefinitionProvider');
+      reporter.push('diagnosticProvider');
       try {
-        final typeDefinitionProvider = obj['typeDefinitionProvider'];
-        if (typeDefinitionProvider != null &&
-            !((typeDefinitionProvider is bool ||
-                TypeDefinitionOptions.canParse(
-                    typeDefinitionProvider, reporter) ||
-                TypeDefinitionRegistrationOptions.canParse(
-                    typeDefinitionProvider, reporter)))) {
+        final diagnosticProvider = obj['diagnosticProvider'];
+        if (diagnosticProvider != null &&
+            !((DiagnosticOptions.canParse(diagnosticProvider, reporter) ||
+                DiagnosticRegistrationOptions.canParse(
+                    diagnosticProvider, reporter)))) {
           reporter.reportError(
-              'must be of type Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>');
+              'must be of type Either2<DiagnosticOptions, DiagnosticRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentFormattingProvider');
+      try {
+        final documentFormattingProvider = obj['documentFormattingProvider'];
+        if (documentFormattingProvider != null &&
+            !((documentFormattingProvider is bool ||
+                DocumentFormattingOptions.canParse(
+                    documentFormattingProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, DocumentFormattingOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentHighlightProvider');
+      try {
+        final documentHighlightProvider = obj['documentHighlightProvider'];
+        if (documentHighlightProvider != null &&
+            !((documentHighlightProvider is bool ||
+                DocumentHighlightOptions.canParse(
+                    documentHighlightProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, DocumentHighlightOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentLinkProvider');
+      try {
+        final documentLinkProvider = obj['documentLinkProvider'];
+        if (documentLinkProvider != null &&
+            !(DocumentLinkOptions.canParse(documentLinkProvider, reporter))) {
+          reporter.reportError('must be of type DocumentLinkOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentOnTypeFormattingProvider');
+      try {
+        final documentOnTypeFormattingProvider =
+            obj['documentOnTypeFormattingProvider'];
+        if (documentOnTypeFormattingProvider != null &&
+            !(DocumentOnTypeFormattingOptions.canParse(
+                documentOnTypeFormattingProvider, reporter))) {
+          reporter
+              .reportError('must be of type DocumentOnTypeFormattingOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentRangeFormattingProvider');
+      try {
+        final documentRangeFormattingProvider =
+            obj['documentRangeFormattingProvider'];
+        if (documentRangeFormattingProvider != null &&
+            !((documentRangeFormattingProvider is bool ||
+                DocumentRangeFormattingOptions.canParse(
+                    documentRangeFormattingProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, DocumentRangeFormattingOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentSymbolProvider');
+      try {
+        final documentSymbolProvider = obj['documentSymbolProvider'];
+        if (documentSymbolProvider != null &&
+            !((documentSymbolProvider is bool ||
+                DocumentSymbolOptions.canParse(
+                    documentSymbolProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<bool, DocumentSymbolOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('executeCommandProvider');
+      try {
+        final executeCommandProvider = obj['executeCommandProvider'];
+        if (executeCommandProvider != null &&
+            !(ExecuteCommandOptions.canParse(
+                executeCommandProvider, reporter))) {
+          reporter.reportError('must be of type ExecuteCommandOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('foldingRangeProvider');
+      try {
+        final foldingRangeProvider = obj['foldingRangeProvider'];
+        if (foldingRangeProvider != null &&
+            !((foldingRangeProvider is bool ||
+                FoldingRangeOptions.canParse(foldingRangeProvider, reporter) ||
+                FoldingRangeRegistrationOptions.canParse(
+                    foldingRangeProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('hoverProvider');
+      try {
+        final hoverProvider = obj['hoverProvider'];
+        if (hoverProvider != null &&
+            !((hoverProvider is bool ||
+                HoverOptions.canParse(hoverProvider, reporter)))) {
+          reporter.reportError('must be of type Either2<bool, HoverOptions>');
           return false;
         }
       } finally {
@@ -35362,190 +34812,31 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('referencesProvider');
+      reporter.push('inlayHintProvider');
       try {
-        final referencesProvider = obj['referencesProvider'];
-        if (referencesProvider != null &&
-            !((referencesProvider is bool ||
-                ReferenceOptions.canParse(referencesProvider, reporter)))) {
-          reporter
-              .reportError('must be of type Either2<bool, ReferenceOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentHighlightProvider');
-      try {
-        final documentHighlightProvider = obj['documentHighlightProvider'];
-        if (documentHighlightProvider != null &&
-            !((documentHighlightProvider is bool ||
-                DocumentHighlightOptions.canParse(
-                    documentHighlightProvider, reporter)))) {
+        final inlayHintProvider = obj['inlayHintProvider'];
+        if (inlayHintProvider != null &&
+            !((inlayHintProvider is bool ||
+                InlayHintOptions.canParse(inlayHintProvider, reporter) ||
+                InlayHintRegistrationOptions.canParse(
+                    inlayHintProvider, reporter)))) {
           reporter.reportError(
-              'must be of type Either2<bool, DocumentHighlightOptions>');
+              'must be of type Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('documentSymbolProvider');
+      reporter.push('inlineValueProvider');
       try {
-        final documentSymbolProvider = obj['documentSymbolProvider'];
-        if (documentSymbolProvider != null &&
-            !((documentSymbolProvider is bool ||
-                DocumentSymbolOptions.canParse(
-                    documentSymbolProvider, reporter)))) {
+        final inlineValueProvider = obj['inlineValueProvider'];
+        if (inlineValueProvider != null &&
+            !((inlineValueProvider is bool ||
+                InlineValueOptions.canParse(inlineValueProvider, reporter) ||
+                InlineValueRegistrationOptions.canParse(
+                    inlineValueProvider, reporter)))) {
           reporter.reportError(
-              'must be of type Either2<bool, DocumentSymbolOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('codeActionProvider');
-      try {
-        final codeActionProvider = obj['codeActionProvider'];
-        if (codeActionProvider != null &&
-            !((codeActionProvider is bool ||
-                CodeActionOptions.canParse(codeActionProvider, reporter)))) {
-          reporter
-              .reportError('must be of type Either2<bool, CodeActionOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('codeLensProvider');
-      try {
-        final codeLensProvider = obj['codeLensProvider'];
-        if (codeLensProvider != null &&
-            !(CodeLensOptions.canParse(codeLensProvider, reporter))) {
-          reporter.reportError('must be of type CodeLensOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentLinkProvider');
-      try {
-        final documentLinkProvider = obj['documentLinkProvider'];
-        if (documentLinkProvider != null &&
-            !(DocumentLinkOptions.canParse(documentLinkProvider, reporter))) {
-          reporter.reportError('must be of type DocumentLinkOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('colorProvider');
-      try {
-        final colorProvider = obj['colorProvider'];
-        if (colorProvider != null &&
-            !((colorProvider is bool ||
-                DocumentColorOptions.canParse(colorProvider, reporter) ||
-                DocumentColorRegistrationOptions.canParse(
-                    colorProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentFormattingProvider');
-      try {
-        final documentFormattingProvider = obj['documentFormattingProvider'];
-        if (documentFormattingProvider != null &&
-            !((documentFormattingProvider is bool ||
-                DocumentFormattingOptions.canParse(
-                    documentFormattingProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<bool, DocumentFormattingOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentRangeFormattingProvider');
-      try {
-        final documentRangeFormattingProvider =
-            obj['documentRangeFormattingProvider'];
-        if (documentRangeFormattingProvider != null &&
-            !((documentRangeFormattingProvider is bool ||
-                DocumentRangeFormattingOptions.canParse(
-                    documentRangeFormattingProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<bool, DocumentRangeFormattingOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentOnTypeFormattingProvider');
-      try {
-        final documentOnTypeFormattingProvider =
-            obj['documentOnTypeFormattingProvider'];
-        if (documentOnTypeFormattingProvider != null &&
-            !(DocumentOnTypeFormattingOptions.canParse(
-                documentOnTypeFormattingProvider, reporter))) {
-          reporter
-              .reportError('must be of type DocumentOnTypeFormattingOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('renameProvider');
-      try {
-        final renameProvider = obj['renameProvider'];
-        if (renameProvider != null &&
-            !((renameProvider is bool ||
-                RenameOptions.canParse(renameProvider, reporter)))) {
-          reporter.reportError('must be of type Either2<bool, RenameOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('foldingRangeProvider');
-      try {
-        final foldingRangeProvider = obj['foldingRangeProvider'];
-        if (foldingRangeProvider != null &&
-            !((foldingRangeProvider is bool ||
-                FoldingRangeOptions.canParse(foldingRangeProvider, reporter) ||
-                FoldingRangeRegistrationOptions.canParse(
-                    foldingRangeProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either3<bool, FoldingRangeOptions, FoldingRangeRegistrationOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('executeCommandProvider');
-      try {
-        final executeCommandProvider = obj['executeCommandProvider'];
-        if (executeCommandProvider != null &&
-            !(ExecuteCommandOptions.canParse(
-                executeCommandProvider, reporter))) {
-          reporter.reportError('must be of type ExecuteCommandOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('selectionRangeProvider');
-      try {
-        final selectionRangeProvider = obj['selectionRangeProvider'];
-        if (selectionRangeProvider != null &&
-            !((selectionRangeProvider is bool ||
-                SelectionRangeOptions.canParse(
-                    selectionRangeProvider, reporter) ||
-                SelectionRangeRegistrationOptions.canParse(
-                    selectionRangeProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>');
+              'must be of type Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>');
           return false;
         }
       } finally {
@@ -35567,17 +34858,83 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('callHierarchyProvider');
+      reporter.push('monikerProvider');
       try {
-        final callHierarchyProvider = obj['callHierarchyProvider'];
-        if (callHierarchyProvider != null &&
-            !((callHierarchyProvider is bool ||
-                CallHierarchyOptions.canParse(
-                    callHierarchyProvider, reporter) ||
-                CallHierarchyRegistrationOptions.canParse(
-                    callHierarchyProvider, reporter)))) {
+        final monikerProvider = obj['monikerProvider'];
+        if (monikerProvider != null &&
+            !((monikerProvider is bool ||
+                MonikerOptions.canParse(monikerProvider, reporter) ||
+                MonikerRegistrationOptions.canParse(
+                    monikerProvider, reporter)))) {
           reporter.reportError(
-              'must be of type Either3<bool, CallHierarchyOptions, CallHierarchyRegistrationOptions>');
+              'must be of type Either3<bool, MonikerOptions, MonikerRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('notebookDocumentSync');
+      try {
+        final notebookDocumentSync = obj['notebookDocumentSync'];
+        if (notebookDocumentSync != null &&
+            !((NotebookDocumentSyncOptions.canParse(
+                    notebookDocumentSync, reporter) ||
+                NotebookDocumentSyncRegistrationOptions.canParse(
+                    notebookDocumentSync, reporter)))) {
+          reporter.reportError(
+              'must be of type Either2<NotebookDocumentSyncOptions, NotebookDocumentSyncRegistrationOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('positionEncoding');
+      try {
+        final positionEncoding = obj['positionEncoding'];
+        if (positionEncoding != null &&
+            !(PositionEncodingKind.canParse(positionEncoding, reporter))) {
+          reporter.reportError('must be of type PositionEncodingKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('referencesProvider');
+      try {
+        final referencesProvider = obj['referencesProvider'];
+        if (referencesProvider != null &&
+            !((referencesProvider is bool ||
+                ReferenceOptions.canParse(referencesProvider, reporter)))) {
+          reporter
+              .reportError('must be of type Either2<bool, ReferenceOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('renameProvider');
+      try {
+        final renameProvider = obj['renameProvider'];
+        if (renameProvider != null &&
+            !((renameProvider is bool ||
+                RenameOptions.canParse(renameProvider, reporter)))) {
+          reporter.reportError('must be of type Either2<bool, RenameOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('selectionRangeProvider');
+      try {
+        final selectionRangeProvider = obj['selectionRangeProvider'];
+        if (selectionRangeProvider != null &&
+            !((selectionRangeProvider is bool ||
+                SelectionRangeOptions.canParse(
+                    selectionRangeProvider, reporter) ||
+                SelectionRangeRegistrationOptions.canParse(
+                    selectionRangeProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, SelectionRangeOptions, SelectionRangeRegistrationOptions>');
           return false;
         }
       } finally {
@@ -35598,16 +34955,42 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('monikerProvider');
+      reporter.push('signatureHelpProvider');
       try {
-        final monikerProvider = obj['monikerProvider'];
-        if (monikerProvider != null &&
-            !((monikerProvider is bool ||
-                MonikerOptions.canParse(monikerProvider, reporter) ||
-                MonikerRegistrationOptions.canParse(
-                    monikerProvider, reporter)))) {
+        final signatureHelpProvider = obj['signatureHelpProvider'];
+        if (signatureHelpProvider != null &&
+            !(SignatureHelpOptions.canParse(signatureHelpProvider, reporter))) {
+          reporter.reportError('must be of type SignatureHelpOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('textDocumentSync');
+      try {
+        final textDocumentSync = obj['textDocumentSync'];
+        if (textDocumentSync != null &&
+            !((TextDocumentSyncKind.canParse(textDocumentSync, reporter) ||
+                TextDocumentSyncOptions.canParse(
+                    textDocumentSync, reporter)))) {
           reporter.reportError(
-              'must be of type Either3<bool, MonikerOptions, MonikerRegistrationOptions>');
+              'must be of type Either2<TextDocumentSyncKind, TextDocumentSyncOptions>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('typeDefinitionProvider');
+      try {
+        final typeDefinitionProvider = obj['typeDefinitionProvider'];
+        if (typeDefinitionProvider != null &&
+            !((typeDefinitionProvider is bool ||
+                TypeDefinitionOptions.canParse(
+                    typeDefinitionProvider, reporter) ||
+                TypeDefinitionRegistrationOptions.canParse(
+                    typeDefinitionProvider, reporter)))) {
+          reporter.reportError(
+              'must be of type Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>');
           return false;
         }
       } finally {
@@ -35629,45 +35012,12 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('inlineValueProvider');
+      reporter.push('workspace');
       try {
-        final inlineValueProvider = obj['inlineValueProvider'];
-        if (inlineValueProvider != null &&
-            !((inlineValueProvider is bool ||
-                InlineValueOptions.canParse(inlineValueProvider, reporter) ||
-                InlineValueRegistrationOptions.canParse(
-                    inlineValueProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either3<bool, InlineValueOptions, InlineValueRegistrationOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('inlayHintProvider');
-      try {
-        final inlayHintProvider = obj['inlayHintProvider'];
-        if (inlayHintProvider != null &&
-            !((inlayHintProvider is bool ||
-                InlayHintOptions.canParse(inlayHintProvider, reporter) ||
-                InlayHintRegistrationOptions.canParse(
-                    inlayHintProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either3<bool, InlayHintOptions, InlayHintRegistrationOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('diagnosticProvider');
-      try {
-        final diagnosticProvider = obj['diagnosticProvider'];
-        if (diagnosticProvider != null &&
-            !((DiagnosticOptions.canParse(diagnosticProvider, reporter) ||
-                DiagnosticRegistrationOptions.canParse(
-                    diagnosticProvider, reporter)))) {
-          reporter.reportError(
-              'must be of type Either2<DiagnosticOptions, DiagnosticRegistrationOptions>');
+        final workspace = obj['workspace'];
+        if (workspace != null &&
+            !(ServerCapabilitiesWorkspace.canParse(workspace, reporter))) {
+          reporter.reportError('must be of type ServerCapabilitiesWorkspace');
           return false;
         }
       } finally {
@@ -35687,17 +35037,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workspace');
-      try {
-        final workspace = obj['workspace'];
-        if (workspace != null &&
-            !(ServerCapabilitiesWorkspace.canParse(workspace, reporter))) {
-          reporter.reportError('must be of type ServerCapabilitiesWorkspace');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ServerCapabilities');
@@ -35709,43 +35048,43 @@
   bool operator ==(Object other) {
     if (other is ServerCapabilities &&
         other.runtimeType == ServerCapabilities) {
-      return positionEncoding == other.positionEncoding &&
-          textDocumentSync == other.textDocumentSync &&
-          notebookDocumentSync == other.notebookDocumentSync &&
-          completionProvider == other.completionProvider &&
-          hoverProvider == other.hoverProvider &&
-          signatureHelpProvider == other.signatureHelpProvider &&
-          declarationProvider == other.declarationProvider &&
-          definitionProvider == other.definitionProvider &&
-          typeDefinitionProvider == other.typeDefinitionProvider &&
-          implementationProvider == other.implementationProvider &&
-          referencesProvider == other.referencesProvider &&
-          documentHighlightProvider == other.documentHighlightProvider &&
-          documentSymbolProvider == other.documentSymbolProvider &&
+      return callHierarchyProvider == other.callHierarchyProvider &&
           codeActionProvider == other.codeActionProvider &&
           codeLensProvider == other.codeLensProvider &&
-          documentLinkProvider == other.documentLinkProvider &&
           colorProvider == other.colorProvider &&
+          completionProvider == other.completionProvider &&
+          declarationProvider == other.declarationProvider &&
+          definitionProvider == other.definitionProvider &&
+          diagnosticProvider == other.diagnosticProvider &&
           documentFormattingProvider == other.documentFormattingProvider &&
-          documentRangeFormattingProvider ==
-              other.documentRangeFormattingProvider &&
+          documentHighlightProvider == other.documentHighlightProvider &&
+          documentLinkProvider == other.documentLinkProvider &&
           documentOnTypeFormattingProvider ==
               other.documentOnTypeFormattingProvider &&
-          renameProvider == other.renameProvider &&
-          foldingRangeProvider == other.foldingRangeProvider &&
+          documentRangeFormattingProvider ==
+              other.documentRangeFormattingProvider &&
+          documentSymbolProvider == other.documentSymbolProvider &&
           executeCommandProvider == other.executeCommandProvider &&
-          selectionRangeProvider == other.selectionRangeProvider &&
-          linkedEditingRangeProvider == other.linkedEditingRangeProvider &&
-          callHierarchyProvider == other.callHierarchyProvider &&
-          semanticTokensProvider == other.semanticTokensProvider &&
-          monikerProvider == other.monikerProvider &&
-          typeHierarchyProvider == other.typeHierarchyProvider &&
-          inlineValueProvider == other.inlineValueProvider &&
-          inlayHintProvider == other.inlayHintProvider &&
-          diagnosticProvider == other.diagnosticProvider &&
-          workspaceSymbolProvider == other.workspaceSymbolProvider &&
-          workspace == other.workspace &&
           experimental == other.experimental &&
+          foldingRangeProvider == other.foldingRangeProvider &&
+          hoverProvider == other.hoverProvider &&
+          implementationProvider == other.implementationProvider &&
+          inlayHintProvider == other.inlayHintProvider &&
+          inlineValueProvider == other.inlineValueProvider &&
+          linkedEditingRangeProvider == other.linkedEditingRangeProvider &&
+          monikerProvider == other.monikerProvider &&
+          notebookDocumentSync == other.notebookDocumentSync &&
+          positionEncoding == other.positionEncoding &&
+          referencesProvider == other.referencesProvider &&
+          renameProvider == other.renameProvider &&
+          selectionRangeProvider == other.selectionRangeProvider &&
+          semanticTokensProvider == other.semanticTokensProvider &&
+          signatureHelpProvider == other.signatureHelpProvider &&
+          textDocumentSync == other.textDocumentSync &&
+          typeDefinitionProvider == other.typeDefinitionProvider &&
+          typeHierarchyProvider == other.typeHierarchyProvider &&
+          workspace == other.workspace &&
+          workspaceSymbolProvider == other.workspaceSymbolProvider &&
           true;
     }
     return false;
@@ -35753,41 +35092,41 @@
 
   @override
   int get hashCode => Object.hashAll([
-        positionEncoding,
-        textDocumentSync,
-        notebookDocumentSync,
-        completionProvider,
-        hoverProvider,
-        signatureHelpProvider,
-        declarationProvider,
-        definitionProvider,
-        typeDefinitionProvider,
-        implementationProvider,
-        referencesProvider,
-        documentHighlightProvider,
-        documentSymbolProvider,
+        callHierarchyProvider,
         codeActionProvider,
         codeLensProvider,
-        documentLinkProvider,
         colorProvider,
-        documentFormattingProvider,
-        documentRangeFormattingProvider,
-        documentOnTypeFormattingProvider,
-        renameProvider,
-        foldingRangeProvider,
-        executeCommandProvider,
-        selectionRangeProvider,
-        linkedEditingRangeProvider,
-        callHierarchyProvider,
-        semanticTokensProvider,
-        monikerProvider,
-        typeHierarchyProvider,
-        inlineValueProvider,
-        inlayHintProvider,
+        completionProvider,
+        declarationProvider,
+        definitionProvider,
         diagnosticProvider,
-        workspaceSymbolProvider,
-        workspace,
+        documentFormattingProvider,
+        documentHighlightProvider,
+        documentLinkProvider,
+        documentOnTypeFormattingProvider,
+        documentRangeFormattingProvider,
+        documentSymbolProvider,
+        executeCommandProvider,
         experimental,
+        foldingRangeProvider,
+        hoverProvider,
+        implementationProvider,
+        inlayHintProvider,
+        inlineValueProvider,
+        linkedEditingRangeProvider,
+        monikerProvider,
+        notebookDocumentSync,
+        positionEncoding,
+        referencesProvider,
+        renameProvider,
+        selectionRangeProvider,
+        semanticTokensProvider,
+        signatureHelpProvider,
+        textDocumentSync,
+        typeDefinitionProvider,
+        typeHierarchyProvider,
+        workspace,
+        workspaceSymbolProvider,
       ]);
 
   @override
@@ -35802,11 +35141,11 @@
 
   ServerCapabilitiesFileOperations({
     this.didCreate,
-    this.willCreate,
-    this.didRename,
-    this.willRename,
     this.didDelete,
+    this.didRename,
+    this.willCreate,
     this.willDelete,
+    this.willRename,
   });
   static ServerCapabilitiesFileOperations fromJson(Map<String, Object?> json) {
     final didCreateJson = json['didCreate'];
@@ -35814,38 +35153,38 @@
         ? FileOperationRegistrationOptions.fromJson(
             didCreateJson as Map<String, Object?>)
         : null;
-    final willCreateJson = json['willCreate'];
-    final willCreate = willCreateJson != null
+    final didDeleteJson = json['didDelete'];
+    final didDelete = didDeleteJson != null
         ? FileOperationRegistrationOptions.fromJson(
-            willCreateJson as Map<String, Object?>)
+            didDeleteJson as Map<String, Object?>)
         : null;
     final didRenameJson = json['didRename'];
     final didRename = didRenameJson != null
         ? FileOperationRegistrationOptions.fromJson(
             didRenameJson as Map<String, Object?>)
         : null;
-    final willRenameJson = json['willRename'];
-    final willRename = willRenameJson != null
+    final willCreateJson = json['willCreate'];
+    final willCreate = willCreateJson != null
         ? FileOperationRegistrationOptions.fromJson(
-            willRenameJson as Map<String, Object?>)
-        : null;
-    final didDeleteJson = json['didDelete'];
-    final didDelete = didDeleteJson != null
-        ? FileOperationRegistrationOptions.fromJson(
-            didDeleteJson as Map<String, Object?>)
+            willCreateJson as Map<String, Object?>)
         : null;
     final willDeleteJson = json['willDelete'];
     final willDelete = willDeleteJson != null
         ? FileOperationRegistrationOptions.fromJson(
             willDeleteJson as Map<String, Object?>)
         : null;
+    final willRenameJson = json['willRename'];
+    final willRename = willRenameJson != null
+        ? FileOperationRegistrationOptions.fromJson(
+            willRenameJson as Map<String, Object?>)
+        : null;
     return ServerCapabilitiesFileOperations(
       didCreate: didCreate,
-      willCreate: willCreate,
-      didRename: didRename,
-      willRename: willRename,
       didDelete: didDelete,
+      didRename: didRename,
+      willCreate: willCreate,
       willDelete: willDelete,
+      willRename: willRename,
     );
   }
 
@@ -35872,21 +35211,21 @@
     if (didCreate != null) {
       __result['didCreate'] = didCreate?.toJson();
     }
-    if (willCreate != null) {
-      __result['willCreate'] = willCreate?.toJson();
+    if (didDelete != null) {
+      __result['didDelete'] = didDelete?.toJson();
     }
     if (didRename != null) {
       __result['didRename'] = didRename?.toJson();
     }
-    if (willRename != null) {
-      __result['willRename'] = willRename?.toJson();
-    }
-    if (didDelete != null) {
-      __result['didDelete'] = didDelete?.toJson();
+    if (willCreate != null) {
+      __result['willCreate'] = willCreate?.toJson();
     }
     if (willDelete != null) {
       __result['willDelete'] = willDelete?.toJson();
     }
+    if (willRename != null) {
+      __result['willRename'] = willRename?.toJson();
+    }
     return __result;
   }
 
@@ -35904,6 +35243,30 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('didDelete');
+      try {
+        final didDelete = obj['didDelete'];
+        if (didDelete != null &&
+            !(FileOperationRegistrationOptions.canParse(didDelete, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didRename');
+      try {
+        final didRename = obj['didRename'];
+        if (didRename != null &&
+            !(FileOperationRegistrationOptions.canParse(didRename, reporter))) {
+          reporter
+              .reportError('must be of type FileOperationRegistrationOptions');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('willCreate');
       try {
         final willCreate = obj['willCreate'];
@@ -35917,11 +35280,12 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('didRename');
+      reporter.push('willDelete');
       try {
-        final didRename = obj['didRename'];
-        if (didRename != null &&
-            !(FileOperationRegistrationOptions.canParse(didRename, reporter))) {
+        final willDelete = obj['willDelete'];
+        if (willDelete != null &&
+            !(FileOperationRegistrationOptions.canParse(
+                willDelete, reporter))) {
           reporter
               .reportError('must be of type FileOperationRegistrationOptions');
           return false;
@@ -35942,31 +35306,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('didDelete');
-      try {
-        final didDelete = obj['didDelete'];
-        if (didDelete != null &&
-            !(FileOperationRegistrationOptions.canParse(didDelete, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('willDelete');
-      try {
-        final willDelete = obj['willDelete'];
-        if (willDelete != null &&
-            !(FileOperationRegistrationOptions.canParse(
-                willDelete, reporter))) {
-          reporter
-              .reportError('must be of type FileOperationRegistrationOptions');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ServerCapabilitiesFileOperations');
@@ -35979,11 +35318,11 @@
     if (other is ServerCapabilitiesFileOperations &&
         other.runtimeType == ServerCapabilitiesFileOperations) {
       return didCreate == other.didCreate &&
-          willCreate == other.willCreate &&
-          didRename == other.didRename &&
-          willRename == other.willRename &&
           didDelete == other.didDelete &&
+          didRename == other.didRename &&
+          willCreate == other.willCreate &&
           willDelete == other.willDelete &&
+          willRename == other.willRename &&
           true;
     }
     return false;
@@ -35992,11 +35331,11 @@
   @override
   int get hashCode => Object.hash(
         didCreate,
-        willCreate,
-        didRename,
-        willRename,
         didDelete,
+        didRename,
+        willCreate,
         willDelete,
+        willRename,
       );
 
   @override
@@ -36010,23 +35349,23 @@
   );
 
   ServerCapabilitiesWorkspace({
-    this.workspaceFolders,
     this.fileOperations,
+    this.workspaceFolders,
   });
   static ServerCapabilitiesWorkspace fromJson(Map<String, Object?> json) {
-    final workspaceFoldersJson = json['workspaceFolders'];
-    final workspaceFolders = workspaceFoldersJson != null
-        ? WorkspaceFoldersServerCapabilities.fromJson(
-            workspaceFoldersJson as Map<String, Object?>)
-        : null;
     final fileOperationsJson = json['fileOperations'];
     final fileOperations = fileOperationsJson != null
         ? ServerCapabilitiesFileOperations.fromJson(
             fileOperationsJson as Map<String, Object?>)
         : null;
+    final workspaceFoldersJson = json['workspaceFolders'];
+    final workspaceFolders = workspaceFoldersJson != null
+        ? WorkspaceFoldersServerCapabilities.fromJson(
+            workspaceFoldersJson as Map<String, Object?>)
+        : null;
     return ServerCapabilitiesWorkspace(
-      workspaceFolders: workspaceFolders,
       fileOperations: fileOperations,
+      workspaceFolders: workspaceFolders,
     );
   }
 
@@ -36040,30 +35379,17 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (workspaceFolders != null) {
-      __result['workspaceFolders'] = workspaceFolders?.toJson();
-    }
     if (fileOperations != null) {
       __result['fileOperations'] = fileOperations?.toJson();
     }
+    if (workspaceFolders != null) {
+      __result['workspaceFolders'] = workspaceFolders?.toJson();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('workspaceFolders');
-      try {
-        final workspaceFolders = obj['workspaceFolders'];
-        if (workspaceFolders != null &&
-            !(WorkspaceFoldersServerCapabilities.canParse(
-                workspaceFolders, reporter))) {
-          reporter.reportError(
-              'must be of type WorkspaceFoldersServerCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('fileOperations');
       try {
         final fileOperations = obj['fileOperations'];
@@ -36077,6 +35403,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workspaceFolders');
+      try {
+        final workspaceFolders = obj['workspaceFolders'];
+        if (workspaceFolders != null &&
+            !(WorkspaceFoldersServerCapabilities.canParse(
+                workspaceFolders, reporter))) {
+          reporter.reportError(
+              'must be of type WorkspaceFoldersServerCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ServerCapabilitiesWorkspace');
@@ -36088,8 +35427,8 @@
   bool operator ==(Object other) {
     if (other is ServerCapabilitiesWorkspace &&
         other.runtimeType == ServerCapabilitiesWorkspace) {
-      return workspaceFolders == other.workspaceFolders &&
-          fileOperations == other.fileOperations &&
+      return fileOperations == other.fileOperations &&
+          workspaceFolders == other.workspaceFolders &&
           true;
     }
     return false;
@@ -36097,8 +35436,8 @@
 
   @override
   int get hashCode => Object.hash(
-        workspaceFolders,
         fileOperations,
+        workspaceFolders,
       );
 
   @override
@@ -36256,27 +35595,27 @@
   );
 
   ShowDocumentParams({
-    required this.uri,
     this.external,
-    this.takeFocus,
     this.selection,
+    this.takeFocus,
+    required this.uri,
   });
   static ShowDocumentParams fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final externalJson = json['external'];
     final external = externalJson as bool?;
-    final takeFocusJson = json['takeFocus'];
-    final takeFocus = takeFocusJson as bool?;
     final selectionJson = json['selection'];
     final selection = selectionJson != null
         ? Range.fromJson(selectionJson as Map<String, Object?>)
         : null;
+    final takeFocusJson = json['takeFocus'];
+    final takeFocus = takeFocusJson as bool?;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return ShowDocumentParams(
-      uri: uri,
       external: external,
-      takeFocus: takeFocus,
       selection: selection,
+      takeFocus: takeFocus,
+      uri: uri,
     );
   }
 
@@ -36300,21 +35639,51 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
     if (external != null) {
       __result['external'] = external;
     }
-    if (takeFocus != null) {
-      __result['takeFocus'] = takeFocus;
-    }
     if (selection != null) {
       __result['selection'] = selection?.toJson();
     }
+    if (takeFocus != null) {
+      __result['takeFocus'] = takeFocus;
+    }
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('external');
+      try {
+        final external = obj['external'];
+        if (external != null && !(external is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('selection');
+      try {
+        final selection = obj['selection'];
+        if (selection != null && !(Range.canParse(selection, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('takeFocus');
+      try {
+        final takeFocus = obj['takeFocus'];
+        if (takeFocus != null && !(takeFocus is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -36333,36 +35702,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('external');
-      try {
-        final external = obj['external'];
-        if (external != null && !(external is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('takeFocus');
-      try {
-        final takeFocus = obj['takeFocus'];
-        if (takeFocus != null && !(takeFocus is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('selection');
-      try {
-        final selection = obj['selection'];
-        if (selection != null && !(Range.canParse(selection, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type ShowDocumentParams');
@@ -36374,10 +35713,10 @@
   bool operator ==(Object other) {
     if (other is ShowDocumentParams &&
         other.runtimeType == ShowDocumentParams) {
-      return uri == other.uri &&
-          external == other.external &&
-          takeFocus == other.takeFocus &&
+      return external == other.external &&
           selection == other.selection &&
+          takeFocus == other.takeFocus &&
+          uri == other.uri &&
           true;
     }
     return false;
@@ -36385,10 +35724,10 @@
 
   @override
   int get hashCode => Object.hash(
-        uri,
         external,
-        takeFocus,
         selection,
+        takeFocus,
+        uri,
       );
 
   @override
@@ -36473,17 +35812,17 @@
   );
 
   ShowMessageParams({
-    required this.type,
     required this.message,
+    required this.type,
   });
   static ShowMessageParams fromJson(Map<String, Object?> json) {
-    final typeJson = json['type'];
-    final type = MessageType.fromJson(typeJson as int);
     final messageJson = json['message'];
     final message = messageJson as String;
+    final typeJson = json['type'];
+    final type = MessageType.fromJson(typeJson as int);
     return ShowMessageParams(
-      type: type,
       message: message,
+      type: type,
     );
   }
 
@@ -36495,31 +35834,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['type'] = type.toJson();
     __result['message'] = message;
+    __result['type'] = type.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('type');
-      try {
-        if (!obj.containsKey('type')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final type = obj['type'];
-        if (type == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(MessageType.canParse(type, reporter))) {
-          reporter.reportError('must be of type MessageType');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('message');
       try {
         if (!obj.containsKey('message')) {
@@ -36538,6 +35859,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('type');
+      try {
+        if (!obj.containsKey('type')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final type = obj['type'];
+        if (type == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(MessageType.canParse(type, reporter))) {
+          reporter.reportError('must be of type MessageType');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ShowMessageParams');
@@ -36548,15 +35887,15 @@
   @override
   bool operator ==(Object other) {
     if (other is ShowMessageParams && other.runtimeType == ShowMessageParams) {
-      return type == other.type && message == other.message && true;
+      return message == other.message && type == other.type && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        type,
         message,
+        type,
       );
 
   @override
@@ -36714,24 +36053,24 @@
   );
 
   ShowMessageRequestParams({
-    required this.type,
-    required this.message,
     this.actions,
+    required this.message,
+    required this.type,
   });
   static ShowMessageRequestParams fromJson(Map<String, Object?> json) {
-    final typeJson = json['type'];
-    final type = MessageType.fromJson(typeJson as int);
-    final messageJson = json['message'];
-    final message = messageJson as String;
     final actionsJson = json['actions'];
     final actions = (actionsJson as List<Object?>?)
         ?.map(
             (item) => MessageActionItem.fromJson(item as Map<String, Object?>))
         .toList();
+    final messageJson = json['message'];
+    final message = messageJson as String;
+    final typeJson = json['type'];
+    final type = MessageType.fromJson(typeJson as int);
     return ShowMessageRequestParams(
-      type: type,
-      message: message,
       actions: actions,
+      message: message,
+      type: type,
     );
   }
 
@@ -36746,29 +36085,24 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['type'] = type.toJson();
-    __result['message'] = message;
     if (actions != null) {
       __result['actions'] = actions?.map((item) => item.toJson()).toList();
     }
+    __result['message'] = message;
+    __result['type'] = type.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('type');
+      reporter.push('actions');
       try {
-        if (!obj.containsKey('type')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final type = obj['type'];
-        if (type == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(MessageType.canParse(type, reporter))) {
-          reporter.reportError('must be of type MessageType');
+        final actions = obj['actions'];
+        if (actions != null &&
+            !((actions is List<Object?> &&
+                (actions.every(
+                    (item) => MessageActionItem.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<MessageActionItem>');
           return false;
         }
       } finally {
@@ -36792,14 +36126,19 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('actions');
+      reporter.push('type');
       try {
-        final actions = obj['actions'];
-        if (actions != null &&
-            !((actions is List<Object?> &&
-                (actions.every(
-                    (item) => MessageActionItem.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<MessageActionItem>');
+        if (!obj.containsKey('type')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final type = obj['type'];
+        if (type == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(MessageType.canParse(type, reporter))) {
+          reporter.reportError('must be of type MessageType');
           return false;
         }
       } finally {
@@ -36816,10 +36155,10 @@
   bool operator ==(Object other) {
     if (other is ShowMessageRequestParams &&
         other.runtimeType == ShowMessageRequestParams) {
-      return type == other.type &&
-          message == other.message &&
-          listEqual(actions, other.actions,
+      return listEqual(actions, other.actions,
               (MessageActionItem a, MessageActionItem b) => a == b) &&
+          message == other.message &&
+          type == other.type &&
           true;
     }
     return false;
@@ -36827,9 +36166,9 @@
 
   @override
   int get hashCode => Object.hash(
-        type,
-        message,
         lspHashCode(actions),
+        message,
+        type,
       );
 
   @override
@@ -36845,24 +36184,24 @@
   );
 
   SignatureHelp({
-    required this.signatures,
-    this.activeSignature,
     this.activeParameter,
+    this.activeSignature,
+    required this.signatures,
   });
   static SignatureHelp fromJson(Map<String, Object?> json) {
+    final activeParameterJson = json['activeParameter'];
+    final activeParameter = activeParameterJson as int?;
+    final activeSignatureJson = json['activeSignature'];
+    final activeSignature = activeSignatureJson as int?;
     final signaturesJson = json['signatures'];
     final signatures = (signaturesJson as List<Object?>)
         .map((item) =>
             SignatureInformation.fromJson(item as Map<String, Object?>))
         .toList();
-    final activeSignatureJson = json['activeSignature'];
-    final activeSignature = activeSignatureJson as int?;
-    final activeParameterJson = json['activeParameter'];
-    final activeParameter = activeParameterJson as int?;
     return SignatureHelp(
-      signatures: signatures,
-      activeSignature: activeSignature,
       activeParameter: activeParameter,
+      activeSignature: activeSignature,
+      signatures: signatures,
     );
   }
 
@@ -36891,18 +36230,38 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['signatures'] = signatures.map((item) => item.toJson()).toList();
-    if (activeSignature != null) {
-      __result['activeSignature'] = activeSignature;
-    }
     if (activeParameter != null) {
       __result['activeParameter'] = activeParameter;
     }
+    if (activeSignature != null) {
+      __result['activeSignature'] = activeSignature;
+    }
+    __result['signatures'] = signatures.map((item) => item.toJson()).toList();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('activeParameter');
+      try {
+        final activeParameter = obj['activeParameter'];
+        if (activeParameter != null && !(activeParameter is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('activeSignature');
+      try {
+        final activeSignature = obj['activeSignature'];
+        if (activeSignature != null && !(activeSignature is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('signatures');
       try {
         if (!obj.containsKey('signatures')) {
@@ -36923,26 +36282,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('activeSignature');
-      try {
-        final activeSignature = obj['activeSignature'];
-        if (activeSignature != null && !(activeSignature is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('activeParameter');
-      try {
-        final activeParameter = obj['activeParameter'];
-        if (activeParameter != null && !(activeParameter is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type SignatureHelp');
@@ -36953,10 +36292,10 @@
   @override
   bool operator ==(Object other) {
     if (other is SignatureHelp && other.runtimeType == SignatureHelp) {
-      return listEqual(signatures, other.signatures,
-              (SignatureInformation a, SignatureInformation b) => a == b) &&
+      return activeParameter == other.activeParameter &&
           activeSignature == other.activeSignature &&
-          activeParameter == other.activeParameter &&
+          listEqual(signatures, other.signatures,
+              (SignatureInformation a, SignatureInformation b) => a == b) &&
           true;
     }
     return false;
@@ -36964,9 +36303,9 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(signatures),
-        activeSignature,
         activeParameter,
+        activeSignature,
+        lspHashCode(signatures),
       );
 
   @override
@@ -36980,11 +36319,13 @@
   );
 
   SignatureHelpClientCapabilities({
+    this.contextSupport,
     this.dynamicRegistration,
     this.signatureInformation,
-    this.contextSupport,
   });
   static SignatureHelpClientCapabilities fromJson(Map<String, Object?> json) {
+    final contextSupportJson = json['contextSupport'];
+    final contextSupport = contextSupportJson as bool?;
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
     final signatureInformationJson = json['signatureInformation'];
@@ -36992,12 +36333,10 @@
         ? SignatureHelpClientCapabilitiesSignatureInformation.fromJson(
             signatureInformationJson as Map<String, Object?>)
         : null;
-    final contextSupportJson = json['contextSupport'];
-    final contextSupport = contextSupportJson as bool?;
     return SignatureHelpClientCapabilities(
+      contextSupport: contextSupport,
       dynamicRegistration: dynamicRegistration,
       signatureInformation: signatureInformation,
-      contextSupport: contextSupport,
     );
   }
 
@@ -37018,20 +36357,30 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (contextSupport != null) {
+      __result['contextSupport'] = contextSupport;
+    }
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
     if (signatureInformation != null) {
       __result['signatureInformation'] = signatureInformation?.toJson();
     }
-    if (contextSupport != null) {
-      __result['contextSupport'] = contextSupport;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('contextSupport');
+      try {
+        final contextSupport = obj['contextSupport'];
+        if (contextSupport != null && !(contextSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
@@ -37055,16 +36404,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('contextSupport');
-      try {
-        final contextSupport = obj['contextSupport'];
-        if (contextSupport != null && !(contextSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type SignatureHelpClientCapabilities');
@@ -37076,9 +36415,9 @@
   bool operator ==(Object other) {
     if (other is SignatureHelpClientCapabilities &&
         other.runtimeType == SignatureHelpClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration &&
+      return contextSupport == other.contextSupport &&
+          dynamicRegistration == other.dynamicRegistration &&
           signatureInformation == other.signatureInformation &&
-          contextSupport == other.contextSupport &&
           true;
     }
     return false;
@@ -37086,9 +36425,9 @@
 
   @override
   int get hashCode => Object.hash(
+        contextSupport,
         dynamicRegistration,
         signatureInformation,
-        contextSupport,
       );
 
   @override
@@ -37172,12 +36511,14 @@
   );
 
   SignatureHelpClientCapabilitiesSignatureInformation({
+    this.activeParameterSupport,
     this.documentationFormat,
     this.parameterInformation,
-    this.activeParameterSupport,
   });
   static SignatureHelpClientCapabilitiesSignatureInformation fromJson(
       Map<String, Object?> json) {
+    final activeParameterSupportJson = json['activeParameterSupport'];
+    final activeParameterSupport = activeParameterSupportJson as bool?;
     final documentationFormatJson = json['documentationFormat'];
     final documentationFormat = (documentationFormatJson as List<Object?>?)
         ?.map((item) => MarkupKind.fromJson(item as String))
@@ -37187,12 +36528,10 @@
         ? SignatureHelpClientCapabilitiesParameterInformation.fromJson(
             parameterInformationJson as Map<String, Object?>)
         : null;
-    final activeParameterSupportJson = json['activeParameterSupport'];
-    final activeParameterSupport = activeParameterSupportJson as bool?;
     return SignatureHelpClientCapabilitiesSignatureInformation(
+      activeParameterSupport: activeParameterSupport,
       documentationFormat: documentationFormat,
       parameterInformation: parameterInformation,
-      activeParameterSupport: activeParameterSupport,
     );
   }
 
@@ -37211,6 +36550,9 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (activeParameterSupport != null) {
+      __result['activeParameterSupport'] = activeParameterSupport;
+    }
     if (documentationFormat != null) {
       __result['documentationFormat'] =
           documentationFormat?.map((item) => item.toJson()).toList();
@@ -37218,14 +36560,22 @@
     if (parameterInformation != null) {
       __result['parameterInformation'] = parameterInformation?.toJson();
     }
-    if (activeParameterSupport != null) {
-      __result['activeParameterSupport'] = activeParameterSupport;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('activeParameterSupport');
+      try {
+        final activeParameterSupport = obj['activeParameterSupport'];
+        if (activeParameterSupport != null &&
+            !(activeParameterSupport is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('documentationFormat');
       try {
         final documentationFormat = obj['documentationFormat'];
@@ -37252,17 +36602,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('activeParameterSupport');
-      try {
-        final activeParameterSupport = obj['activeParameterSupport'];
-        if (activeParameterSupport != null &&
-            !(activeParameterSupport is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError(
@@ -37276,10 +36615,10 @@
     if (other is SignatureHelpClientCapabilitiesSignatureInformation &&
         other.runtimeType ==
             SignatureHelpClientCapabilitiesSignatureInformation) {
-      return listEqual(documentationFormat, other.documentationFormat,
+      return activeParameterSupport == other.activeParameterSupport &&
+          listEqual(documentationFormat, other.documentationFormat,
               (MarkupKind a, MarkupKind b) => a == b) &&
           parameterInformation == other.parameterInformation &&
-          activeParameterSupport == other.activeParameterSupport &&
           true;
     }
     return false;
@@ -37287,9 +36626,9 @@
 
   @override
   int get hashCode => Object.hash(
+        activeParameterSupport,
         lspHashCode(documentationFormat),
         parameterInformation,
-        activeParameterSupport,
       );
 
   @override
@@ -37306,29 +36645,29 @@
   );
 
   SignatureHelpContext({
-    required this.triggerKind,
-    this.triggerCharacter,
-    required this.isRetrigger,
     this.activeSignatureHelp,
+    required this.isRetrigger,
+    this.triggerCharacter,
+    required this.triggerKind,
   });
   static SignatureHelpContext fromJson(Map<String, Object?> json) {
-    final triggerKindJson = json['triggerKind'];
-    final triggerKind =
-        SignatureHelpTriggerKind.fromJson(triggerKindJson as int);
-    final triggerCharacterJson = json['triggerCharacter'];
-    final triggerCharacter = triggerCharacterJson as String?;
-    final isRetriggerJson = json['isRetrigger'];
-    final isRetrigger = isRetriggerJson as bool;
     final activeSignatureHelpJson = json['activeSignatureHelp'];
     final activeSignatureHelp = activeSignatureHelpJson != null
         ? SignatureHelp.fromJson(
             activeSignatureHelpJson as Map<String, Object?>)
         : null;
+    final isRetriggerJson = json['isRetrigger'];
+    final isRetrigger = isRetriggerJson as bool;
+    final triggerCharacterJson = json['triggerCharacter'];
+    final triggerCharacter = triggerCharacterJson as String?;
+    final triggerKindJson = json['triggerKind'];
+    final triggerKind =
+        SignatureHelpTriggerKind.fromJson(triggerKindJson as int);
     return SignatureHelpContext(
-      triggerKind: triggerKind,
-      triggerCharacter: triggerCharacter,
-      isRetrigger: isRetrigger,
       activeSignatureHelp: activeSignatureHelp,
+      isRetrigger: isRetrigger,
+      triggerCharacter: triggerCharacter,
+      triggerKind: triggerKind,
     );
   }
 
@@ -37356,42 +36695,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['triggerKind'] = triggerKind.toJson();
-    if (triggerCharacter != null) {
-      __result['triggerCharacter'] = triggerCharacter;
-    }
-    __result['isRetrigger'] = isRetrigger;
     if (activeSignatureHelp != null) {
       __result['activeSignatureHelp'] = activeSignatureHelp?.toJson();
     }
+    __result['isRetrigger'] = isRetrigger;
+    if (triggerCharacter != null) {
+      __result['triggerCharacter'] = triggerCharacter;
+    }
+    __result['triggerKind'] = triggerKind.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('triggerKind');
+      reporter.push('activeSignatureHelp');
       try {
-        if (!obj.containsKey('triggerKind')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final triggerKind = obj['triggerKind'];
-        if (triggerKind == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(SignatureHelpTriggerKind.canParse(triggerKind, reporter))) {
-          reporter.reportError('must be of type SignatureHelpTriggerKind');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('triggerCharacter');
-      try {
-        final triggerCharacter = obj['triggerCharacter'];
-        if (triggerCharacter != null && !(triggerCharacter is String)) {
-          reporter.reportError('must be of type String');
+        final activeSignatureHelp = obj['activeSignatureHelp'];
+        if (activeSignatureHelp != null &&
+            !(SignatureHelp.canParse(activeSignatureHelp, reporter))) {
+          reporter.reportError('must be of type SignatureHelp');
           return false;
         }
       } finally {
@@ -37415,12 +36737,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('activeSignatureHelp');
+      reporter.push('triggerCharacter');
       try {
-        final activeSignatureHelp = obj['activeSignatureHelp'];
-        if (activeSignatureHelp != null &&
-            !(SignatureHelp.canParse(activeSignatureHelp, reporter))) {
-          reporter.reportError('must be of type SignatureHelp');
+        final triggerCharacter = obj['triggerCharacter'];
+        if (triggerCharacter != null && !(triggerCharacter is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('triggerKind');
+      try {
+        if (!obj.containsKey('triggerKind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final triggerKind = obj['triggerKind'];
+        if (triggerKind == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(SignatureHelpTriggerKind.canParse(triggerKind, reporter))) {
+          reporter.reportError('must be of type SignatureHelpTriggerKind');
           return false;
         }
       } finally {
@@ -37437,10 +36776,10 @@
   bool operator ==(Object other) {
     if (other is SignatureHelpContext &&
         other.runtimeType == SignatureHelpContext) {
-      return triggerKind == other.triggerKind &&
-          triggerCharacter == other.triggerCharacter &&
+      return activeSignatureHelp == other.activeSignatureHelp &&
           isRetrigger == other.isRetrigger &&
-          activeSignatureHelp == other.activeSignatureHelp &&
+          triggerCharacter == other.triggerCharacter &&
+          triggerKind == other.triggerKind &&
           true;
     }
     return false;
@@ -37448,10 +36787,10 @@
 
   @override
   int get hashCode => Object.hash(
-        triggerKind,
-        triggerCharacter,
-        isRetrigger,
         activeSignatureHelp,
+        isRetrigger,
+        triggerCharacter,
+        triggerKind,
       );
 
   @override
@@ -37465,27 +36804,27 @@
   );
 
   SignatureHelpOptions({
-    this.triggerCharacters,
     this.retriggerCharacters,
+    this.triggerCharacters,
     this.workDoneProgress,
   });
   static SignatureHelpOptions fromJson(Map<String, Object?> json) {
     if (SignatureHelpRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return SignatureHelpRegistrationOptions.fromJson(json);
     }
-    final triggerCharactersJson = json['triggerCharacters'];
-    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
-        ?.map((item) => item as String)
-        .toList();
     final retriggerCharactersJson = json['retriggerCharacters'];
     final retriggerCharacters = (retriggerCharactersJson as List<Object?>?)
         ?.map((item) => item as String)
         .toList();
+    final triggerCharactersJson = json['triggerCharacters'];
+    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return SignatureHelpOptions(
-      triggerCharacters: triggerCharacters,
       retriggerCharacters: retriggerCharacters,
+      triggerCharacters: triggerCharacters,
       workDoneProgress: workDoneProgress,
     );
   }
@@ -37503,12 +36842,12 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (triggerCharacters != null) {
-      __result['triggerCharacters'] = triggerCharacters;
-    }
     if (retriggerCharacters != null) {
       __result['retriggerCharacters'] = retriggerCharacters;
     }
+    if (triggerCharacters != null) {
+      __result['triggerCharacters'] = triggerCharacters;
+    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -37517,18 +36856,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('triggerCharacters');
-      try {
-        final triggerCharacters = obj['triggerCharacters'];
-        if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('retriggerCharacters');
       try {
         final retriggerCharacters = obj['retriggerCharacters'];
@@ -37541,6 +36868,18 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('triggerCharacters');
+      try {
+        final triggerCharacters = obj['triggerCharacters'];
+        if (triggerCharacters != null &&
+            !((triggerCharacters is List<Object?> &&
+                (triggerCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -37562,9 +36901,9 @@
   bool operator ==(Object other) {
     if (other is SignatureHelpOptions &&
         other.runtimeType == SignatureHelpOptions) {
-      return listEqual(triggerCharacters, other.triggerCharacters,
+      return listEqual(retriggerCharacters, other.retriggerCharacters,
               (String a, String b) => a == b) &&
-          listEqual(retriggerCharacters, other.retriggerCharacters,
+          listEqual(triggerCharacters, other.triggerCharacters,
               (String a, String b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
@@ -37574,8 +36913,8 @@
 
   @override
   int get hashCode => Object.hash(
-        lspHashCode(triggerCharacters),
         lspHashCode(retriggerCharacters),
+        lspHashCode(triggerCharacters),
         workDoneProgress,
       );
 
@@ -37592,8 +36931,8 @@
 
   SignatureHelpParams({
     this.context,
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
     this.workDoneToken,
   });
   static SignatureHelpParams fromJson(Map<String, Object?> json) {
@@ -37601,11 +36940,11 @@
     final context = contextJson != null
         ? SignatureHelpContext.fromJson(contextJson as Map<String, Object?>)
         : null;
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -37616,8 +36955,8 @@
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return SignatureHelpParams(
       context: context,
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -37642,8 +36981,8 @@
     if (context != null) {
       __result['context'] = context?.toJson();
     }
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -37663,24 +37002,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -37699,6 +37020,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -37722,8 +37061,8 @@
     if (other is SignatureHelpParams &&
         other.runtimeType == SignatureHelpParams) {
       return context == other.context &&
-          textDocument == other.textDocument &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -37733,8 +37072,8 @@
   @override
   int get hashCode => Object.hash(
         context,
-        textDocument,
         position,
+        textDocument,
         workDoneToken,
       );
 
@@ -37754,36 +37093,37 @@
 
   SignatureHelpRegistrationOptions({
     this.documentSelector,
-    this.triggerCharacters,
     this.retriggerCharacters,
+    this.triggerCharacters,
     this.workDoneProgress,
   });
   static SignatureHelpRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
-        .toList();
-    final triggerCharactersJson = json['triggerCharacters'];
-    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
-        ?.map((item) => item as String)
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     final retriggerCharactersJson = json['retriggerCharacters'];
     final retriggerCharacters = (retriggerCharactersJson as List<Object?>?)
         ?.map((item) => item as String)
         .toList();
+    final triggerCharactersJson = json['triggerCharacters'];
+    final triggerCharacters = (triggerCharactersJson as List<Object?>?)
+        ?.map((item) => item as String)
+        .toList();
     final workDoneProgressJson = json['workDoneProgress'];
     final workDoneProgress = workDoneProgressJson as bool?;
     return SignatureHelpRegistrationOptions(
       documentSelector: documentSelector,
-      triggerCharacters: triggerCharacters,
       retriggerCharacters: retriggerCharacters,
+      triggerCharacters: triggerCharacters,
       workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// List of characters that re-trigger signature help.
   ///
@@ -37799,12 +37139,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (triggerCharacters != null) {
-      __result['triggerCharacters'] = triggerCharacters;
-    }
     if (retriggerCharacters != null) {
       __result['retriggerCharacters'] = retriggerCharacters;
     }
+    if (triggerCharacters != null) {
+      __result['triggerCharacters'] = triggerCharacters;
+    }
     if (workDoneProgress != null) {
       __result['workDoneProgress'] = workDoneProgress;
     }
@@ -37823,20 +37163,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('triggerCharacters');
-      try {
-        final triggerCharacters = obj['triggerCharacters'];
-        if (triggerCharacters != null &&
-            !((triggerCharacters is List<Object?> &&
-                (triggerCharacters.every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -37854,6 +37182,18 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('triggerCharacters');
+      try {
+        final triggerCharacters = obj['triggerCharacters'];
+        if (triggerCharacters != null &&
+            !((triggerCharacters is List<Object?> &&
+                (triggerCharacters.every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneProgress');
       try {
         final workDoneProgress = obj['workDoneProgress'];
@@ -37876,11 +37216,11 @@
     if (other is SignatureHelpRegistrationOptions &&
         other.runtimeType == SignatureHelpRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          listEqual(triggerCharacters, other.triggerCharacters,
-              (String a, String b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           listEqual(retriggerCharacters, other.retriggerCharacters,
               (String a, String b) => a == b) &&
+          listEqual(triggerCharacters, other.triggerCharacters,
+              (String a, String b) => a == b) &&
           workDoneProgress == other.workDoneProgress &&
           true;
     }
@@ -37890,8 +37230,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        lspHashCode(triggerCharacters),
         lspHashCode(retriggerCharacters),
+        lspHashCode(triggerCharacters),
         workDoneProgress,
       );
 
@@ -37942,35 +37282,35 @@
   );
 
   SignatureInformation({
-    required this.label,
-    this.documentation,
-    this.parameters,
     this.activeParameter,
+    this.documentation,
+    required this.label,
+    this.parameters,
   });
   static SignatureInformation fromJson(Map<String, Object?> json) {
-    final labelJson = json['label'];
-    final label = labelJson as String;
+    final activeParameterJson = json['activeParameter'];
+    final activeParameter = activeParameterJson as int?;
     final documentationJson = json['documentation'];
     final documentation = documentationJson == null
         ? null
-        : (documentationJson is String
-            ? Either2<String, MarkupContent>.t1(documentationJson)
-            : (MarkupContent.canParse(documentationJson, nullLspJsonReporter)
-                ? Either2<String, MarkupContent>.t2(MarkupContent.fromJson(
-                    documentationJson as Map<String, Object?>))
-                : (throw '''$documentationJson was not one of (String, MarkupContent)''')));
+        : (MarkupContent.canParse(documentationJson, nullLspJsonReporter)
+            ? Either2<MarkupContent, String>.t1(MarkupContent.fromJson(
+                documentationJson as Map<String, Object?>))
+            : (documentationJson is String
+                ? Either2<MarkupContent, String>.t2(documentationJson)
+                : (throw '''$documentationJson was not one of (MarkupContent, String)''')));
+    final labelJson = json['label'];
+    final label = labelJson as String;
     final parametersJson = json['parameters'];
     final parameters = (parametersJson as List<Object?>?)
         ?.map((item) =>
             ParameterInformation.fromJson(item as Map<String, Object?>))
         .toList();
-    final activeParameterJson = json['activeParameter'];
-    final activeParameter = activeParameterJson as int?;
     return SignatureInformation(
-      label: label,
-      documentation: documentation,
-      parameters: parameters,
       activeParameter: activeParameter,
+      documentation: documentation,
+      label: label,
+      parameters: parameters,
     );
   }
 
@@ -37982,7 +37322,7 @@
 
   /// The human-readable doc-comment of this signature. Will be shown in the UI
   /// but can be omitted.
-  final Either2<String, MarkupContent>? documentation;
+  final Either2<MarkupContent, String>? documentation;
 
   /// The label of this signature. Will be shown in the UI.
   final String label;
@@ -37992,22 +37332,45 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['label'] = label;
+    if (activeParameter != null) {
+      __result['activeParameter'] = activeParameter;
+    }
     if (documentation != null) {
       __result['documentation'] = documentation;
     }
+    __result['label'] = label;
     if (parameters != null) {
       __result['parameters'] =
           parameters?.map((item) => item.toJson()).toList();
     }
-    if (activeParameter != null) {
-      __result['activeParameter'] = activeParameter;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('activeParameter');
+      try {
+        final activeParameter = obj['activeParameter'];
+        if (activeParameter != null && !(activeParameter is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentation');
+      try {
+        final documentation = obj['documentation'];
+        if (documentation != null &&
+            !((MarkupContent.canParse(documentation, reporter) ||
+                documentation is String))) {
+          reporter
+              .reportError('must be of type Either2<MarkupContent, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('label');
       try {
         if (!obj.containsKey('label')) {
@@ -38026,19 +37389,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentation');
-      try {
-        final documentation = obj['documentation'];
-        if (documentation != null &&
-            !((documentation is String ||
-                MarkupContent.canParse(documentation, reporter)))) {
-          reporter
-              .reportError('must be of type Either2<String, MarkupContent>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('parameters');
       try {
         final parameters = obj['parameters'];
@@ -38052,16 +37402,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('activeParameter');
-      try {
-        final activeParameter = obj['activeParameter'];
-        if (activeParameter != null && !(activeParameter is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type SignatureInformation');
@@ -38073,11 +37413,11 @@
   bool operator ==(Object other) {
     if (other is SignatureInformation &&
         other.runtimeType == SignatureInformation) {
-      return label == other.label &&
+      return activeParameter == other.activeParameter &&
           documentation == other.documentation &&
+          label == other.label &&
           listEqual(parameters, other.parameters,
               (ParameterInformation a, ParameterInformation b) => a == b) &&
-          activeParameter == other.activeParameter &&
           true;
     }
     return false;
@@ -38085,10 +37425,10 @@
 
   @override
   int get hashCode => Object.hash(
-        label,
-        documentation,
-        lspHashCode(parameters),
         activeParameter,
+        documentation,
+        label,
+        lspHashCode(parameters),
       );
 
   @override
@@ -38214,35 +37554,35 @@
   );
 
   SymbolInformation({
-    required this.name,
-    required this.kind,
-    this.tags,
-    this.deprecated,
-    required this.location,
     this.containerName,
+    this.deprecated,
+    required this.kind,
+    required this.location,
+    required this.name,
+    this.tags,
   });
   static SymbolInformation fromJson(Map<String, Object?> json) {
-    final nameJson = json['name'];
-    final name = nameJson as String;
+    final containerNameJson = json['containerName'];
+    final containerName = containerNameJson as String?;
+    final deprecatedJson = json['deprecated'];
+    final deprecated = deprecatedJson as bool?;
     final kindJson = json['kind'];
     final kind = SymbolKind.fromJson(kindJson as int);
+    final locationJson = json['location'];
+    final location = Location.fromJson(locationJson as Map<String, Object?>);
+    final nameJson = json['name'];
+    final name = nameJson as String;
     final tagsJson = json['tags'];
     final tags = (tagsJson as List<Object?>?)
         ?.map((item) => SymbolTag.fromJson(item as int))
         .toList();
-    final deprecatedJson = json['deprecated'];
-    final deprecated = deprecatedJson as bool?;
-    final locationJson = json['location'];
-    final location = Location.fromJson(locationJson as Map<String, Object?>);
-    final containerNameJson = json['containerName'];
-    final containerName = containerNameJson as String?;
     return SymbolInformation(
-      name: name,
-      kind: kind,
-      tags: tags,
-      deprecated: deprecated,
-      location: location,
       containerName: containerName,
+      deprecated: deprecated,
+      kind: kind,
+      location: location,
+      name: name,
+      tags: tags,
     );
   }
 
@@ -38279,41 +37619,43 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['name'] = name;
-    __result['kind'] = kind.toJson();
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    if (containerName != null) {
+      __result['containerName'] = containerName;
     }
     if (deprecated != null) {
       __result['deprecated'] = deprecated;
     }
+    __result['kind'] = kind.toJson();
     __result['location'] = location.toJson();
-    if (containerName != null) {
-      __result['containerName'] = containerName;
+    __result['name'] = name;
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('name');
+      reporter.push('containerName');
       try {
-        if (!obj.containsKey('name')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final name = obj['name'];
-        if (name == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(name is String)) {
+        final containerName = obj['containerName'];
+        if (containerName != null && !(containerName is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
+      reporter.push('deprecated');
+      try {
+        final deprecated = obj['deprecated'];
+        if (deprecated != null && !(deprecated is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -38332,28 +37674,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
-      try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<SymbolTag>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('deprecated');
-      try {
-        final deprecated = obj['deprecated'];
-        if (deprecated != null && !(deprecated is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('location');
       try {
         if (!obj.containsKey('location')) {
@@ -38372,16 +37692,36 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('containerName');
+      reporter.push('name');
       try {
-        final containerName = obj['containerName'];
-        if (containerName != null && !(containerName is String)) {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final name = obj['name'];
+        if (name == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(name is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type SymbolInformation');
@@ -38392,12 +37732,12 @@
   @override
   bool operator ==(Object other) {
     if (other is SymbolInformation && other.runtimeType == SymbolInformation) {
-      return name == other.name &&
-          kind == other.kind &&
-          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+      return containerName == other.containerName &&
           deprecated == other.deprecated &&
+          kind == other.kind &&
           location == other.location &&
-          containerName == other.containerName &&
+          name == other.name &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
           true;
     }
     return false;
@@ -38405,12 +37745,12 @@
 
   @override
   int get hashCode => Object.hash(
-        name,
-        kind,
-        lspHashCode(tags),
-        deprecated,
-        location,
         containerName,
+        deprecated,
+        kind,
+        location,
+        name,
+        lspHashCode(tags),
       );
 
   @override
@@ -38502,26 +37842,27 @@
   );
 
   TextDocumentChangeRegistrationOptions({
-    required this.syncKind,
     this.documentSelector,
+    required this.syncKind,
   });
   static TextDocumentChangeRegistrationOptions fromJson(
       Map<String, Object?> json) {
-    final syncKindJson = json['syncKind'];
-    final syncKind = TextDocumentSyncKind.fromJson(syncKindJson as int);
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
+    final syncKindJson = json['syncKind'];
+    final syncKind = TextDocumentSyncKind.fromJson(syncKindJson as int);
     return TextDocumentChangeRegistrationOptions(
-      syncKind: syncKind,
       documentSelector: documentSelector,
+      syncKind: syncKind,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// How documents are synced to the server. See TextDocumentSyncKind.Full and
   /// TextDocumentSyncKind.Incremental.
@@ -38529,13 +37870,30 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['syncKind'] = syncKind.toJson();
     __result['documentSelector'] = documentSelector;
+    __result['syncKind'] = syncKind.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final documentSelector = obj['documentSelector'];
+        if (documentSelector != null &&
+            !((documentSelector is List<Object?> &&
+                (documentSelector.every(
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('syncKind');
       try {
         if (!obj.containsKey('syncKind')) {
@@ -38554,23 +37912,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentSelector');
-      try {
-        if (!obj.containsKey('documentSelector')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final documentSelector = obj['documentSelector'];
-        if (documentSelector != null &&
-            !((documentSelector is List<Object?> &&
-                (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter
@@ -38583,9 +37924,9 @@
   bool operator ==(Object other) {
     if (other is TextDocumentChangeRegistrationOptions &&
         other.runtimeType == TextDocumentChangeRegistrationOptions) {
-      return syncKind == other.syncKind &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          syncKind == other.syncKind &&
           true;
     }
     return false;
@@ -38593,8 +37934,8 @@
 
   @override
   int get hashCode => Object.hash(
-        syncKind,
         lspHashCode(documentSelector),
+        syncKind,
       );
 
   @override
@@ -38609,91 +37950,42 @@
   );
 
   TextDocumentClientCapabilities({
-    this.synchronization,
-    this.completion,
-    this.hover,
-    this.signatureHelp,
-    this.declaration,
-    this.definition,
-    this.typeDefinition,
-    this.implementation,
-    this.references,
-    this.documentHighlight,
-    this.documentSymbol,
+    this.callHierarchy,
     this.codeAction,
     this.codeLens,
-    this.documentLink,
     this.colorProvider,
-    this.formatting,
-    this.rangeFormatting,
-    this.onTypeFormatting,
-    this.rename,
-    this.publishDiagnostics,
-    this.foldingRange,
-    this.selectionRange,
-    this.linkedEditingRange,
-    this.callHierarchy,
-    this.semanticTokens,
-    this.moniker,
-    this.typeHierarchy,
-    this.inlineValue,
-    this.inlayHint,
+    this.completion,
+    this.declaration,
+    this.definition,
     this.diagnostic,
+    this.documentHighlight,
+    this.documentLink,
+    this.documentSymbol,
+    this.foldingRange,
+    this.formatting,
+    this.hover,
+    this.implementation,
+    this.inlayHint,
+    this.inlineValue,
+    this.linkedEditingRange,
+    this.moniker,
+    this.onTypeFormatting,
+    this.publishDiagnostics,
+    this.rangeFormatting,
+    this.references,
+    this.rename,
+    this.selectionRange,
+    this.semanticTokens,
+    this.signatureHelp,
+    this.synchronization,
+    this.typeDefinition,
+    this.typeHierarchy,
   });
   static TextDocumentClientCapabilities fromJson(Map<String, Object?> json) {
-    final synchronizationJson = json['synchronization'];
-    final synchronization = synchronizationJson != null
-        ? TextDocumentSyncClientCapabilities.fromJson(
-            synchronizationJson as Map<String, Object?>)
-        : null;
-    final completionJson = json['completion'];
-    final completion = completionJson != null
-        ? CompletionClientCapabilities.fromJson(
-            completionJson as Map<String, Object?>)
-        : null;
-    final hoverJson = json['hover'];
-    final hover = hoverJson != null
-        ? HoverClientCapabilities.fromJson(hoverJson as Map<String, Object?>)
-        : null;
-    final signatureHelpJson = json['signatureHelp'];
-    final signatureHelp = signatureHelpJson != null
-        ? SignatureHelpClientCapabilities.fromJson(
-            signatureHelpJson as Map<String, Object?>)
-        : null;
-    final declarationJson = json['declaration'];
-    final declaration = declarationJson != null
-        ? DeclarationClientCapabilities.fromJson(
-            declarationJson as Map<String, Object?>)
-        : null;
-    final definitionJson = json['definition'];
-    final definition = definitionJson != null
-        ? DefinitionClientCapabilities.fromJson(
-            definitionJson as Map<String, Object?>)
-        : null;
-    final typeDefinitionJson = json['typeDefinition'];
-    final typeDefinition = typeDefinitionJson != null
-        ? TypeDefinitionClientCapabilities.fromJson(
-            typeDefinitionJson as Map<String, Object?>)
-        : null;
-    final implementationJson = json['implementation'];
-    final implementation = implementationJson != null
-        ? ImplementationClientCapabilities.fromJson(
-            implementationJson as Map<String, Object?>)
-        : null;
-    final referencesJson = json['references'];
-    final references = referencesJson != null
-        ? ReferenceClientCapabilities.fromJson(
-            referencesJson as Map<String, Object?>)
-        : null;
-    final documentHighlightJson = json['documentHighlight'];
-    final documentHighlight = documentHighlightJson != null
-        ? DocumentHighlightClientCapabilities.fromJson(
-            documentHighlightJson as Map<String, Object?>)
-        : null;
-    final documentSymbolJson = json['documentSymbol'];
-    final documentSymbol = documentSymbolJson != null
-        ? DocumentSymbolClientCapabilities.fromJson(
-            documentSymbolJson as Map<String, Object?>)
+    final callHierarchyJson = json['callHierarchy'];
+    final callHierarchy = callHierarchyJson != null
+        ? CallHierarchyClientCapabilities.fromJson(
+            callHierarchyJson as Map<String, Object?>)
         : null;
     final codeActionJson = json['codeAction'];
     final codeAction = codeActionJson != null
@@ -38705,121 +37997,170 @@
         ? CodeLensClientCapabilities.fromJson(
             codeLensJson as Map<String, Object?>)
         : null;
-    final documentLinkJson = json['documentLink'];
-    final documentLink = documentLinkJson != null
-        ? DocumentLinkClientCapabilities.fromJson(
-            documentLinkJson as Map<String, Object?>)
-        : null;
     final colorProviderJson = json['colorProvider'];
     final colorProvider = colorProviderJson != null
         ? DocumentColorClientCapabilities.fromJson(
             colorProviderJson as Map<String, Object?>)
         : null;
-    final formattingJson = json['formatting'];
-    final formatting = formattingJson != null
-        ? DocumentFormattingClientCapabilities.fromJson(
-            formattingJson as Map<String, Object?>)
+    final completionJson = json['completion'];
+    final completion = completionJson != null
+        ? CompletionClientCapabilities.fromJson(
+            completionJson as Map<String, Object?>)
         : null;
-    final rangeFormattingJson = json['rangeFormatting'];
-    final rangeFormatting = rangeFormattingJson != null
-        ? DocumentRangeFormattingClientCapabilities.fromJson(
-            rangeFormattingJson as Map<String, Object?>)
+    final declarationJson = json['declaration'];
+    final declaration = declarationJson != null
+        ? DeclarationClientCapabilities.fromJson(
+            declarationJson as Map<String, Object?>)
         : null;
-    final onTypeFormattingJson = json['onTypeFormatting'];
-    final onTypeFormatting = onTypeFormattingJson != null
-        ? DocumentOnTypeFormattingClientCapabilities.fromJson(
-            onTypeFormattingJson as Map<String, Object?>)
-        : null;
-    final renameJson = json['rename'];
-    final rename = renameJson != null
-        ? RenameClientCapabilities.fromJson(renameJson as Map<String, Object?>)
-        : null;
-    final publishDiagnosticsJson = json['publishDiagnostics'];
-    final publishDiagnostics = publishDiagnosticsJson != null
-        ? PublishDiagnosticsClientCapabilities.fromJson(
-            publishDiagnosticsJson as Map<String, Object?>)
-        : null;
-    final foldingRangeJson = json['foldingRange'];
-    final foldingRange = foldingRangeJson != null
-        ? FoldingRangeClientCapabilities.fromJson(
-            foldingRangeJson as Map<String, Object?>)
-        : null;
-    final selectionRangeJson = json['selectionRange'];
-    final selectionRange = selectionRangeJson != null
-        ? SelectionRangeClientCapabilities.fromJson(
-            selectionRangeJson as Map<String, Object?>)
-        : null;
-    final linkedEditingRangeJson = json['linkedEditingRange'];
-    final linkedEditingRange = linkedEditingRangeJson != null
-        ? LinkedEditingRangeClientCapabilities.fromJson(
-            linkedEditingRangeJson as Map<String, Object?>)
-        : null;
-    final callHierarchyJson = json['callHierarchy'];
-    final callHierarchy = callHierarchyJson != null
-        ? CallHierarchyClientCapabilities.fromJson(
-            callHierarchyJson as Map<String, Object?>)
-        : null;
-    final semanticTokensJson = json['semanticTokens'];
-    final semanticTokens = semanticTokensJson != null
-        ? SemanticTokensClientCapabilities.fromJson(
-            semanticTokensJson as Map<String, Object?>)
-        : null;
-    final monikerJson = json['moniker'];
-    final moniker = monikerJson != null
-        ? MonikerClientCapabilities.fromJson(
-            monikerJson as Map<String, Object?>)
-        : null;
-    final typeHierarchyJson = json['typeHierarchy'];
-    final typeHierarchy = typeHierarchyJson != null
-        ? TypeHierarchyClientCapabilities1.fromJson(
-            typeHierarchyJson as Map<String, Object?>)
-        : null;
-    final inlineValueJson = json['inlineValue'];
-    final inlineValue = inlineValueJson != null
-        ? InlineValueClientCapabilities.fromJson(
-            inlineValueJson as Map<String, Object?>)
-        : null;
-    final inlayHintJson = json['inlayHint'];
-    final inlayHint = inlayHintJson != null
-        ? InlayHintClientCapabilities.fromJson(
-            inlayHintJson as Map<String, Object?>)
+    final definitionJson = json['definition'];
+    final definition = definitionJson != null
+        ? DefinitionClientCapabilities.fromJson(
+            definitionJson as Map<String, Object?>)
         : null;
     final diagnosticJson = json['diagnostic'];
     final diagnostic = diagnosticJson != null
         ? DiagnosticClientCapabilities.fromJson(
             diagnosticJson as Map<String, Object?>)
         : null;
+    final documentHighlightJson = json['documentHighlight'];
+    final documentHighlight = documentHighlightJson != null
+        ? DocumentHighlightClientCapabilities.fromJson(
+            documentHighlightJson as Map<String, Object?>)
+        : null;
+    final documentLinkJson = json['documentLink'];
+    final documentLink = documentLinkJson != null
+        ? DocumentLinkClientCapabilities.fromJson(
+            documentLinkJson as Map<String, Object?>)
+        : null;
+    final documentSymbolJson = json['documentSymbol'];
+    final documentSymbol = documentSymbolJson != null
+        ? DocumentSymbolClientCapabilities.fromJson(
+            documentSymbolJson as Map<String, Object?>)
+        : null;
+    final foldingRangeJson = json['foldingRange'];
+    final foldingRange = foldingRangeJson != null
+        ? FoldingRangeClientCapabilities.fromJson(
+            foldingRangeJson as Map<String, Object?>)
+        : null;
+    final formattingJson = json['formatting'];
+    final formatting = formattingJson != null
+        ? DocumentFormattingClientCapabilities.fromJson(
+            formattingJson as Map<String, Object?>)
+        : null;
+    final hoverJson = json['hover'];
+    final hover = hoverJson != null
+        ? HoverClientCapabilities.fromJson(hoverJson as Map<String, Object?>)
+        : null;
+    final implementationJson = json['implementation'];
+    final implementation = implementationJson != null
+        ? ImplementationClientCapabilities.fromJson(
+            implementationJson as Map<String, Object?>)
+        : null;
+    final inlayHintJson = json['inlayHint'];
+    final inlayHint = inlayHintJson != null
+        ? InlayHintClientCapabilities.fromJson(
+            inlayHintJson as Map<String, Object?>)
+        : null;
+    final inlineValueJson = json['inlineValue'];
+    final inlineValue = inlineValueJson != null
+        ? InlineValueClientCapabilities.fromJson(
+            inlineValueJson as Map<String, Object?>)
+        : null;
+    final linkedEditingRangeJson = json['linkedEditingRange'];
+    final linkedEditingRange = linkedEditingRangeJson != null
+        ? LinkedEditingRangeClientCapabilities.fromJson(
+            linkedEditingRangeJson as Map<String, Object?>)
+        : null;
+    final monikerJson = json['moniker'];
+    final moniker = monikerJson != null
+        ? MonikerClientCapabilities.fromJson(
+            monikerJson as Map<String, Object?>)
+        : null;
+    final onTypeFormattingJson = json['onTypeFormatting'];
+    final onTypeFormatting = onTypeFormattingJson != null
+        ? DocumentOnTypeFormattingClientCapabilities.fromJson(
+            onTypeFormattingJson as Map<String, Object?>)
+        : null;
+    final publishDiagnosticsJson = json['publishDiagnostics'];
+    final publishDiagnostics = publishDiagnosticsJson != null
+        ? PublishDiagnosticsClientCapabilities.fromJson(
+            publishDiagnosticsJson as Map<String, Object?>)
+        : null;
+    final rangeFormattingJson = json['rangeFormatting'];
+    final rangeFormatting = rangeFormattingJson != null
+        ? DocumentRangeFormattingClientCapabilities.fromJson(
+            rangeFormattingJson as Map<String, Object?>)
+        : null;
+    final referencesJson = json['references'];
+    final references = referencesJson != null
+        ? ReferenceClientCapabilities.fromJson(
+            referencesJson as Map<String, Object?>)
+        : null;
+    final renameJson = json['rename'];
+    final rename = renameJson != null
+        ? RenameClientCapabilities.fromJson(renameJson as Map<String, Object?>)
+        : null;
+    final selectionRangeJson = json['selectionRange'];
+    final selectionRange = selectionRangeJson != null
+        ? SelectionRangeClientCapabilities.fromJson(
+            selectionRangeJson as Map<String, Object?>)
+        : null;
+    final semanticTokensJson = json['semanticTokens'];
+    final semanticTokens = semanticTokensJson != null
+        ? SemanticTokensClientCapabilities.fromJson(
+            semanticTokensJson as Map<String, Object?>)
+        : null;
+    final signatureHelpJson = json['signatureHelp'];
+    final signatureHelp = signatureHelpJson != null
+        ? SignatureHelpClientCapabilities.fromJson(
+            signatureHelpJson as Map<String, Object?>)
+        : null;
+    final synchronizationJson = json['synchronization'];
+    final synchronization = synchronizationJson != null
+        ? TextDocumentSyncClientCapabilities.fromJson(
+            synchronizationJson as Map<String, Object?>)
+        : null;
+    final typeDefinitionJson = json['typeDefinition'];
+    final typeDefinition = typeDefinitionJson != null
+        ? TypeDefinitionClientCapabilities.fromJson(
+            typeDefinitionJson as Map<String, Object?>)
+        : null;
+    final typeHierarchyJson = json['typeHierarchy'];
+    final typeHierarchy = typeHierarchyJson != null
+        ? TypeHierarchyClientCapabilities1.fromJson(
+            typeHierarchyJson as Map<String, Object?>)
+        : null;
     return TextDocumentClientCapabilities(
-      synchronization: synchronization,
-      completion: completion,
-      hover: hover,
-      signatureHelp: signatureHelp,
-      declaration: declaration,
-      definition: definition,
-      typeDefinition: typeDefinition,
-      implementation: implementation,
-      references: references,
-      documentHighlight: documentHighlight,
-      documentSymbol: documentSymbol,
+      callHierarchy: callHierarchy,
       codeAction: codeAction,
       codeLens: codeLens,
-      documentLink: documentLink,
       colorProvider: colorProvider,
-      formatting: formatting,
-      rangeFormatting: rangeFormatting,
-      onTypeFormatting: onTypeFormatting,
-      rename: rename,
-      publishDiagnostics: publishDiagnostics,
-      foldingRange: foldingRange,
-      selectionRange: selectionRange,
-      linkedEditingRange: linkedEditingRange,
-      callHierarchy: callHierarchy,
-      semanticTokens: semanticTokens,
-      moniker: moniker,
-      typeHierarchy: typeHierarchy,
-      inlineValue: inlineValue,
-      inlayHint: inlayHint,
+      completion: completion,
+      declaration: declaration,
+      definition: definition,
       diagnostic: diagnostic,
+      documentHighlight: documentHighlight,
+      documentLink: documentLink,
+      documentSymbol: documentSymbol,
+      foldingRange: foldingRange,
+      formatting: formatting,
+      hover: hover,
+      implementation: implementation,
+      inlayHint: inlayHint,
+      inlineValue: inlineValue,
+      linkedEditingRange: linkedEditingRange,
+      moniker: moniker,
+      onTypeFormatting: onTypeFormatting,
+      publishDiagnostics: publishDiagnostics,
+      rangeFormatting: rangeFormatting,
+      references: references,
+      rename: rename,
+      selectionRange: selectionRange,
+      semanticTokens: semanticTokens,
+      signatureHelp: signatureHelp,
+      synchronization: synchronization,
+      typeDefinition: typeDefinition,
+      typeHierarchy: typeHierarchy,
     );
   }
 
@@ -38930,38 +38271,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (synchronization != null) {
-      __result['synchronization'] = synchronization?.toJson();
-    }
-    if (completion != null) {
-      __result['completion'] = completion?.toJson();
-    }
-    if (hover != null) {
-      __result['hover'] = hover?.toJson();
-    }
-    if (signatureHelp != null) {
-      __result['signatureHelp'] = signatureHelp?.toJson();
-    }
-    if (declaration != null) {
-      __result['declaration'] = declaration?.toJson();
-    }
-    if (definition != null) {
-      __result['definition'] = definition?.toJson();
-    }
-    if (typeDefinition != null) {
-      __result['typeDefinition'] = typeDefinition?.toJson();
-    }
-    if (implementation != null) {
-      __result['implementation'] = implementation?.toJson();
-    }
-    if (references != null) {
-      __result['references'] = references?.toJson();
-    }
-    if (documentHighlight != null) {
-      __result['documentHighlight'] = documentHighlight?.toJson();
-    }
-    if (documentSymbol != null) {
-      __result['documentSymbol'] = documentSymbol?.toJson();
+    if (callHierarchy != null) {
+      __result['callHierarchy'] = callHierarchy?.toJson();
     }
     if (codeAction != null) {
       __result['codeAction'] = codeAction?.toJson();
@@ -38969,190 +38280,100 @@
     if (codeLens != null) {
       __result['codeLens'] = codeLens?.toJson();
     }
-    if (documentLink != null) {
-      __result['documentLink'] = documentLink?.toJson();
-    }
     if (colorProvider != null) {
       __result['colorProvider'] = colorProvider?.toJson();
     }
-    if (formatting != null) {
-      __result['formatting'] = formatting?.toJson();
+    if (completion != null) {
+      __result['completion'] = completion?.toJson();
     }
-    if (rangeFormatting != null) {
-      __result['rangeFormatting'] = rangeFormatting?.toJson();
+    if (declaration != null) {
+      __result['declaration'] = declaration?.toJson();
     }
-    if (onTypeFormatting != null) {
-      __result['onTypeFormatting'] = onTypeFormatting?.toJson();
+    if (definition != null) {
+      __result['definition'] = definition?.toJson();
     }
-    if (rename != null) {
-      __result['rename'] = rename?.toJson();
+    if (diagnostic != null) {
+      __result['diagnostic'] = diagnostic?.toJson();
     }
-    if (publishDiagnostics != null) {
-      __result['publishDiagnostics'] = publishDiagnostics?.toJson();
+    if (documentHighlight != null) {
+      __result['documentHighlight'] = documentHighlight?.toJson();
+    }
+    if (documentLink != null) {
+      __result['documentLink'] = documentLink?.toJson();
+    }
+    if (documentSymbol != null) {
+      __result['documentSymbol'] = documentSymbol?.toJson();
     }
     if (foldingRange != null) {
       __result['foldingRange'] = foldingRange?.toJson();
     }
-    if (selectionRange != null) {
-      __result['selectionRange'] = selectionRange?.toJson();
+    if (formatting != null) {
+      __result['formatting'] = formatting?.toJson();
     }
-    if (linkedEditingRange != null) {
-      __result['linkedEditingRange'] = linkedEditingRange?.toJson();
+    if (hover != null) {
+      __result['hover'] = hover?.toJson();
     }
-    if (callHierarchy != null) {
-      __result['callHierarchy'] = callHierarchy?.toJson();
-    }
-    if (semanticTokens != null) {
-      __result['semanticTokens'] = semanticTokens?.toJson();
-    }
-    if (moniker != null) {
-      __result['moniker'] = moniker?.toJson();
-    }
-    if (typeHierarchy != null) {
-      __result['typeHierarchy'] = typeHierarchy;
-    }
-    if (inlineValue != null) {
-      __result['inlineValue'] = inlineValue?.toJson();
+    if (implementation != null) {
+      __result['implementation'] = implementation?.toJson();
     }
     if (inlayHint != null) {
       __result['inlayHint'] = inlayHint?.toJson();
     }
-    if (diagnostic != null) {
-      __result['diagnostic'] = diagnostic?.toJson();
+    if (inlineValue != null) {
+      __result['inlineValue'] = inlineValue?.toJson();
+    }
+    if (linkedEditingRange != null) {
+      __result['linkedEditingRange'] = linkedEditingRange?.toJson();
+    }
+    if (moniker != null) {
+      __result['moniker'] = moniker?.toJson();
+    }
+    if (onTypeFormatting != null) {
+      __result['onTypeFormatting'] = onTypeFormatting?.toJson();
+    }
+    if (publishDiagnostics != null) {
+      __result['publishDiagnostics'] = publishDiagnostics?.toJson();
+    }
+    if (rangeFormatting != null) {
+      __result['rangeFormatting'] = rangeFormatting?.toJson();
+    }
+    if (references != null) {
+      __result['references'] = references?.toJson();
+    }
+    if (rename != null) {
+      __result['rename'] = rename?.toJson();
+    }
+    if (selectionRange != null) {
+      __result['selectionRange'] = selectionRange?.toJson();
+    }
+    if (semanticTokens != null) {
+      __result['semanticTokens'] = semanticTokens?.toJson();
+    }
+    if (signatureHelp != null) {
+      __result['signatureHelp'] = signatureHelp?.toJson();
+    }
+    if (synchronization != null) {
+      __result['synchronization'] = synchronization?.toJson();
+    }
+    if (typeDefinition != null) {
+      __result['typeDefinition'] = typeDefinition?.toJson();
+    }
+    if (typeHierarchy != null) {
+      __result['typeHierarchy'] = typeHierarchy?.toJson();
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('synchronization');
+      reporter.push('callHierarchy');
       try {
-        final synchronization = obj['synchronization'];
-        if (synchronization != null &&
-            !(TextDocumentSyncClientCapabilities.canParse(
-                synchronization, reporter))) {
-          reporter.reportError(
-              'must be of type TextDocumentSyncClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('completion');
-      try {
-        final completion = obj['completion'];
-        if (completion != null &&
-            !(CompletionClientCapabilities.canParse(completion, reporter))) {
-          reporter.reportError('must be of type CompletionClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('hover');
-      try {
-        final hover = obj['hover'];
-        if (hover != null &&
-            !(HoverClientCapabilities.canParse(hover, reporter))) {
-          reporter.reportError('must be of type HoverClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('signatureHelp');
-      try {
-        final signatureHelp = obj['signatureHelp'];
-        if (signatureHelp != null &&
-            !(SignatureHelpClientCapabilities.canParse(
-                signatureHelp, reporter))) {
+        final callHierarchy = obj['callHierarchy'];
+        if (callHierarchy != null &&
+            !(CallHierarchyClientCapabilities.canParse(
+                callHierarchy, reporter))) {
           reporter
-              .reportError('must be of type SignatureHelpClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('declaration');
-      try {
-        final declaration = obj['declaration'];
-        if (declaration != null &&
-            !(DeclarationClientCapabilities.canParse(declaration, reporter))) {
-          reporter.reportError('must be of type DeclarationClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('definition');
-      try {
-        final definition = obj['definition'];
-        if (definition != null &&
-            !(DefinitionClientCapabilities.canParse(definition, reporter))) {
-          reporter.reportError('must be of type DefinitionClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('typeDefinition');
-      try {
-        final typeDefinition = obj['typeDefinition'];
-        if (typeDefinition != null &&
-            !(TypeDefinitionClientCapabilities.canParse(
-                typeDefinition, reporter))) {
-          reporter
-              .reportError('must be of type TypeDefinitionClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('implementation');
-      try {
-        final implementation = obj['implementation'];
-        if (implementation != null &&
-            !(ImplementationClientCapabilities.canParse(
-                implementation, reporter))) {
-          reporter
-              .reportError('must be of type ImplementationClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('references');
-      try {
-        final references = obj['references'];
-        if (references != null &&
-            !(ReferenceClientCapabilities.canParse(references, reporter))) {
-          reporter.reportError('must be of type ReferenceClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentHighlight');
-      try {
-        final documentHighlight = obj['documentHighlight'];
-        if (documentHighlight != null &&
-            !(DocumentHighlightClientCapabilities.canParse(
-                documentHighlight, reporter))) {
-          reporter.reportError(
-              'must be of type DocumentHighlightClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('documentSymbol');
-      try {
-        final documentSymbol = obj['documentSymbol'];
-        if (documentSymbol != null &&
-            !(DocumentSymbolClientCapabilities.canParse(
-                documentSymbol, reporter))) {
-          reporter
-              .reportError('must be of type DocumentSymbolClientCapabilities');
+              .reportError('must be of type CallHierarchyClientCapabilities');
           return false;
         }
       } finally {
@@ -39180,19 +38401,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentLink');
-      try {
-        final documentLink = obj['documentLink'];
-        if (documentLink != null &&
-            !(DocumentLinkClientCapabilities.canParse(
-                documentLink, reporter))) {
-          reporter
-              .reportError('must be of type DocumentLinkClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('colorProvider');
       try {
         final colorProvider = obj['colorProvider'];
@@ -39206,64 +38414,84 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('formatting');
+      reporter.push('completion');
       try {
-        final formatting = obj['formatting'];
-        if (formatting != null &&
-            !(DocumentFormattingClientCapabilities.canParse(
-                formatting, reporter))) {
-          reporter.reportError(
-              'must be of type DocumentFormattingClientCapabilities');
+        final completion = obj['completion'];
+        if (completion != null &&
+            !(CompletionClientCapabilities.canParse(completion, reporter))) {
+          reporter.reportError('must be of type CompletionClientCapabilities');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('rangeFormatting');
+      reporter.push('declaration');
       try {
-        final rangeFormatting = obj['rangeFormatting'];
-        if (rangeFormatting != null &&
-            !(DocumentRangeFormattingClientCapabilities.canParse(
-                rangeFormatting, reporter))) {
-          reporter.reportError(
-              'must be of type DocumentRangeFormattingClientCapabilities');
+        final declaration = obj['declaration'];
+        if (declaration != null &&
+            !(DeclarationClientCapabilities.canParse(declaration, reporter))) {
+          reporter.reportError('must be of type DeclarationClientCapabilities');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('onTypeFormatting');
+      reporter.push('definition');
       try {
-        final onTypeFormatting = obj['onTypeFormatting'];
-        if (onTypeFormatting != null &&
-            !(DocumentOnTypeFormattingClientCapabilities.canParse(
-                onTypeFormatting, reporter))) {
-          reporter.reportError(
-              'must be of type DocumentOnTypeFormattingClientCapabilities');
+        final definition = obj['definition'];
+        if (definition != null &&
+            !(DefinitionClientCapabilities.canParse(definition, reporter))) {
+          reporter.reportError('must be of type DefinitionClientCapabilities');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('rename');
+      reporter.push('diagnostic');
       try {
-        final rename = obj['rename'];
-        if (rename != null &&
-            !(RenameClientCapabilities.canParse(rename, reporter))) {
-          reporter.reportError('must be of type RenameClientCapabilities');
+        final diagnostic = obj['diagnostic'];
+        if (diagnostic != null &&
+            !(DiagnosticClientCapabilities.canParse(diagnostic, reporter))) {
+          reporter.reportError('must be of type DiagnosticClientCapabilities');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('publishDiagnostics');
+      reporter.push('documentHighlight');
       try {
-        final publishDiagnostics = obj['publishDiagnostics'];
-        if (publishDiagnostics != null &&
-            !(PublishDiagnosticsClientCapabilities.canParse(
-                publishDiagnostics, reporter))) {
+        final documentHighlight = obj['documentHighlight'];
+        if (documentHighlight != null &&
+            !(DocumentHighlightClientCapabilities.canParse(
+                documentHighlight, reporter))) {
           reporter.reportError(
-              'must be of type PublishDiagnosticsClientCapabilities');
+              'must be of type DocumentHighlightClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentLink');
+      try {
+        final documentLink = obj['documentLink'];
+        if (documentLink != null &&
+            !(DocumentLinkClientCapabilities.canParse(
+                documentLink, reporter))) {
+          reporter
+              .reportError('must be of type DocumentLinkClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentSymbol');
+      try {
+        final documentSymbol = obj['documentSymbol'];
+        if (documentSymbol != null &&
+            !(DocumentSymbolClientCapabilities.canParse(
+                documentSymbol, reporter))) {
+          reporter
+              .reportError('must be of type DocumentSymbolClientCapabilities');
           return false;
         }
       } finally {
@@ -39282,14 +38510,60 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('selectionRange');
+      reporter.push('formatting');
       try {
-        final selectionRange = obj['selectionRange'];
-        if (selectionRange != null &&
-            !(SelectionRangeClientCapabilities.canParse(
-                selectionRange, reporter))) {
+        final formatting = obj['formatting'];
+        if (formatting != null &&
+            !(DocumentFormattingClientCapabilities.canParse(
+                formatting, reporter))) {
+          reporter.reportError(
+              'must be of type DocumentFormattingClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('hover');
+      try {
+        final hover = obj['hover'];
+        if (hover != null &&
+            !(HoverClientCapabilities.canParse(hover, reporter))) {
+          reporter.reportError('must be of type HoverClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('implementation');
+      try {
+        final implementation = obj['implementation'];
+        if (implementation != null &&
+            !(ImplementationClientCapabilities.canParse(
+                implementation, reporter))) {
           reporter
-              .reportError('must be of type SelectionRangeClientCapabilities');
+              .reportError('must be of type ImplementationClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlayHint');
+      try {
+        final inlayHint = obj['inlayHint'];
+        if (inlayHint != null &&
+            !(InlayHintClientCapabilities.canParse(inlayHint, reporter))) {
+          reporter.reportError('must be of type InlayHintClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlineValue');
+      try {
+        final inlineValue = obj['inlineValue'];
+        if (inlineValue != null &&
+            !(InlineValueClientCapabilities.canParse(inlineValue, reporter))) {
+          reporter.reportError('must be of type InlineValueClientCapabilities');
           return false;
         }
       } finally {
@@ -39308,14 +38582,86 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('callHierarchy');
+      reporter.push('moniker');
       try {
-        final callHierarchy = obj['callHierarchy'];
-        if (callHierarchy != null &&
-            !(CallHierarchyClientCapabilities.canParse(
-                callHierarchy, reporter))) {
+        final moniker = obj['moniker'];
+        if (moniker != null &&
+            !(MonikerClientCapabilities.canParse(moniker, reporter))) {
+          reporter.reportError('must be of type MonikerClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('onTypeFormatting');
+      try {
+        final onTypeFormatting = obj['onTypeFormatting'];
+        if (onTypeFormatting != null &&
+            !(DocumentOnTypeFormattingClientCapabilities.canParse(
+                onTypeFormatting, reporter))) {
+          reporter.reportError(
+              'must be of type DocumentOnTypeFormattingClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('publishDiagnostics');
+      try {
+        final publishDiagnostics = obj['publishDiagnostics'];
+        if (publishDiagnostics != null &&
+            !(PublishDiagnosticsClientCapabilities.canParse(
+                publishDiagnostics, reporter))) {
+          reporter.reportError(
+              'must be of type PublishDiagnosticsClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('rangeFormatting');
+      try {
+        final rangeFormatting = obj['rangeFormatting'];
+        if (rangeFormatting != null &&
+            !(DocumentRangeFormattingClientCapabilities.canParse(
+                rangeFormatting, reporter))) {
+          reporter.reportError(
+              'must be of type DocumentRangeFormattingClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('references');
+      try {
+        final references = obj['references'];
+        if (references != null &&
+            !(ReferenceClientCapabilities.canParse(references, reporter))) {
+          reporter.reportError('must be of type ReferenceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('rename');
+      try {
+        final rename = obj['rename'];
+        if (rename != null &&
+            !(RenameClientCapabilities.canParse(rename, reporter))) {
+          reporter.reportError('must be of type RenameClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('selectionRange');
+      try {
+        final selectionRange = obj['selectionRange'];
+        if (selectionRange != null &&
+            !(SelectionRangeClientCapabilities.canParse(
+                selectionRange, reporter))) {
           reporter
-              .reportError('must be of type CallHierarchyClientCapabilities');
+              .reportError('must be of type SelectionRangeClientCapabilities');
           return false;
         }
       } finally {
@@ -39334,12 +38680,40 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('moniker');
+      reporter.push('signatureHelp');
       try {
-        final moniker = obj['moniker'];
-        if (moniker != null &&
-            !(MonikerClientCapabilities.canParse(moniker, reporter))) {
-          reporter.reportError('must be of type MonikerClientCapabilities');
+        final signatureHelp = obj['signatureHelp'];
+        if (signatureHelp != null &&
+            !(SignatureHelpClientCapabilities.canParse(
+                signatureHelp, reporter))) {
+          reporter
+              .reportError('must be of type SignatureHelpClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('synchronization');
+      try {
+        final synchronization = obj['synchronization'];
+        if (synchronization != null &&
+            !(TextDocumentSyncClientCapabilities.canParse(
+                synchronization, reporter))) {
+          reporter.reportError(
+              'must be of type TextDocumentSyncClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('typeDefinition');
+      try {
+        final typeDefinition = obj['typeDefinition'];
+        if (typeDefinition != null &&
+            !(TypeDefinitionClientCapabilities.canParse(
+                typeDefinition, reporter))) {
+          reporter
+              .reportError('must be of type TypeDefinitionClientCapabilities');
           return false;
         }
       } finally {
@@ -39358,39 +38732,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('inlineValue');
-      try {
-        final inlineValue = obj['inlineValue'];
-        if (inlineValue != null &&
-            !(InlineValueClientCapabilities.canParse(inlineValue, reporter))) {
-          reporter.reportError('must be of type InlineValueClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('inlayHint');
-      try {
-        final inlayHint = obj['inlayHint'];
-        if (inlayHint != null &&
-            !(InlayHintClientCapabilities.canParse(inlayHint, reporter))) {
-          reporter.reportError('must be of type InlayHintClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('diagnostic');
-      try {
-        final diagnostic = obj['diagnostic'];
-        if (diagnostic != null &&
-            !(DiagnosticClientCapabilities.canParse(diagnostic, reporter))) {
-          reporter.reportError('must be of type DiagnosticClientCapabilities');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type TextDocumentClientCapabilities');
@@ -39402,36 +38743,36 @@
   bool operator ==(Object other) {
     if (other is TextDocumentClientCapabilities &&
         other.runtimeType == TextDocumentClientCapabilities) {
-      return synchronization == other.synchronization &&
-          completion == other.completion &&
-          hover == other.hover &&
-          signatureHelp == other.signatureHelp &&
-          declaration == other.declaration &&
-          definition == other.definition &&
-          typeDefinition == other.typeDefinition &&
-          implementation == other.implementation &&
-          references == other.references &&
-          documentHighlight == other.documentHighlight &&
-          documentSymbol == other.documentSymbol &&
+      return callHierarchy == other.callHierarchy &&
           codeAction == other.codeAction &&
           codeLens == other.codeLens &&
-          documentLink == other.documentLink &&
           colorProvider == other.colorProvider &&
-          formatting == other.formatting &&
-          rangeFormatting == other.rangeFormatting &&
-          onTypeFormatting == other.onTypeFormatting &&
-          rename == other.rename &&
-          publishDiagnostics == other.publishDiagnostics &&
-          foldingRange == other.foldingRange &&
-          selectionRange == other.selectionRange &&
-          linkedEditingRange == other.linkedEditingRange &&
-          callHierarchy == other.callHierarchy &&
-          semanticTokens == other.semanticTokens &&
-          moniker == other.moniker &&
-          typeHierarchy == other.typeHierarchy &&
-          inlineValue == other.inlineValue &&
-          inlayHint == other.inlayHint &&
+          completion == other.completion &&
+          declaration == other.declaration &&
+          definition == other.definition &&
           diagnostic == other.diagnostic &&
+          documentHighlight == other.documentHighlight &&
+          documentLink == other.documentLink &&
+          documentSymbol == other.documentSymbol &&
+          foldingRange == other.foldingRange &&
+          formatting == other.formatting &&
+          hover == other.hover &&
+          implementation == other.implementation &&
+          inlayHint == other.inlayHint &&
+          inlineValue == other.inlineValue &&
+          linkedEditingRange == other.linkedEditingRange &&
+          moniker == other.moniker &&
+          onTypeFormatting == other.onTypeFormatting &&
+          publishDiagnostics == other.publishDiagnostics &&
+          rangeFormatting == other.rangeFormatting &&
+          references == other.references &&
+          rename == other.rename &&
+          selectionRange == other.selectionRange &&
+          semanticTokens == other.semanticTokens &&
+          signatureHelp == other.signatureHelp &&
+          synchronization == other.synchronization &&
+          typeDefinition == other.typeDefinition &&
+          typeHierarchy == other.typeHierarchy &&
           true;
     }
     return false;
@@ -39439,36 +38780,36 @@
 
   @override
   int get hashCode => Object.hashAll([
-        synchronization,
-        completion,
-        hover,
-        signatureHelp,
-        declaration,
-        definition,
-        typeDefinition,
-        implementation,
-        references,
-        documentHighlight,
-        documentSymbol,
+        callHierarchy,
         codeAction,
         codeLens,
-        documentLink,
         colorProvider,
-        formatting,
-        rangeFormatting,
-        onTypeFormatting,
-        rename,
-        publishDiagnostics,
-        foldingRange,
-        selectionRange,
-        linkedEditingRange,
-        callHierarchy,
-        semanticTokens,
-        moniker,
-        typeHierarchy,
-        inlineValue,
-        inlayHint,
+        completion,
+        declaration,
+        definition,
         diagnostic,
+        documentHighlight,
+        documentLink,
+        documentSymbol,
+        foldingRange,
+        formatting,
+        hover,
+        implementation,
+        inlayHint,
+        inlineValue,
+        linkedEditingRange,
+        moniker,
+        onTypeFormatting,
+        publishDiagnostics,
+        rangeFormatting,
+        references,
+        rename,
+        selectionRange,
+        semanticTokens,
+        signatureHelp,
+        synchronization,
+        typeDefinition,
+        typeHierarchy,
       ]);
 
   @override
@@ -39674,49 +39015,72 @@
   );
 
   TextDocumentEdit({
-    required this.textDocument,
     required this.edits,
+    required this.textDocument,
   });
   static TextDocumentEdit fromJson(Map<String, Object?> json) {
+    final editsJson = json['edits'];
+    final edits = (editsJson as List<Object?>)
+        .map((item) => AnnotatedTextEdit.canParse(item, nullLspJsonReporter)
+            ? Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>.t1(
+                AnnotatedTextEdit.fromJson(item as Map<String, Object?>))
+            : (SnippetTextEdit.canParse(item, nullLspJsonReporter)
+                ? Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>.t2(
+                    SnippetTextEdit.fromJson(item as Map<String, Object?>))
+                : (TextEdit.canParse(item, nullLspJsonReporter)
+                    ? Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>.t3(
+                        TextEdit.fromJson(item as Map<String, Object?>))
+                    : (throw '''$item was not one of (AnnotatedTextEdit, SnippetTextEdit, TextEdit)'''))))
+        .toList();
     final textDocumentJson = json['textDocument'];
     final textDocument = OptionalVersionedTextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final editsJson = json['edits'];
-    final edits = (editsJson as List<Object?>)
-        .map((item) => SnippetTextEdit.canParse(item, nullLspJsonReporter)
-            ? Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t1(
-                SnippetTextEdit.fromJson(item as Map<String, Object?>))
-            : (AnnotatedTextEdit.canParse(item, nullLspJsonReporter)
-                ? Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t2(
-                    AnnotatedTextEdit.fromJson(item as Map<String, Object?>))
-                : (TextEdit.canParse(item, nullLspJsonReporter)
-                    ? Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t3(
-                        TextEdit.fromJson(item as Map<String, Object?>))
-                    : (throw '''$item was not one of (SnippetTextEdit, AnnotatedTextEdit, TextEdit)'''))))
-        .toList();
     return TextDocumentEdit(
-      textDocument: textDocument,
       edits: edits,
+      textDocument: textDocument,
     );
   }
 
   /// The edits to be applied.
   ///  @since 3.16.0 - support for AnnotatedTextEdit. This is guarded by the
   /// client capability `workspace.workspaceEdit.changeAnnotationSupport`
-  final List<Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>> edits;
+  final List<Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>> edits;
 
   /// The text document to change.
   final OptionalVersionedTextDocumentIdentifier textDocument;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['edits'] = edits;
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('edits');
+      try {
+        if (!obj.containsKey('edits')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final edits = obj['edits'];
+        if (edits == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((edits is List<Object?> &&
+            (edits.every((item) =>
+                (AnnotatedTextEdit.canParse(item, reporter) ||
+                    SnippetTextEdit.canParse(item, reporter) ||
+                    TextEdit.canParse(item, reporter))))))) {
+          reporter.reportError(
+              'must be of type List<Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -39737,28 +39101,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('edits');
-      try {
-        if (!obj.containsKey('edits')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final edits = obj['edits'];
-        if (edits == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!((edits is List<Object?> &&
-            (edits.every((item) => (SnippetTextEdit.canParse(item, reporter) ||
-                AnnotatedTextEdit.canParse(item, reporter) ||
-                TextEdit.canParse(item, reporter))))))) {
-          reporter.reportError(
-              'must be of type List<Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type TextDocumentEdit');
@@ -39769,14 +39111,14 @@
   @override
   bool operator ==(Object other) {
     if (other is TextDocumentEdit && other.runtimeType == TextDocumentEdit) {
-      return textDocument == other.textDocument &&
-          listEqual(
+      return listEqual(
               edits,
               other.edits,
-              (Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit> a,
-                      Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>
+              (Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit> a,
+                      Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>
                           b) =>
                   a == b) &&
+          textDocument == other.textDocument &&
           true;
     }
     return false;
@@ -39784,8 +39126,130 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         lspHashCode(edits),
+        textDocument,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentFilter implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    TextDocumentFilter.canParse,
+    TextDocumentFilter.fromJson,
+  );
+
+  TextDocumentFilter({
+    this.language,
+    this.pattern,
+    this.scheme,
+  });
+  static TextDocumentFilter fromJson(Map<String, Object?> json) {
+    final languageJson = json['language'];
+    final language = languageJson as String?;
+    final patternJson = json['pattern'];
+    final pattern = patternJson as String?;
+    final schemeJson = json['scheme'];
+    final scheme = schemeJson as String?;
+    return TextDocumentFilter(
+      language: language,
+      pattern: pattern,
+      scheme: scheme,
+    );
+  }
+
+  /// A language id, like `typescript`.
+  final String? language;
+
+  /// A glob pattern, like `*.{ts,js}`.
+  ///
+  /// Glob patterns can have the following syntax:
+  /// - `*` to match one or more characters in a path segment
+  /// - `?` to match on one character in a path segment
+  /// - `**` to match any number of path segments, including none
+  /// - `{}` to group sub patterns into an OR expression. (e.g. `**​/*.{ts,js}`
+  ///   matches all TypeScript and JavaScript files)
+  /// - `[]` to declare a range of characters to match in a path segment
+  ///   (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …)
+  /// - `[!...]` to negate a range of characters to match in a path segment
+  ///   (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but
+  ///   not `example.0`)
+  final String? pattern;
+
+  /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+  final String? scheme;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (language != null) {
+      __result['language'] = language;
+    }
+    if (pattern != null) {
+      __result['pattern'] = pattern;
+    }
+    if (scheme != null) {
+      __result['scheme'] = scheme;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('language');
+      try {
+        final language = obj['language'];
+        if (language != null && !(language is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('pattern');
+      try {
+        final pattern = obj['pattern'];
+        if (pattern != null && !(pattern is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('scheme');
+      try {
+        final scheme = obj['scheme'];
+        if (scheme != null && !(scheme is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type TextDocumentFilter');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is TextDocumentFilter &&
+        other.runtimeType == TextDocumentFilter) {
+      return language == other.language &&
+          pattern == other.pattern &&
+          scheme == other.scheme &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        language,
+        pattern,
+        scheme,
       );
 
   @override
@@ -39875,25 +39339,25 @@
   );
 
   TextDocumentItem({
-    required this.uri,
     required this.languageId,
-    required this.version,
     required this.text,
+    required this.uri,
+    required this.version,
   });
   static TextDocumentItem fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final languageIdJson = json['languageId'];
     final languageId = languageIdJson as String;
-    final versionJson = json['version'];
-    final version = versionJson as int;
     final textJson = json['text'];
     final text = textJson as String;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int;
     return TextDocumentItem(
-      uri: uri,
       languageId: languageId,
-      version: version,
       text: text,
+      uri: uri,
+      version: version,
     );
   }
 
@@ -39912,33 +39376,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
     __result['languageId'] = languageId;
-    __result['version'] = version;
     __result['text'] = text;
+    __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final uri = obj['uri'];
-        if (uri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('languageId');
       try {
         if (!obj.containsKey('languageId')) {
@@ -39957,6 +39403,42 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('text');
+      try {
+        if (!obj.containsKey('text')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final text = obj['text'];
+        if (text == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(text is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('version');
       try {
         if (!obj.containsKey('version')) {
@@ -39975,24 +39457,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('text');
-      try {
-        if (!obj.containsKey('text')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final text = obj['text'];
-        if (text == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(text is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type TextDocumentItem');
@@ -40003,10 +39467,10 @@
   @override
   bool operator ==(Object other) {
     if (other is TextDocumentItem && other.runtimeType == TextDocumentItem) {
-      return uri == other.uri &&
-          languageId == other.languageId &&
-          version == other.version &&
+      return languageId == other.languageId &&
           text == other.text &&
+          uri == other.uri &&
+          version == other.version &&
           true;
     }
     return false;
@@ -40014,10 +39478,10 @@
 
   @override
   int get hashCode => Object.hash(
-        uri,
         languageId,
-        version,
         text,
+        uri,
+        version,
       );
 
   @override
@@ -40031,8 +39495,8 @@
   );
 
   TextDocumentPositionParams({
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
   });
   static TextDocumentPositionParams fromJson(Map<String, Object?> json) {
     if (DeclarationParams.canParse(json, nullLspJsonReporter)) {
@@ -40080,14 +39544,14 @@
     if (LinkedEditingRangeParams.canParse(json, nullLspJsonReporter)) {
       return LinkedEditingRangeParams.fromJson(json);
     }
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     return TextDocumentPositionParams(
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
     );
   }
 
@@ -40099,31 +39563,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -40142,6 +39588,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type TextDocumentPositionParams');
@@ -40153,8 +39617,8 @@
   bool operator ==(Object other) {
     if (other is TextDocumentPositionParams &&
         other.runtimeType == TextDocumentPositionParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
+      return position == other.position &&
+          textDocument == other.textDocument &&
           true;
     }
     return false;
@@ -40162,8 +39626,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         position,
+        textDocument,
       );
 
   @override
@@ -40280,7 +39744,8 @@
     }
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
     return TextDocumentRegistrationOptions(
       documentSelector: documentSelector,
@@ -40289,7 +39754,7 @@
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
@@ -40309,8 +39774,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -40328,7 +39793,7 @@
     if (other is TextDocumentRegistrationOptions &&
         other.runtimeType == TextDocumentRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           true;
     }
     return false;
@@ -40382,51 +39847,42 @@
   );
 
   TextDocumentSaveRegistrationOptions({
-    this.includeText,
     this.documentSelector,
+    this.includeText,
   });
   static TextDocumentSaveRegistrationOptions fromJson(
       Map<String, Object?> json) {
-    final includeTextJson = json['includeText'];
-    final includeText = includeTextJson as bool?;
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
+    final includeTextJson = json['includeText'];
+    final includeText = includeTextJson as bool?;
     return TextDocumentSaveRegistrationOptions(
-      includeText: includeText,
       documentSelector: documentSelector,
+      includeText: includeText,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The client is supposed to include the content on save.
   final bool? includeText;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    __result['documentSelector'] = documentSelector;
     if (includeText != null) {
       __result['includeText'] = includeText;
     }
-    __result['documentSelector'] = documentSelector;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('includeText');
-      try {
-        final includeText = obj['includeText'];
-        if (includeText != null && !(includeText is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -40437,8 +39893,18 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('includeText');
+      try {
+        final includeText = obj['includeText'];
+        if (includeText != null && !(includeText is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -40456,9 +39922,9 @@
   bool operator ==(Object other) {
     if (other is TextDocumentSaveRegistrationOptions &&
         other.runtimeType == TextDocumentSaveRegistrationOptions) {
-      return includeText == other.includeText &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+      return listEqual(documentSelector, other.documentSelector,
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
+          includeText == other.includeText &&
           true;
     }
     return false;
@@ -40466,8 +39932,8 @@
 
   @override
   int get hashCode => Object.hash(
-        includeText,
         lspHashCode(documentSelector),
+        includeText,
       );
 
   @override
@@ -40481,26 +39947,26 @@
   );
 
   TextDocumentSyncClientCapabilities({
+    this.didSave,
     this.dynamicRegistration,
     this.willSave,
     this.willSaveWaitUntil,
-    this.didSave,
   });
   static TextDocumentSyncClientCapabilities fromJson(
       Map<String, Object?> json) {
+    final didSaveJson = json['didSave'];
+    final didSave = didSaveJson as bool?;
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
     final willSaveJson = json['willSave'];
     final willSave = willSaveJson as bool?;
     final willSaveWaitUntilJson = json['willSaveWaitUntil'];
     final willSaveWaitUntil = willSaveWaitUntilJson as bool?;
-    final didSaveJson = json['didSave'];
-    final didSave = didSaveJson as bool?;
     return TextDocumentSyncClientCapabilities(
+      didSave: didSave,
       dynamicRegistration: dynamicRegistration,
       willSave: willSave,
       willSaveWaitUntil: willSaveWaitUntil,
-      didSave: didSave,
     );
   }
 
@@ -40520,6 +39986,9 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (didSave != null) {
+      __result['didSave'] = didSave;
+    }
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
@@ -40529,14 +39998,21 @@
     if (willSaveWaitUntil != null) {
       __result['willSaveWaitUntil'] = willSaveWaitUntil;
     }
-    if (didSave != null) {
-      __result['didSave'] = didSave;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('didSave');
+      try {
+        final didSave = obj['didSave'];
+        if (didSave != null && !(didSave is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('dynamicRegistration');
       try {
         final dynamicRegistration = obj['dynamicRegistration'];
@@ -40567,16 +40043,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('didSave');
-      try {
-        final didSave = obj['didSave'];
-        if (didSave != null && !(didSave is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter
@@ -40589,10 +40055,10 @@
   bool operator ==(Object other) {
     if (other is TextDocumentSyncClientCapabilities &&
         other.runtimeType == TextDocumentSyncClientCapabilities) {
-      return dynamicRegistration == other.dynamicRegistration &&
+      return didSave == other.didSave &&
+          dynamicRegistration == other.dynamicRegistration &&
           willSave == other.willSave &&
           willSaveWaitUntil == other.willSaveWaitUntil &&
-          didSave == other.didSave &&
           true;
     }
     return false;
@@ -40600,10 +40066,10 @@
 
   @override
   int get hashCode => Object.hash(
+        didSave,
         dynamicRegistration,
         willSave,
         willSaveWaitUntil,
-        didSave,
       );
 
   @override
@@ -40650,23 +40116,19 @@
   );
 
   TextDocumentSyncOptions({
-    this.openClose,
     this.change,
+    this.openClose,
+    this.save,
     this.willSave,
     this.willSaveWaitUntil,
-    this.save,
   });
   static TextDocumentSyncOptions fromJson(Map<String, Object?> json) {
-    final openCloseJson = json['openClose'];
-    final openClose = openCloseJson as bool?;
     final changeJson = json['change'];
     final change = changeJson != null
         ? TextDocumentSyncKind.fromJson(changeJson as int)
         : null;
-    final willSaveJson = json['willSave'];
-    final willSave = willSaveJson as bool?;
-    final willSaveWaitUntilJson = json['willSaveWaitUntil'];
-    final willSaveWaitUntil = willSaveWaitUntilJson as bool?;
+    final openCloseJson = json['openClose'];
+    final openClose = openCloseJson as bool?;
     final saveJson = json['save'];
     final save = saveJson == null
         ? null
@@ -40676,12 +40138,16 @@
                 ? Either2<bool, SaveOptions>.t2(
                     SaveOptions.fromJson(saveJson as Map<String, Object?>))
                 : (throw '''$saveJson was not one of (bool, SaveOptions)''')));
+    final willSaveJson = json['willSave'];
+    final willSave = willSaveJson as bool?;
+    final willSaveWaitUntilJson = json['willSaveWaitUntil'];
+    final willSaveWaitUntil = willSaveWaitUntilJson as bool?;
     return TextDocumentSyncOptions(
-      openClose: openClose,
       change: change,
+      openClose: openClose,
+      save: save,
       willSave: willSave,
       willSaveWaitUntil: willSaveWaitUntil,
-      save: save,
     );
   }
 
@@ -40709,11 +40175,14 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (change != null) {
+      __result['change'] = change?.toJson();
+    }
     if (openClose != null) {
       __result['openClose'] = openClose;
     }
-    if (change != null) {
-      __result['change'] = change?.toJson();
+    if (save != null) {
+      __result['save'] = save;
     }
     if (willSave != null) {
       __result['willSave'] = willSave;
@@ -40721,14 +40190,22 @@
     if (willSaveWaitUntil != null) {
       __result['willSaveWaitUntil'] = willSaveWaitUntil;
     }
-    if (save != null) {
-      __result['save'] = save;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('change');
+      try {
+        final change = obj['change'];
+        if (change != null &&
+            !(TextDocumentSyncKind.canParse(change, reporter))) {
+          reporter.reportError('must be of type TextDocumentSyncKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('openClose');
       try {
         final openClose = obj['openClose'];
@@ -40739,12 +40216,12 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('change');
+      reporter.push('save');
       try {
-        final change = obj['change'];
-        if (change != null &&
-            !(TextDocumentSyncKind.canParse(change, reporter))) {
-          reporter.reportError('must be of type TextDocumentSyncKind');
+        final save = obj['save'];
+        if (save != null &&
+            !((save is bool || SaveOptions.canParse(save, reporter)))) {
+          reporter.reportError('must be of type Either2<bool, SaveOptions>');
           return false;
         }
       } finally {
@@ -40770,17 +40247,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('save');
-      try {
-        final save = obj['save'];
-        if (save != null &&
-            !((save is bool || SaveOptions.canParse(save, reporter)))) {
-          reporter.reportError('must be of type Either2<bool, SaveOptions>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type TextDocumentSyncOptions');
@@ -40792,11 +40258,11 @@
   bool operator ==(Object other) {
     if (other is TextDocumentSyncOptions &&
         other.runtimeType == TextDocumentSyncOptions) {
-      return openClose == other.openClose &&
-          change == other.change &&
+      return change == other.change &&
+          openClose == other.openClose &&
+          save == other.save &&
           willSave == other.willSave &&
           willSaveWaitUntil == other.willSaveWaitUntil &&
-          save == other.save &&
           true;
     }
     return false;
@@ -40804,11 +40270,11 @@
 
   @override
   int get hashCode => Object.hash(
-        openClose,
         change,
+        openClose,
+        save,
         willSave,
         willSaveWaitUntil,
-        save,
       );
 
   @override
@@ -40822,8 +40288,8 @@
   );
 
   TextEdit({
-    required this.range,
     required this.newText,
+    required this.range,
   });
   static TextEdit fromJson(Map<String, Object?> json) {
     if (AnnotatedTextEdit.canParse(json, nullLspJsonReporter)) {
@@ -40832,13 +40298,13 @@
     if (SnippetTextEdit.canParse(json, nullLspJsonReporter)) {
       return SnippetTextEdit.fromJson(json);
     }
-    final rangeJson = json['range'];
-    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final newTextJson = json['newText'];
     final newText = newTextJson as String;
+    final rangeJson = json['range'];
+    final range = Range.fromJson(rangeJson as Map<String, Object?>);
     return TextEdit(
-      range: range,
       newText: newText,
+      range: range,
     );
   }
 
@@ -40851,31 +40317,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['range'] = range.toJson();
     __result['newText'] = newText;
+    __result['range'] = range.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('range');
-      try {
-        if (!obj.containsKey('range')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final range = obj['range'];
-        if (range == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Range.canParse(range, reporter))) {
-          reporter.reportError('must be of type Range');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('newText');
       try {
         if (!obj.containsKey('newText')) {
@@ -40894,6 +40342,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final range = obj['range'];
+        if (range == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(range, reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type TextEdit');
@@ -40904,15 +40370,15 @@
   @override
   bool operator ==(Object other) {
     if (other is TextEdit && other.runtimeType == TextEdit) {
-      return range == other.range && newText == other.newText && true;
+      return newText == other.newText && range == other.range && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        range,
         newText,
+        range,
       );
 
   @override
@@ -41110,25 +40576,12 @@
   );
 
   TypeDefinitionParams({
-    required this.textDocument,
-    required this.position,
-    this.workDoneToken,
     this.partialResultToken,
+    required this.position,
+    required this.textDocument,
+    this.workDoneToken,
   });
   static TypeDefinitionParams fromJson(Map<String, Object?> json) {
-    final textDocumentJson = json['textDocument'];
-    final textDocument = TextDocumentIdentifier.fromJson(
-        textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -41137,11 +40590,24 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
+    final textDocumentJson = json['textDocument'];
+    final textDocument = TextDocumentIdentifier.fromJson(
+        textDocumentJson as Map<String, Object?>);
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return TypeDefinitionParams(
-      textDocument: textDocument,
-      position: position,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      position: position,
+      textDocument: textDocument,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -41160,32 +40626,25 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
-    __result['position'] = position.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
+      reporter.push('partialResultToken');
       try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
@@ -41209,22 +40668,29 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('textDocument');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -41242,10 +40708,10 @@
   bool operator ==(Object other) {
     if (other is TypeDefinitionParams &&
         other.runtimeType == TypeDefinitionParams) {
-      return textDocument == other.textDocument &&
+      return partialResultToken == other.partialResultToken &&
           position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -41253,10 +40719,10 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
-        position,
-        workDoneToken,
         partialResultToken,
+        position,
+        textDocument,
+        workDoneToken,
       );
 
   @override
@@ -41276,28 +40742,29 @@
 
   TypeDefinitionRegistrationOptions({
     this.documentSelector,
-    this.workDoneProgress,
     this.id,
+    this.workDoneProgress,
   });
   static TypeDefinitionRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return TypeDefinitionRegistrationOptions(
       documentSelector: documentSelector,
-      workDoneProgress: workDoneProgress,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -41307,12 +40774,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -41328,18 +40795,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -41355,6 +40812,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type TypeDefinitionRegistrationOptions');
@@ -41367,9 +40834,9 @@
     if (other is TypeDefinitionRegistrationOptions &&
         other.runtimeType == TypeDefinitionRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          workDoneProgress == other.workDoneProgress &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -41378,8 +40845,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        workDoneProgress,
         id,
+        workDoneProgress,
       );
 
   @override
@@ -41459,44 +40926,44 @@
   );
 
   TypeHierarchyItem({
-    required this.name,
-    required this.kind,
-    this.tags,
+    this.data,
     this.detail,
-    required this.uri,
+    required this.kind,
+    required this.name,
     required this.range,
     required this.selectionRange,
-    this.data,
+    this.tags,
+    required this.uri,
   });
   static TypeHierarchyItem fromJson(Map<String, Object?> json) {
-    final nameJson = json['name'];
-    final name = nameJson as String;
-    final kindJson = json['kind'];
-    final kind = SymbolKind.fromJson(kindJson as int);
-    final tagsJson = json['tags'];
-    final tags = (tagsJson as List<Object?>?)
-        ?.map((item) => SymbolTag.fromJson(item as int))
-        .toList();
+    final dataJson = json['data'];
+    final data = dataJson;
     final detailJson = json['detail'];
     final detail = detailJson as String?;
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
+    final kindJson = json['kind'];
+    final kind = SymbolKind.fromJson(kindJson as int);
+    final nameJson = json['name'];
+    final name = nameJson as String;
     final rangeJson = json['range'];
     final range = Range.fromJson(rangeJson as Map<String, Object?>);
     final selectionRangeJson = json['selectionRange'];
     final selectionRange =
         Range.fromJson(selectionRangeJson as Map<String, Object?>);
-    final dataJson = json['data'];
-    final data = dataJson;
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => SymbolTag.fromJson(item as int))
+        .toList();
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return TypeHierarchyItem(
-      name: name,
-      kind: kind,
-      tags: tags,
+      data: data,
       detail: detail,
-      uri: uri,
+      kind: kind,
+      name: name,
       range: range,
       selectionRange: selectionRange,
-      data: data,
+      tags: tags,
+      uri: uri,
     );
   }
 
@@ -41532,37 +40999,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['name'] = name;
-    __result['kind'] = kind.toJson();
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    if (data != null) {
+      __result['data'] = data;
     }
     if (detail != null) {
       __result['detail'] = detail;
     }
-    __result['uri'] = uri;
+    __result['kind'] = kind.toJson();
+    __result['name'] = name;
     __result['range'] = range.toJson();
     __result['selectionRange'] = selectionRange.toJson();
-    if (data != null) {
-      __result['data'] = data;
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
     }
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('name');
+      reporter.push('detail');
       try {
-        if (!obj.containsKey('name')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final name = obj['name'];
-        if (name == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(name is String)) {
+        final detail = obj['detail'];
+        if (detail != null && !(detail is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41587,40 +41046,18 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
+      reporter.push('name');
       try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<SymbolTag>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('detail');
-      try {
-        final detail = obj['detail'];
-        if (detail != null && !(detail is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
+        if (!obj.containsKey('name')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final uri = obj['uri'];
-        if (uri == null) {
+        final name = obj['name'];
+        if (name == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
+        if (!(name is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -41663,6 +41100,36 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type TypeHierarchyItem');
@@ -41673,14 +41140,14 @@
   @override
   bool operator ==(Object other) {
     if (other is TypeHierarchyItem && other.runtimeType == TypeHierarchyItem) {
-      return name == other.name &&
-          kind == other.kind &&
-          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+      return data == other.data &&
           detail == other.detail &&
-          uri == other.uri &&
+          kind == other.kind &&
+          name == other.name &&
           range == other.range &&
           selectionRange == other.selectionRange &&
-          data == other.data &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
+          uri == other.uri &&
           true;
     }
     return false;
@@ -41688,14 +41155,14 @@
 
   @override
   int get hashCode => Object.hash(
-        name,
-        kind,
-        lspHashCode(tags),
+        data,
         detail,
-        uri,
+        kind,
+        name,
         range,
         selectionRange,
-        data,
+        lspHashCode(tags),
+        uri,
       );
 
   @override
@@ -41775,16 +41242,16 @@
   );
 
   TypeHierarchyPrepareParams({
-    required this.textDocument,
     required this.position,
+    required this.textDocument,
     this.workDoneToken,
   });
   static TypeHierarchyPrepareParams fromJson(Map<String, Object?> json) {
+    final positionJson = json['position'];
+    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final positionJson = json['position'];
-    final position = Position.fromJson(positionJson as Map<String, Object?>);
     final workDoneTokenJson = json['workDoneToken'];
     final workDoneToken = workDoneTokenJson == null
         ? null
@@ -41794,8 +41261,8 @@
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return TypeHierarchyPrepareParams(
-      textDocument: textDocument,
       position: position,
+      textDocument: textDocument,
       workDoneToken: workDoneToken,
     );
   }
@@ -41811,8 +41278,8 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['position'] = position.toJson();
+    __result['textDocument'] = textDocument.toJson();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
@@ -41821,24 +41288,6 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('position');
       try {
         if (!obj.containsKey('position')) {
@@ -41857,6 +41306,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('workDoneToken');
       try {
         final workDoneToken = obj['workDoneToken'];
@@ -41879,8 +41346,8 @@
   bool operator ==(Object other) {
     if (other is TypeHierarchyPrepareParams &&
         other.runtimeType == TypeHierarchyPrepareParams) {
-      return textDocument == other.textDocument &&
-          position == other.position &&
+      return position == other.position &&
+          textDocument == other.textDocument &&
           workDoneToken == other.workDoneToken &&
           true;
     }
@@ -41889,8 +41356,8 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         position,
+        textDocument,
         workDoneToken,
       );
 
@@ -41911,28 +41378,29 @@
 
   TypeHierarchyRegistrationOptions({
     this.documentSelector,
-    this.workDoneProgress,
     this.id,
+    this.workDoneProgress,
   });
   static TypeHierarchyRegistrationOptions fromJson(Map<String, Object?> json) {
     final documentSelectorJson = json['documentSelector'];
     final documentSelector = (documentSelectorJson as List<Object?>?)
-        ?.map((item) => DocumentFilter.fromJson(item as Map<String, Object?>))
+        ?.map(
+            (item) => TextDocumentFilter.fromJson(item as Map<String, Object?>))
         .toList();
-    final workDoneProgressJson = json['workDoneProgress'];
-    final workDoneProgress = workDoneProgressJson as bool?;
     final idJson = json['id'];
     final id = idJson as String?;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
     return TypeHierarchyRegistrationOptions(
       documentSelector: documentSelector,
-      workDoneProgress: workDoneProgress,
       id: id,
+      workDoneProgress: workDoneProgress,
     );
   }
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
-  final List<DocumentFilter>? documentSelector;
+  final List<TextDocumentFilter>? documentSelector;
 
   /// The id used to register the request. The id can be used to deregister the
   /// request again. See also Registration#id.
@@ -41942,12 +41410,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['documentSelector'] = documentSelector;
-    if (workDoneProgress != null) {
-      __result['workDoneProgress'] = workDoneProgress;
-    }
     if (id != null) {
       __result['id'] = id;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -41963,18 +41431,8 @@
         if (documentSelector != null &&
             !((documentSelector is List<Object?> &&
                 (documentSelector.every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('workDoneProgress');
-      try {
-        final workDoneProgress = obj['workDoneProgress'];
-        if (workDoneProgress != null && !(workDoneProgress is bool)) {
-          reporter.reportError('must be of type bool');
+                    (item) => TextDocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<TextDocumentFilter>');
           return false;
         }
       } finally {
@@ -41990,6 +41448,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type TypeHierarchyRegistrationOptions');
@@ -42002,9 +41470,9 @@
     if (other is TypeHierarchyRegistrationOptions &&
         other.runtimeType == TypeHierarchyRegistrationOptions) {
       return listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
-          workDoneProgress == other.workDoneProgress &&
+              (TextDocumentFilter a, TextDocumentFilter b) => a == b) &&
           id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -42013,8 +41481,8 @@
   @override
   int get hashCode => Object.hash(
         lspHashCode(documentSelector),
-        workDoneProgress,
         id,
+        workDoneProgress,
       );
 
   @override
@@ -42030,20 +41498,12 @@
 
   TypeHierarchySubtypesParams({
     required this.item,
-    this.workDoneToken,
     this.partialResultToken,
+    this.workDoneToken,
   });
   static TypeHierarchySubtypesParams fromJson(Map<String, Object?> json) {
     final itemJson = json['item'];
     final item = TypeHierarchyItem.fromJson(itemJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -42052,10 +41512,18 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return TypeHierarchySubtypesParams(
       item: item,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -42071,12 +41539,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['item'] = item.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -42100,22 +41568,22 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('partialResultToken');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -42134,8 +41602,8 @@
     if (other is TypeHierarchySubtypesParams &&
         other.runtimeType == TypeHierarchySubtypesParams) {
       return item == other.item &&
-          workDoneToken == other.workDoneToken &&
           partialResultToken == other.partialResultToken &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -42144,8 +41612,8 @@
   @override
   int get hashCode => Object.hash(
         item,
-        workDoneToken,
         partialResultToken,
+        workDoneToken,
       );
 
   @override
@@ -42161,20 +41629,12 @@
 
   TypeHierarchySupertypesParams({
     required this.item,
-    this.workDoneToken,
     this.partialResultToken,
+    this.workDoneToken,
   });
   static TypeHierarchySupertypesParams fromJson(Map<String, Object?> json) {
     final itemJson = json['item'];
     final item = TypeHierarchyItem.fromJson(itemJson as Map<String, Object?>);
-    final workDoneTokenJson = json['workDoneToken'];
-    final workDoneToken = workDoneTokenJson == null
-        ? null
-        : (workDoneTokenJson is int
-            ? Either2<int, String>.t1(workDoneTokenJson)
-            : (workDoneTokenJson is String
-                ? Either2<int, String>.t2(workDoneTokenJson)
-                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     final partialResultTokenJson = json['partialResultToken'];
     final partialResultToken = partialResultTokenJson == null
         ? null
@@ -42183,10 +41643,18 @@
             : (partialResultTokenJson is String
                 ? Either2<int, String>.t2(partialResultTokenJson)
                 : (throw '''$partialResultTokenJson was not one of (int, String)''')));
+    final workDoneTokenJson = json['workDoneToken'];
+    final workDoneToken = workDoneTokenJson == null
+        ? null
+        : (workDoneTokenJson is int
+            ? Either2<int, String>.t1(workDoneTokenJson)
+            : (workDoneTokenJson is String
+                ? Either2<int, String>.t2(workDoneTokenJson)
+                : (throw '''$workDoneTokenJson was not one of (int, String)''')));
     return TypeHierarchySupertypesParams(
       item: item,
-      workDoneToken: workDoneToken,
       partialResultToken: partialResultToken,
+      workDoneToken: workDoneToken,
     );
   }
 
@@ -42202,12 +41670,12 @@
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
     __result['item'] = item.toJson();
-    if (workDoneToken != null) {
-      __result['workDoneToken'] = workDoneToken;
-    }
     if (partialResultToken != null) {
       __result['partialResultToken'] = partialResultToken;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -42231,22 +41699,22 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('workDoneToken');
+      reporter.push('partialResultToken');
       try {
-        final workDoneToken = obj['workDoneToken'];
-        if (workDoneToken != null &&
-            !((workDoneToken is int || workDoneToken is String))) {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
+      reporter.push('workDoneToken');
       try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
+        final workDoneToken = obj['workDoneToken'];
+        if (workDoneToken != null &&
+            !((workDoneToken is int || workDoneToken is String))) {
           reporter.reportError('must be of type Either2<int, String>');
           return false;
         }
@@ -42265,8 +41733,8 @@
     if (other is TypeHierarchySupertypesParams &&
         other.runtimeType == TypeHierarchySupertypesParams) {
       return item == other.item &&
-          workDoneToken == other.workDoneToken &&
           partialResultToken == other.partialResultToken &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -42275,8 +41743,8 @@
   @override
   int get hashCode => Object.hash(
         item,
-        workDoneToken,
         partialResultToken,
+        workDoneToken,
       );
 
   @override
@@ -42621,18 +42089,18 @@
   );
 
   VersionedNotebookDocumentIdentifier({
-    required this.version,
     required this.uri,
+    required this.version,
   });
   static VersionedNotebookDocumentIdentifier fromJson(
       Map<String, Object?> json) {
-    final versionJson = json['version'];
-    final version = versionJson as int;
     final uriJson = json['uri'];
     final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int;
     return VersionedNotebookDocumentIdentifier(
-      version: version,
       uri: uri,
+      version: version,
     );
   }
 
@@ -42644,31 +42112,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['version'] = version;
     __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('version');
-      try {
-        if (!obj.containsKey('version')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final version = obj['version'];
-        if (version == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(version is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -42687,6 +42137,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter
@@ -42699,15 +42167,15 @@
   bool operator ==(Object other) {
     if (other is VersionedNotebookDocumentIdentifier &&
         other.runtimeType == VersionedNotebookDocumentIdentifier) {
-      return version == other.version && uri == other.uri && true;
+      return uri == other.uri && version == other.version && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        version,
         uri,
+        version,
       );
 
   @override
@@ -42722,17 +42190,17 @@
   );
 
   VersionedTextDocumentIdentifier({
-    required this.version,
     required this.uri,
+    required this.version,
   });
   static VersionedTextDocumentIdentifier fromJson(Map<String, Object?> json) {
-    final versionJson = json['version'];
-    final version = versionJson as int;
     final uriJson = json['uri'];
     final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int;
     return VersionedTextDocumentIdentifier(
-      version: version,
       uri: uri,
+      version: version,
     );
   }
 
@@ -42747,31 +42215,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['version'] = version;
     __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('version');
-      try {
-        if (!obj.containsKey('version')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final version = obj['version'];
-        if (version == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(version is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('uri');
       try {
         if (!obj.containsKey('uri')) {
@@ -42790,6 +42240,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type VersionedTextDocumentIdentifier');
@@ -42801,15 +42269,15 @@
   bool operator ==(Object other) {
     if (other is VersionedTextDocumentIdentifier &&
         other.runtimeType == VersionedTextDocumentIdentifier) {
-      return version == other.version && uri == other.uri && true;
+      return uri == other.uri && version == other.version && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        version,
         uri,
+        version,
       );
 
   @override
@@ -42854,18 +42322,18 @@
   );
 
   WillSaveTextDocumentParams({
-    required this.textDocument,
     required this.reason,
+    required this.textDocument,
   });
   static WillSaveTextDocumentParams fromJson(Map<String, Object?> json) {
+    final reasonJson = json['reason'];
+    final reason = TextDocumentSaveReason.fromJson(reasonJson as int);
     final textDocumentJson = json['textDocument'];
     final textDocument = TextDocumentIdentifier.fromJson(
         textDocumentJson as Map<String, Object?>);
-    final reasonJson = json['reason'];
-    final reason = TextDocumentSaveReason.fromJson(reasonJson as int);
     return WillSaveTextDocumentParams(
-      textDocument: textDocument,
       reason: reason,
+      textDocument: textDocument,
     );
   }
 
@@ -42877,31 +42345,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['textDocument'] = textDocument.toJson();
     __result['reason'] = reason.toJson();
+    __result['textDocument'] = textDocument.toJson();
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final textDocument = obj['textDocument'];
-        if (textDocument == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
-          reporter.reportError('must be of type TextDocumentIdentifier');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('reason');
       try {
         if (!obj.containsKey('reason')) {
@@ -42920,6 +42370,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final textDocument = obj['textDocument'];
+        if (textDocument == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(textDocument, reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type WillSaveTextDocumentParams');
@@ -42931,8 +42399,8 @@
   bool operator ==(Object other) {
     if (other is WillSaveTextDocumentParams &&
         other.runtimeType == WillSaveTextDocumentParams) {
-      return textDocument == other.textDocument &&
-          reason == other.reason &&
+      return reason == other.reason &&
+          textDocument == other.textDocument &&
           true;
     }
     return false;
@@ -42940,8 +42408,138 @@
 
   @override
   int get hashCode => Object.hash(
-        textDocument,
         reason,
+        textDocument,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WindowClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WindowClientCapabilities.canParse,
+    WindowClientCapabilities.fromJson,
+  );
+
+  WindowClientCapabilities({
+    this.showDocument,
+    this.showMessage,
+    this.workDoneProgress,
+  });
+  static WindowClientCapabilities fromJson(Map<String, Object?> json) {
+    final showDocumentJson = json['showDocument'];
+    final showDocument = showDocumentJson != null
+        ? ShowDocumentClientCapabilities.fromJson(
+            showDocumentJson as Map<String, Object?>)
+        : null;
+    final showMessageJson = json['showMessage'];
+    final showMessage = showMessageJson != null
+        ? ShowMessageRequestClientCapabilities.fromJson(
+            showMessageJson as Map<String, Object?>)
+        : null;
+    final workDoneProgressJson = json['workDoneProgress'];
+    final workDoneProgress = workDoneProgressJson as bool?;
+    return WindowClientCapabilities(
+      showDocument: showDocument,
+      showMessage: showMessage,
+      workDoneProgress: workDoneProgress,
+    );
+  }
+
+  /// Client capabilities for the show document request.
+  ///  @since 3.16.0
+  final ShowDocumentClientCapabilities? showDocument;
+
+  /// Capabilities specific to the showMessage request
+  ///  @since 3.16.0
+  final ShowMessageRequestClientCapabilities? showMessage;
+
+  /// It indicates whether the client supports server initiated progress using
+  /// the `window/workDoneProgress/create` request.
+  ///
+  /// The capability also controls Whether client supports handling of progress
+  /// notifications. If set servers are allowed to report a `workDoneProgress`
+  /// property in the request specific server capabilities.
+  ///  @since 3.15.0
+  final bool? workDoneProgress;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (showDocument != null) {
+      __result['showDocument'] = showDocument?.toJson();
+    }
+    if (showMessage != null) {
+      __result['showMessage'] = showMessage?.toJson();
+    }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('showDocument');
+      try {
+        final showDocument = obj['showDocument'];
+        if (showDocument != null &&
+            !(ShowDocumentClientCapabilities.canParse(
+                showDocument, reporter))) {
+          reporter
+              .reportError('must be of type ShowDocumentClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('showMessage');
+      try {
+        final showMessage = obj['showMessage'];
+        if (showMessage != null &&
+            !(ShowMessageRequestClientCapabilities.canParse(
+                showMessage, reporter))) {
+          reporter.reportError(
+              'must be of type ShowMessageRequestClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        final workDoneProgress = obj['workDoneProgress'];
+        if (workDoneProgress != null && !(workDoneProgress is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type WindowClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WindowClientCapabilities &&
+        other.runtimeType == WindowClientCapabilities) {
+      return showDocument == other.showDocument &&
+          showMessage == other.showMessage &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        showDocument,
+        showMessage,
+        workDoneProgress,
       );
 
   @override
@@ -42955,33 +42553,33 @@
   );
 
   WorkDoneProgressBegin({
-    this.kind = 'begin',
-    required this.title,
     this.cancellable,
+    this.kind = 'begin',
     this.message,
     this.percentage,
+    required this.title,
   }) {
     if (kind != 'begin') {
       throw 'kind may only be the literal \'begin\'';
     }
   }
   static WorkDoneProgressBegin fromJson(Map<String, Object?> json) {
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
-    final titleJson = json['title'];
-    final title = titleJson as String;
     final cancellableJson = json['cancellable'];
     final cancellable = cancellableJson as bool?;
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
     final messageJson = json['message'];
     final message = messageJson as String?;
     final percentageJson = json['percentage'];
     final percentage = percentageJson as int?;
+    final titleJson = json['title'];
+    final title = titleJson as String;
     return WorkDoneProgressBegin(
-      kind: kind,
-      title: title,
       cancellable: cancellable,
+      kind: kind,
       message: message,
       percentage: percentage,
+      title: title,
     );
   }
 
@@ -43014,22 +42612,32 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind;
-    __result['title'] = title;
     if (cancellable != null) {
       __result['cancellable'] = cancellable;
     }
+    __result['kind'] = kind;
     if (message != null) {
       __result['message'] = message;
     }
     if (percentage != null) {
       __result['percentage'] = percentage;
     }
+    __result['title'] = title;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('cancellable');
+      try {
+        final cancellable = obj['cancellable'];
+        if (cancellable != null && !(cancellable is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -43048,34 +42656,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('title');
-      try {
-        if (!obj.containsKey('title')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final title = obj['title'];
-        if (title == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(title is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('cancellable');
-      try {
-        final cancellable = obj['cancellable'];
-        if (cancellable != null && !(cancellable is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('message');
       try {
         final message = obj['message'];
@@ -43096,6 +42676,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('title');
+      try {
+        if (!obj.containsKey('title')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final title = obj['title'];
+        if (title == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(title is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type WorkDoneProgressBegin');
@@ -43107,11 +42705,11 @@
   bool operator ==(Object other) {
     if (other is WorkDoneProgressBegin &&
         other.runtimeType == WorkDoneProgressBegin) {
-      return kind == other.kind &&
-          title == other.title &&
-          cancellable == other.cancellable &&
+      return cancellable == other.cancellable &&
+          kind == other.kind &&
           message == other.message &&
           percentage == other.percentage &&
+          title == other.title &&
           true;
     }
     return false;
@@ -43119,11 +42717,11 @@
 
   @override
   int get hashCode => Object.hash(
-        kind,
-        title,
         cancellable,
+        kind,
         message,
         percentage,
+        title,
       );
 
   @override
@@ -43712,8 +43310,8 @@
   );
 
   WorkDoneProgressReport({
-    this.kind = 'report',
     this.cancellable,
+    this.kind = 'report',
     this.message,
     this.percentage,
   }) {
@@ -43722,17 +43320,17 @@
     }
   }
   static WorkDoneProgressReport fromJson(Map<String, Object?> json) {
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
     final cancellableJson = json['cancellable'];
     final cancellable = cancellableJson as bool?;
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
     final messageJson = json['message'];
     final message = messageJson as String?;
     final percentageJson = json['percentage'];
     final percentage = percentageJson as int?;
     return WorkDoneProgressReport(
-      kind: kind,
       cancellable: cancellable,
+      kind: kind,
       message: message,
       percentage: percentage,
     );
@@ -43763,10 +43361,10 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['kind'] = kind;
     if (cancellable != null) {
       __result['cancellable'] = cancellable;
     }
+    __result['kind'] = kind;
     if (message != null) {
       __result['message'] = message;
     }
@@ -43778,6 +43376,16 @@
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('cancellable');
+      try {
+        final cancellable = obj['cancellable'];
+        if (cancellable != null && !(cancellable is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -43796,16 +43404,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('cancellable');
-      try {
-        final cancellable = obj['cancellable'];
-        if (cancellable != null && !(cancellable is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('message');
       try {
         final message = obj['message'];
@@ -43837,8 +43435,8 @@
   bool operator ==(Object other) {
     if (other is WorkDoneProgressReport &&
         other.runtimeType == WorkDoneProgressReport) {
-      return kind == other.kind &&
-          cancellable == other.cancellable &&
+      return cancellable == other.cancellable &&
+          kind == other.kind &&
           message == other.message &&
           percentage == other.percentage &&
           true;
@@ -43848,8 +43446,8 @@
 
   @override
   int get hashCode => Object.hash(
-        kind,
         cancellable,
+        kind,
         message,
         percentage,
       );
@@ -43858,6 +43456,435 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class WorkspaceClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+    WorkspaceClientCapabilities.canParse,
+    WorkspaceClientCapabilities.fromJson,
+  );
+
+  WorkspaceClientCapabilities({
+    this.applyEdit,
+    this.codeLens,
+    this.configuration,
+    this.diagnostics,
+    this.didChangeConfiguration,
+    this.didChangeWatchedFiles,
+    this.executeCommand,
+    this.fileOperations,
+    this.inlayHint,
+    this.inlineValue,
+    this.semanticTokens,
+    this.symbol,
+    this.workspaceEdit,
+    this.workspaceFolders,
+  });
+  static WorkspaceClientCapabilities fromJson(Map<String, Object?> json) {
+    final applyEditJson = json['applyEdit'];
+    final applyEdit = applyEditJson as bool?;
+    final codeLensJson = json['codeLens'];
+    final codeLens = codeLensJson != null
+        ? CodeLensWorkspaceClientCapabilities.fromJson(
+            codeLensJson as Map<String, Object?>)
+        : null;
+    final configurationJson = json['configuration'];
+    final configuration = configurationJson as bool?;
+    final diagnosticsJson = json['diagnostics'];
+    final diagnostics = diagnosticsJson != null
+        ? DiagnosticWorkspaceClientCapabilities.fromJson(
+            diagnosticsJson as Map<String, Object?>)
+        : null;
+    final didChangeConfigurationJson = json['didChangeConfiguration'];
+    final didChangeConfiguration = didChangeConfigurationJson != null
+        ? DidChangeConfigurationClientCapabilities.fromJson(
+            didChangeConfigurationJson as Map<String, Object?>)
+        : null;
+    final didChangeWatchedFilesJson = json['didChangeWatchedFiles'];
+    final didChangeWatchedFiles = didChangeWatchedFilesJson != null
+        ? DidChangeWatchedFilesClientCapabilities.fromJson(
+            didChangeWatchedFilesJson as Map<String, Object?>)
+        : null;
+    final executeCommandJson = json['executeCommand'];
+    final executeCommand = executeCommandJson != null
+        ? ExecuteCommandClientCapabilities.fromJson(
+            executeCommandJson as Map<String, Object?>)
+        : null;
+    final fileOperationsJson = json['fileOperations'];
+    final fileOperations = fileOperationsJson != null
+        ? ClientCapabilitiesFileOperations.fromJson(
+            fileOperationsJson as Map<String, Object?>)
+        : null;
+    final inlayHintJson = json['inlayHint'];
+    final inlayHint = inlayHintJson != null
+        ? InlayHintWorkspaceClientCapabilities.fromJson(
+            inlayHintJson as Map<String, Object?>)
+        : null;
+    final inlineValueJson = json['inlineValue'];
+    final inlineValue = inlineValueJson != null
+        ? InlineValueWorkspaceClientCapabilities.fromJson(
+            inlineValueJson as Map<String, Object?>)
+        : null;
+    final semanticTokensJson = json['semanticTokens'];
+    final semanticTokens = semanticTokensJson != null
+        ? SemanticTokensWorkspaceClientCapabilities.fromJson(
+            semanticTokensJson as Map<String, Object?>)
+        : null;
+    final symbolJson = json['symbol'];
+    final symbol = symbolJson != null
+        ? WorkspaceSymbolClientCapabilities.fromJson(
+            symbolJson as Map<String, Object?>)
+        : null;
+    final workspaceEditJson = json['workspaceEdit'];
+    final workspaceEdit = workspaceEditJson != null
+        ? WorkspaceEditClientCapabilities.fromJson(
+            workspaceEditJson as Map<String, Object?>)
+        : null;
+    final workspaceFoldersJson = json['workspaceFolders'];
+    final workspaceFolders = workspaceFoldersJson as bool?;
+    return WorkspaceClientCapabilities(
+      applyEdit: applyEdit,
+      codeLens: codeLens,
+      configuration: configuration,
+      diagnostics: diagnostics,
+      didChangeConfiguration: didChangeConfiguration,
+      didChangeWatchedFiles: didChangeWatchedFiles,
+      executeCommand: executeCommand,
+      fileOperations: fileOperations,
+      inlayHint: inlayHint,
+      inlineValue: inlineValue,
+      semanticTokens: semanticTokens,
+      symbol: symbol,
+      workspaceEdit: workspaceEdit,
+      workspaceFolders: workspaceFolders,
+    );
+  }
+
+  /// The client supports applying batch edits to the workspace by supporting
+  /// the request 'workspace/applyEdit'
+  final bool? applyEdit;
+
+  /// Capabilities specific to the code lens requests scoped to the workspace.
+  ///  @since 3.16.0
+  final CodeLensWorkspaceClientCapabilities? codeLens;
+
+  /// The client supports `workspace/configuration` requests.
+  ///  @since 3.6.0
+  final bool? configuration;
+
+  /// Client workspace capabilities specific to diagnostics.
+  ///  @since 3.17.0.
+  final DiagnosticWorkspaceClientCapabilities? diagnostics;
+
+  /// Capabilities specific to the `workspace/didChangeConfiguration`
+  /// notification.
+  final DidChangeConfigurationClientCapabilities? didChangeConfiguration;
+
+  /// Capabilities specific to the `workspace/didChangeWatchedFiles`
+  /// notification.
+  final DidChangeWatchedFilesClientCapabilities? didChangeWatchedFiles;
+
+  /// Capabilities specific to the `workspace/executeCommand` request.
+  final ExecuteCommandClientCapabilities? executeCommand;
+
+  /// The client has support for file requests/notifications.
+  ///  @since 3.16.0
+  final ClientCapabilitiesFileOperations? fileOperations;
+
+  /// Client workspace capabilities specific to inlay hints.
+  ///  @since 3.17.0
+  final InlayHintWorkspaceClientCapabilities? inlayHint;
+
+  /// Client workspace capabilities specific to inline values.
+  ///  @since 3.17.0
+  final InlineValueWorkspaceClientCapabilities? inlineValue;
+
+  /// Capabilities specific to the semantic token requests scoped to the
+  /// workspace.
+  ///  @since 3.16.0
+  final SemanticTokensWorkspaceClientCapabilities? semanticTokens;
+
+  /// Capabilities specific to the `workspace/symbol` request.
+  final WorkspaceSymbolClientCapabilities? symbol;
+
+  /// Capabilities specific to `WorkspaceEdit`s
+  final WorkspaceEditClientCapabilities? workspaceEdit;
+
+  /// The client has support for workspace folders.
+  ///  @since 3.6.0
+  final bool? workspaceFolders;
+
+  Map<String, Object?> toJson() {
+    var __result = <String, Object?>{};
+    if (applyEdit != null) {
+      __result['applyEdit'] = applyEdit;
+    }
+    if (codeLens != null) {
+      __result['codeLens'] = codeLens?.toJson();
+    }
+    if (configuration != null) {
+      __result['configuration'] = configuration;
+    }
+    if (diagnostics != null) {
+      __result['diagnostics'] = diagnostics?.toJson();
+    }
+    if (didChangeConfiguration != null) {
+      __result['didChangeConfiguration'] = didChangeConfiguration?.toJson();
+    }
+    if (didChangeWatchedFiles != null) {
+      __result['didChangeWatchedFiles'] = didChangeWatchedFiles?.toJson();
+    }
+    if (executeCommand != null) {
+      __result['executeCommand'] = executeCommand?.toJson();
+    }
+    if (fileOperations != null) {
+      __result['fileOperations'] = fileOperations?.toJson();
+    }
+    if (inlayHint != null) {
+      __result['inlayHint'] = inlayHint?.toJson();
+    }
+    if (inlineValue != null) {
+      __result['inlineValue'] = inlineValue?.toJson();
+    }
+    if (semanticTokens != null) {
+      __result['semanticTokens'] = semanticTokens?.toJson();
+    }
+    if (symbol != null) {
+      __result['symbol'] = symbol?.toJson();
+    }
+    if (workspaceEdit != null) {
+      __result['workspaceEdit'] = workspaceEdit?.toJson();
+    }
+    if (workspaceFolders != null) {
+      __result['workspaceFolders'] = workspaceFolders;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
+    if (obj is Map<String, Object?>) {
+      reporter.push('applyEdit');
+      try {
+        final applyEdit = obj['applyEdit'];
+        if (applyEdit != null && !(applyEdit is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('codeLens');
+      try {
+        final codeLens = obj['codeLens'];
+        if (codeLens != null &&
+            !(CodeLensWorkspaceClientCapabilities.canParse(
+                codeLens, reporter))) {
+          reporter.reportError(
+              'must be of type CodeLensWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('configuration');
+      try {
+        final configuration = obj['configuration'];
+        if (configuration != null && !(configuration is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('diagnostics');
+      try {
+        final diagnostics = obj['diagnostics'];
+        if (diagnostics != null &&
+            !(DiagnosticWorkspaceClientCapabilities.canParse(
+                diagnostics, reporter))) {
+          reporter.reportError(
+              'must be of type DiagnosticWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didChangeConfiguration');
+      try {
+        final didChangeConfiguration = obj['didChangeConfiguration'];
+        if (didChangeConfiguration != null &&
+            !(DidChangeConfigurationClientCapabilities.canParse(
+                didChangeConfiguration, reporter))) {
+          reporter.reportError(
+              'must be of type DidChangeConfigurationClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didChangeWatchedFiles');
+      try {
+        final didChangeWatchedFiles = obj['didChangeWatchedFiles'];
+        if (didChangeWatchedFiles != null &&
+            !(DidChangeWatchedFilesClientCapabilities.canParse(
+                didChangeWatchedFiles, reporter))) {
+          reporter.reportError(
+              'must be of type DidChangeWatchedFilesClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('executeCommand');
+      try {
+        final executeCommand = obj['executeCommand'];
+        if (executeCommand != null &&
+            !(ExecuteCommandClientCapabilities.canParse(
+                executeCommand, reporter))) {
+          reporter
+              .reportError('must be of type ExecuteCommandClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('fileOperations');
+      try {
+        final fileOperations = obj['fileOperations'];
+        if (fileOperations != null &&
+            !(ClientCapabilitiesFileOperations.canParse(
+                fileOperations, reporter))) {
+          reporter
+              .reportError('must be of type ClientCapabilitiesFileOperations');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlayHint');
+      try {
+        final inlayHint = obj['inlayHint'];
+        if (inlayHint != null &&
+            !(InlayHintWorkspaceClientCapabilities.canParse(
+                inlayHint, reporter))) {
+          reporter.reportError(
+              'must be of type InlayHintWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('inlineValue');
+      try {
+        final inlineValue = obj['inlineValue'];
+        if (inlineValue != null &&
+            !(InlineValueWorkspaceClientCapabilities.canParse(
+                inlineValue, reporter))) {
+          reporter.reportError(
+              'must be of type InlineValueWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('semanticTokens');
+      try {
+        final semanticTokens = obj['semanticTokens'];
+        if (semanticTokens != null &&
+            !(SemanticTokensWorkspaceClientCapabilities.canParse(
+                semanticTokens, reporter))) {
+          reporter.reportError(
+              'must be of type SemanticTokensWorkspaceClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('symbol');
+      try {
+        final symbol = obj['symbol'];
+        if (symbol != null &&
+            !(WorkspaceSymbolClientCapabilities.canParse(symbol, reporter))) {
+          reporter
+              .reportError('must be of type WorkspaceSymbolClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspaceEdit');
+      try {
+        final workspaceEdit = obj['workspaceEdit'];
+        if (workspaceEdit != null &&
+            !(WorkspaceEditClientCapabilities.canParse(
+                workspaceEdit, reporter))) {
+          reporter
+              .reportError('must be of type WorkspaceEditClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspaceFolders');
+      try {
+        final workspaceFolders = obj['workspaceFolders'];
+        if (workspaceFolders != null && !(workspaceFolders is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type WorkspaceClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is WorkspaceClientCapabilities &&
+        other.runtimeType == WorkspaceClientCapabilities) {
+      return applyEdit == other.applyEdit &&
+          codeLens == other.codeLens &&
+          configuration == other.configuration &&
+          diagnostics == other.diagnostics &&
+          didChangeConfiguration == other.didChangeConfiguration &&
+          didChangeWatchedFiles == other.didChangeWatchedFiles &&
+          executeCommand == other.executeCommand &&
+          fileOperations == other.fileOperations &&
+          inlayHint == other.inlayHint &&
+          inlineValue == other.inlineValue &&
+          semanticTokens == other.semanticTokens &&
+          symbol == other.symbol &&
+          workspaceEdit == other.workspaceEdit &&
+          workspaceFolders == other.workspaceFolders &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => Object.hash(
+        applyEdit,
+        codeLens,
+        configuration,
+        diagnostics,
+        didChangeConfiguration,
+        didChangeWatchedFiles,
+        executeCommand,
+        fileOperations,
+        inlayHint,
+        inlineValue,
+        semanticTokens,
+        symbol,
+        workspaceEdit,
+        workspaceFolders,
+      );
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Parameters of the workspace diagnostic request.
 ///  @since 3.17.0
 class WorkspaceDiagnosticParams
@@ -43869,13 +43896,21 @@
 
   WorkspaceDiagnosticParams({
     this.identifier,
+    this.partialResultToken,
     required this.previousResultIds,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static WorkspaceDiagnosticParams fromJson(Map<String, Object?> json) {
     final identifierJson = json['identifier'];
     final identifier = identifierJson as String?;
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final previousResultIdsJson = json['previousResultIds'];
     final previousResultIds = (previousResultIdsJson as List<Object?>)
         .map((item) => PreviousResultId.fromJson(item as Map<String, Object?>))
@@ -43888,19 +43923,11 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return WorkspaceDiagnosticParams(
       identifier: identifier,
+      partialResultToken: partialResultToken,
       previousResultIds: previousResultIds,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -43922,14 +43949,14 @@
     if (identifier != null) {
       __result['identifier'] = identifier;
     }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['previousResultIds'] =
         previousResultIds.map((item) => item.toJson()).toList();
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
@@ -43945,6 +43972,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('previousResultIds');
       try {
         if (!obj.containsKey('previousResultIds')) {
@@ -43976,17 +44014,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type WorkspaceDiagnosticParams');
@@ -43999,10 +44026,10 @@
     if (other is WorkspaceDiagnosticParams &&
         other.runtimeType == WorkspaceDiagnosticParams) {
       return identifier == other.identifier &&
+          partialResultToken == other.partialResultToken &&
           listEqual(previousResultIds, other.previousResultIds,
               (PreviousResultId a, PreviousResultId b) => a == b) &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -44011,9 +44038,9 @@
   @override
   int get hashCode => Object.hash(
         identifier,
+        partialResultToken,
         lspHashCode(previousResultIds),
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -44229,11 +44256,15 @@
   );
 
   WorkspaceEdit({
+    this.changeAnnotations,
     this.changes,
     this.documentChanges,
-    this.changeAnnotations,
   });
   static WorkspaceEdit fromJson(Map<String, Object?> json) {
+    final changeAnnotationsJson = json['changeAnnotations'];
+    final changeAnnotations = (changeAnnotationsJson as Map<Object, Object?>?)
+        ?.map((key, value) => MapEntry(key as String,
+            ChangeAnnotation.fromJson(value as Map<String, Object?>)));
     final changesJson = json['changes'];
     final changes = (changesJson as Map<Object, Object?>?)?.map((key, value) =>
         MapEntry(
@@ -44246,28 +44277,26 @@
         ? null
         : ((documentChangesJson is List<Object?> &&
                 (documentChangesJson.every((item) =>
-                    TextDocumentEdit.canParse(item, nullLspJsonReporter))))
-            ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t1((documentChangesJson)
-                .map((item) =>
-                    TextDocumentEdit.fromJson(item as Map<String, Object?>))
+                    (CreateFile.canParse(item, nullLspJsonReporter) ||
+                        DeleteFile.canParse(item, nullLspJsonReporter) ||
+                        RenameFile.canParse(item, nullLspJsonReporter) ||
+                        TextDocumentEdit.canParse(item, nullLspJsonReporter)))))
+            ? Either2<List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>, List<TextDocumentEdit>>.t1((documentChangesJson)
+                .map((item) => CreateFile.canParse(item, nullLspJsonReporter)
+                    ? Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>.t1(
+                        CreateFile.fromJson(item as Map<String, Object?>))
+                    : (DeleteFile.canParse(item, nullLspJsonReporter)
+                        ? Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>.t2(
+                            DeleteFile.fromJson(item as Map<String, Object?>))
+                        : (RenameFile.canParse(item, nullLspJsonReporter)
+                            ? Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>.t3(RenameFile.fromJson(item as Map<String, Object?>))
+                            : (TextDocumentEdit.canParse(item, nullLspJsonReporter) ? Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>.t4(TextDocumentEdit.fromJson(item as Map<String, Object?>)) : (throw '''$item was not one of (CreateFile, DeleteFile, RenameFile, TextDocumentEdit)''')))))
                 .toList())
-            : ((documentChangesJson is List<Object?> &&
-                    (documentChangesJson.every((item) =>
-                        (TextDocumentEdit.canParse(item, nullLspJsonReporter) ||
-                            CreateFile.canParse(item, nullLspJsonReporter) ||
-                            RenameFile.canParse(item, nullLspJsonReporter) ||
-                            DeleteFile.canParse(item, nullLspJsonReporter)))))
-                ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t2(
-                    (documentChangesJson).map((item) => TextDocumentEdit.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t1(TextDocumentEdit.fromJson(item as Map<String, Object?>)) : (CreateFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t2(CreateFile.fromJson(item as Map<String, Object?>)) : (RenameFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t3(RenameFile.fromJson(item as Map<String, Object?>)) : (DeleteFile.canParse(item, nullLspJsonReporter) ? Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t4(DeleteFile.fromJson(item as Map<String, Object?>)) : (throw '''$item was not one of (TextDocumentEdit, CreateFile, RenameFile, DeleteFile)'''))))).toList())
-                : (throw '''$documentChangesJson was not one of (List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>)''')));
-    final changeAnnotationsJson = json['changeAnnotations'];
-    final changeAnnotations = (changeAnnotationsJson as Map<Object, Object?>?)
-        ?.map((key, value) => MapEntry(key as String,
-            ChangeAnnotation.fromJson(value as Map<String, Object?>)));
+            : ((documentChangesJson is List<Object?> && (documentChangesJson.every((item) => TextDocumentEdit.canParse(item, nullLspJsonReporter)))) ? Either2<List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>, List<TextDocumentEdit>>.t2((documentChangesJson).map((item) => TextDocumentEdit.fromJson(item as Map<String, Object?>)).toList()) : (throw '''$documentChangesJson was not one of (List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>, List<TextDocumentEdit>)''')));
     return WorkspaceEdit(
+      changeAnnotations: changeAnnotations,
       changes: changes,
       documentChanges: documentChanges,
-      changeAnnotations: changeAnnotations,
     );
   }
 
@@ -44295,26 +44324,41 @@
   /// If a client neither supports `documentChanges` nor
   /// `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
   /// using the `changes` property are supported.
-  final Either2<List<TextDocumentEdit>,
-          List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>?
-      documentChanges;
+  final Either2<
+      List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>,
+      List<TextDocumentEdit>>? documentChanges;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (changeAnnotations != null) {
+      __result['changeAnnotations'] = changeAnnotations;
+    }
     if (changes != null) {
       __result['changes'] = changes;
     }
     if (documentChanges != null) {
       __result['documentChanges'] = documentChanges;
     }
-    if (changeAnnotations != null) {
-      __result['changeAnnotations'] = changeAnnotations;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('changeAnnotations');
+      try {
+        final changeAnnotations = obj['changeAnnotations'];
+        if (changeAnnotations != null &&
+            !((changeAnnotations is Map &&
+                (changeAnnotations.keys.every((item) =>
+                    item is String &&
+                    changeAnnotations.values.every((item) =>
+                        ChangeAnnotation.canParse(item, reporter))))))) {
+          reporter.reportError('must be of type Map<String, ChangeAnnotation>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('changes');
       try {
         final changes = obj['changes'];
@@ -44337,30 +44381,15 @@
         if (documentChanges != null &&
             !(((documentChanges is List<Object?> &&
                     (documentChanges.every((item) =>
-                        TextDocumentEdit.canParse(item, reporter)))) ||
+                        (CreateFile.canParse(item, reporter) ||
+                            DeleteFile.canParse(item, reporter) ||
+                            RenameFile.canParse(item, reporter) ||
+                            TextDocumentEdit.canParse(item, reporter))))) ||
                 (documentChanges is List<Object?> &&
                     (documentChanges.every((item) =>
-                        (TextDocumentEdit.canParse(item, reporter) ||
-                            CreateFile.canParse(item, reporter) ||
-                            RenameFile.canParse(item, reporter) ||
-                            DeleteFile.canParse(item, reporter)))))))) {
+                        TextDocumentEdit.canParse(item, reporter))))))) {
           reporter.reportError(
-              'must be of type Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('changeAnnotations');
-      try {
-        final changeAnnotations = obj['changeAnnotations'];
-        if (changeAnnotations != null &&
-            !((changeAnnotations is Map &&
-                (changeAnnotations.keys.every((item) =>
-                    item is String &&
-                    changeAnnotations.values.every((item) =>
-                        ChangeAnnotation.canParse(item, reporter))))))) {
-          reporter.reportError('must be of type Map<String, ChangeAnnotation>');
+              'must be of type Either2<List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>, List<TextDocumentEdit>>');
           return false;
         }
       } finally {
@@ -44376,14 +44405,14 @@
   @override
   bool operator ==(Object other) {
     if (other is WorkspaceEdit && other.runtimeType == WorkspaceEdit) {
-      return mapEqual(
+      return mapEqual(changeAnnotations, other.changeAnnotations,
+              (ChangeAnnotation a, ChangeAnnotation b) => a == b) &&
+          mapEqual(
               changes,
               other.changes,
               (List<TextEdit> a, List<TextEdit> b) =>
                   listEqual(a, b, (TextEdit a, TextEdit b) => a == b)) &&
           documentChanges == other.documentChanges &&
-          mapEqual(changeAnnotations, other.changeAnnotations,
-              (ChangeAnnotation a, ChangeAnnotation b) => a == b) &&
           true;
     }
     return false;
@@ -44391,9 +44420,9 @@
 
   @override
   int get hashCode => Object.hash(
+        lspHashCode(changeAnnotations),
         lspHashCode(changes),
         documentChanges,
-        lspHashCode(changeAnnotations),
       );
 
   @override
@@ -44407,36 +44436,36 @@
   );
 
   WorkspaceEditClientCapabilities({
+    this.changeAnnotationSupport,
     this.documentChanges,
-    this.resourceOperations,
     this.failureHandling,
     this.normalizesLineEndings,
-    this.changeAnnotationSupport,
+    this.resourceOperations,
   });
   static WorkspaceEditClientCapabilities fromJson(Map<String, Object?> json) {
+    final changeAnnotationSupportJson = json['changeAnnotationSupport'];
+    final changeAnnotationSupport = changeAnnotationSupportJson != null
+        ? WorkspaceEditClientCapabilitiesChangeAnnotationSupport.fromJson(
+            changeAnnotationSupportJson as Map<String, Object?>)
+        : null;
     final documentChangesJson = json['documentChanges'];
     final documentChanges = documentChangesJson as bool?;
-    final resourceOperationsJson = json['resourceOperations'];
-    final resourceOperations = (resourceOperationsJson as List<Object?>?)
-        ?.map((item) => ResourceOperationKind.fromJson(item as String))
-        .toList();
     final failureHandlingJson = json['failureHandling'];
     final failureHandling = failureHandlingJson != null
         ? FailureHandlingKind.fromJson(failureHandlingJson as String)
         : null;
     final normalizesLineEndingsJson = json['normalizesLineEndings'];
     final normalizesLineEndings = normalizesLineEndingsJson as bool?;
-    final changeAnnotationSupportJson = json['changeAnnotationSupport'];
-    final changeAnnotationSupport = changeAnnotationSupportJson != null
-        ? WorkspaceEditClientCapabilitiesChangeAnnotationSupport.fromJson(
-            changeAnnotationSupportJson as Map<String, Object?>)
-        : null;
+    final resourceOperationsJson = json['resourceOperations'];
+    final resourceOperations = (resourceOperationsJson as List<Object?>?)
+        ?.map((item) => ResourceOperationKind.fromJson(item as String))
+        .toList();
     return WorkspaceEditClientCapabilities(
+      changeAnnotationSupport: changeAnnotationSupport,
       documentChanges: documentChanges,
-      resourceOperations: resourceOperations,
       failureHandling: failureHandling,
       normalizesLineEndings: normalizesLineEndings,
-      changeAnnotationSupport: changeAnnotationSupport,
+      resourceOperations: resourceOperations,
     );
   }
 
@@ -44467,45 +44496,45 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (changeAnnotationSupport != null) {
+      __result['changeAnnotationSupport'] = changeAnnotationSupport?.toJson();
+    }
     if (documentChanges != null) {
       __result['documentChanges'] = documentChanges;
     }
-    if (resourceOperations != null) {
-      __result['resourceOperations'] =
-          resourceOperations?.map((item) => item.toJson()).toList();
-    }
     if (failureHandling != null) {
       __result['failureHandling'] = failureHandling?.toJson();
     }
     if (normalizesLineEndings != null) {
       __result['normalizesLineEndings'] = normalizesLineEndings;
     }
-    if (changeAnnotationSupport != null) {
-      __result['changeAnnotationSupport'] = changeAnnotationSupport?.toJson();
+    if (resourceOperations != null) {
+      __result['resourceOperations'] =
+          resourceOperations?.map((item) => item.toJson()).toList();
     }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('documentChanges');
+      reporter.push('changeAnnotationSupport');
       try {
-        final documentChanges = obj['documentChanges'];
-        if (documentChanges != null && !(documentChanges is bool)) {
-          reporter.reportError('must be of type bool');
+        final changeAnnotationSupport = obj['changeAnnotationSupport'];
+        if (changeAnnotationSupport != null &&
+            !(WorkspaceEditClientCapabilitiesChangeAnnotationSupport.canParse(
+                changeAnnotationSupport, reporter))) {
+          reporter.reportError(
+              'must be of type WorkspaceEditClientCapabilitiesChangeAnnotationSupport');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('resourceOperations');
+      reporter.push('documentChanges');
       try {
-        final resourceOperations = obj['resourceOperations'];
-        if (resourceOperations != null &&
-            !((resourceOperations is List<Object?> &&
-                (resourceOperations.every((item) =>
-                    ResourceOperationKind.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<ResourceOperationKind>');
+        final documentChanges = obj['documentChanges'];
+        if (documentChanges != null && !(documentChanges is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -44532,14 +44561,14 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('changeAnnotationSupport');
+      reporter.push('resourceOperations');
       try {
-        final changeAnnotationSupport = obj['changeAnnotationSupport'];
-        if (changeAnnotationSupport != null &&
-            !(WorkspaceEditClientCapabilitiesChangeAnnotationSupport.canParse(
-                changeAnnotationSupport, reporter))) {
-          reporter.reportError(
-              'must be of type WorkspaceEditClientCapabilitiesChangeAnnotationSupport');
+        final resourceOperations = obj['resourceOperations'];
+        if (resourceOperations != null &&
+            !((resourceOperations is List<Object?> &&
+                (resourceOperations.every((item) =>
+                    ResourceOperationKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<ResourceOperationKind>');
           return false;
         }
       } finally {
@@ -44556,12 +44585,12 @@
   bool operator ==(Object other) {
     if (other is WorkspaceEditClientCapabilities &&
         other.runtimeType == WorkspaceEditClientCapabilities) {
-      return documentChanges == other.documentChanges &&
-          listEqual(resourceOperations, other.resourceOperations,
-              (ResourceOperationKind a, ResourceOperationKind b) => a == b) &&
+      return changeAnnotationSupport == other.changeAnnotationSupport &&
+          documentChanges == other.documentChanges &&
           failureHandling == other.failureHandling &&
           normalizesLineEndings == other.normalizesLineEndings &&
-          changeAnnotationSupport == other.changeAnnotationSupport &&
+          listEqual(resourceOperations, other.resourceOperations,
+              (ResourceOperationKind a, ResourceOperationKind b) => a == b) &&
           true;
     }
     return false;
@@ -44569,11 +44598,11 @@
 
   @override
   int get hashCode => Object.hash(
+        changeAnnotationSupport,
         documentChanges,
-        lspHashCode(resourceOperations),
         failureHandling,
         normalizesLineEndings,
-        changeAnnotationSupport,
+        lspHashCode(resourceOperations),
       );
 
   @override
@@ -44656,17 +44685,17 @@
   );
 
   WorkspaceFolder({
-    required this.uri,
     required this.name,
+    required this.uri,
   });
   static WorkspaceFolder fromJson(Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
     final nameJson = json['name'];
     final name = nameJson as String;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
     return WorkspaceFolder(
-      uri: uri,
       name: name,
+      uri: uri,
     );
   }
 
@@ -44679,31 +44708,13 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
     __result['name'] = name;
+    __result['uri'] = uri;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final uri = obj['uri'];
-        if (uri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('name');
       try {
         if (!obj.containsKey('name')) {
@@ -44722,6 +44733,24 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type WorkspaceFolder');
@@ -44732,15 +44761,15 @@
   @override
   bool operator ==(Object other) {
     if (other is WorkspaceFolder && other.runtimeType == WorkspaceFolder) {
-      return uri == other.uri && name == other.name && true;
+      return name == other.name && uri == other.uri && true;
     }
     return false;
   }
 
   @override
   int get hashCode => Object.hash(
-        uri,
         name,
+        uri,
       );
 
   @override
@@ -44865,24 +44894,24 @@
   );
 
   WorkspaceFoldersServerCapabilities({
-    this.supported,
     this.changeNotifications,
+    this.supported,
   });
   static WorkspaceFoldersServerCapabilities fromJson(
       Map<String, Object?> json) {
-    final supportedJson = json['supported'];
-    final supported = supportedJson as bool?;
     final changeNotificationsJson = json['changeNotifications'];
     final changeNotifications = changeNotificationsJson == null
         ? null
-        : (changeNotificationsJson is String
-            ? Either2<String, bool>.t1(changeNotificationsJson)
-            : (changeNotificationsJson is bool
-                ? Either2<String, bool>.t2(changeNotificationsJson)
-                : (throw '''$changeNotificationsJson was not one of (String, bool)''')));
+        : (changeNotificationsJson is bool
+            ? Either2<bool, String>.t1(changeNotificationsJson)
+            : (changeNotificationsJson is String
+                ? Either2<bool, String>.t2(changeNotificationsJson)
+                : (throw '''$changeNotificationsJson was not one of (bool, String)''')));
+    final supportedJson = json['supported'];
+    final supported = supportedJson as bool?;
     return WorkspaceFoldersServerCapabilities(
-      supported: supported,
       changeNotifications: changeNotifications,
+      supported: supported,
     );
   }
 
@@ -44892,40 +44921,40 @@
   /// notification is registered on the client side. The ID can be used to
   /// unregister for these events using the `client/unregisterCapability`
   /// request.
-  final Either2<String, bool>? changeNotifications;
+  final Either2<bool, String>? changeNotifications;
 
   /// The server has support for workspace folders
   final bool? supported;
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    if (supported != null) {
-      __result['supported'] = supported;
-    }
     if (changeNotifications != null) {
       __result['changeNotifications'] = changeNotifications;
     }
+    if (supported != null) {
+      __result['supported'] = supported;
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('supported');
+      reporter.push('changeNotifications');
       try {
-        final supported = obj['supported'];
-        if (supported != null && !(supported is bool)) {
-          reporter.reportError('must be of type bool');
+        final changeNotifications = obj['changeNotifications'];
+        if (changeNotifications != null &&
+            !((changeNotifications is bool || changeNotifications is String))) {
+          reporter.reportError('must be of type Either2<bool, String>');
           return false;
         }
       } finally {
         reporter.pop();
       }
-      reporter.push('changeNotifications');
+      reporter.push('supported');
       try {
-        final changeNotifications = obj['changeNotifications'];
-        if (changeNotifications != null &&
-            !((changeNotifications is String || changeNotifications is bool))) {
-          reporter.reportError('must be of type Either2<String, bool>');
+        final supported = obj['supported'];
+        if (supported != null && !(supported is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -44943,8 +44972,8 @@
   bool operator ==(Object other) {
     if (other is WorkspaceFoldersServerCapabilities &&
         other.runtimeType == WorkspaceFoldersServerCapabilities) {
-      return supported == other.supported &&
-          changeNotifications == other.changeNotifications &&
+      return changeNotifications == other.changeNotifications &&
+          supported == other.supported &&
           true;
     }
     return false;
@@ -44952,8 +44981,8 @@
 
   @override
   int get hashCode => Object.hash(
-        supported,
         changeNotifications,
+        supported,
       );
 
   @override
@@ -44970,11 +44999,11 @@
   );
 
   WorkspaceFullDocumentDiagnosticReport({
-    required this.uri,
-    this.version,
+    required this.items,
     this.kind = 'full',
     this.resultId,
-    required this.items,
+    required this.uri,
+    this.version,
   }) {
     if (kind != 'full') {
       throw 'kind may only be the literal \'full\'';
@@ -44982,24 +45011,24 @@
   }
   static WorkspaceFullDocumentDiagnosticReport fromJson(
       Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
-    final versionJson = json['version'];
-    final version = versionJson as int?;
-    final kindJson = json['kind'];
-    final kind = kindJson as String;
-    final resultIdJson = json['resultId'];
-    final resultId = resultIdJson as String?;
     final itemsJson = json['items'];
     final items = (itemsJson as List<Object?>)
         .map((item) => Diagnostic.fromJson(item as Map<String, Object?>))
         .toList();
+    final kindJson = json['kind'];
+    final kind = kindJson as String;
+    final resultIdJson = json['resultId'];
+    final resultId = resultIdJson as String?;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int?;
     return WorkspaceFullDocumentDiagnosticReport(
-      uri: uri,
-      version: version,
+      items: items,
       kind: kind,
       resultId: resultId,
-      items: items,
+      uri: uri,
+      version: version,
     );
   }
 
@@ -45022,45 +45051,32 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
-    __result['version'] = version;
+    __result['items'] = items.map((item) => item.toJson()).toList();
     __result['kind'] = kind;
     if (resultId != null) {
       __result['resultId'] = resultId;
     }
-    __result['items'] = items.map((item) => item.toJson()).toList();
+    __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
+      reporter.push('items');
       try {
-        if (!obj.containsKey('uri')) {
+        if (!obj.containsKey('items')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final uri = obj['uri'];
-        if (uri == null) {
+        final items = obj['items'];
+        if (items == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('version');
-      try {
-        if (!obj.containsKey('version')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final version = obj['version'];
-        if (version != null && !(version is int)) {
-          reporter.reportError('must be of type int');
+        if (!((items is List<Object?> &&
+            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Diagnostic>');
           return false;
         }
       } finally {
@@ -45094,20 +45110,33 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('items');
+      reporter.push('uri');
       try {
-        if (!obj.containsKey('items')) {
+        if (!obj.containsKey('uri')) {
           reporter.reportError('must not be undefined');
           return false;
         }
-        final items = obj['items'];
-        if (items == null) {
+        final uri = obj['uri'];
+        if (uri == null) {
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List<Object?> &&
-            (items.every((item) => Diagnostic.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<Diagnostic>');
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version != null && !(version is int)) {
+          reporter.reportError('must be of type int');
           return false;
         }
       } finally {
@@ -45125,12 +45154,12 @@
   bool operator ==(Object other) {
     if (other is WorkspaceFullDocumentDiagnosticReport &&
         other.runtimeType == WorkspaceFullDocumentDiagnosticReport) {
-      return uri == other.uri &&
-          version == other.version &&
+      return listEqual(
+              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
           kind == other.kind &&
           resultId == other.resultId &&
-          listEqual(
-              items, other.items, (Diagnostic a, Diagnostic b) => a == b) &&
+          uri == other.uri &&
+          version == other.version &&
           true;
     }
     return false;
@@ -45138,11 +45167,11 @@
 
   @override
   int get hashCode => Object.hash(
-        uri,
-        version,
+        lspHashCode(items),
         kind,
         resultId,
-        lspHashCode(items),
+        uri,
+        version,
       );
 
   @override
@@ -45158,21 +45187,17 @@
   );
 
   WorkspaceSymbol({
-    required this.name,
-    required this.kind,
-    this.tags,
-    required this.location,
     this.containerName,
+    required this.kind,
+    required this.location,
+    required this.name,
+    this.tags,
   });
   static WorkspaceSymbol fromJson(Map<String, Object?> json) {
-    final nameJson = json['name'];
-    final name = nameJson as String;
+    final containerNameJson = json['containerName'];
+    final containerName = containerNameJson as String?;
     final kindJson = json['kind'];
     final kind = SymbolKind.fromJson(kindJson as int);
-    final tagsJson = json['tags'];
-    final tags = (tagsJson as List<Object?>?)
-        ?.map((item) => SymbolTag.fromJson(item as int))
-        .toList();
     final locationJson = json['location'];
     final location = Location.canParse(locationJson, nullLspJsonReporter)
         ? Either2<Location, WorkspaceSymbolLocation>.t1(
@@ -45182,14 +45207,18 @@
                 WorkspaceSymbolLocation.fromJson(
                     locationJson as Map<String, Object?>))
             : (throw '''$locationJson was not one of (Location, WorkspaceSymbolLocation)'''));
-    final containerNameJson = json['containerName'];
-    final containerName = containerNameJson as String?;
+    final nameJson = json['name'];
+    final name = nameJson as String;
+    final tagsJson = json['tags'];
+    final tags = (tagsJson as List<Object?>?)
+        ?.map((item) => SymbolTag.fromJson(item as int))
+        .toList();
     return WorkspaceSymbol(
-      name: name,
-      kind: kind,
-      tags: tags,
-      location: location,
       containerName: containerName,
+      kind: kind,
+      location: location,
+      name: name,
+      tags: tags,
     );
   }
 
@@ -45217,32 +45246,24 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['name'] = name;
-    __result['kind'] = kind.toJson();
-    if (tags != null) {
-      __result['tags'] = tags?.map((item) => item.toJson()).toList();
-    }
-    __result['location'] = location;
     if (containerName != null) {
       __result['containerName'] = containerName;
     }
+    __result['kind'] = kind.toJson();
+    __result['location'] = location;
+    __result['name'] = name;
+    if (tags != null) {
+      __result['tags'] = tags?.map((item) => item.toJson()).toList();
+    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('name');
+      reporter.push('containerName');
       try {
-        if (!obj.containsKey('name')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final name = obj['name'];
-        if (name == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(name is String)) {
+        final containerName = obj['containerName'];
+        if (containerName != null && !(containerName is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
@@ -45267,18 +45288,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('tags');
-      try {
-        final tags = obj['tags'];
-        if (tags != null &&
-            !((tags is List<Object?> &&
-                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<SymbolTag>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('location');
       try {
         if (!obj.containsKey('location')) {
@@ -45299,16 +45308,36 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('containerName');
+      reporter.push('name');
       try {
-        final containerName = obj['containerName'];
-        if (containerName != null && !(containerName is String)) {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final name = obj['name'];
+        if (name == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(name is String)) {
           reporter.reportError('must be of type String');
           return false;
         }
       } finally {
         reporter.pop();
       }
+      reporter.push('tags');
+      try {
+        final tags = obj['tags'];
+        if (tags != null &&
+            !((tags is List<Object?> &&
+                (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type WorkspaceSymbol');
@@ -45319,11 +45348,11 @@
   @override
   bool operator ==(Object other) {
     if (other is WorkspaceSymbol && other.runtimeType == WorkspaceSymbol) {
-      return name == other.name &&
+      return containerName == other.containerName &&
           kind == other.kind &&
-          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
           location == other.location &&
-          containerName == other.containerName &&
+          name == other.name &&
+          listEqual(tags, other.tags, (SymbolTag a, SymbolTag b) => a == b) &&
           true;
     }
     return false;
@@ -45331,11 +45360,11 @@
 
   @override
   int get hashCode => Object.hash(
-        name,
-        kind,
-        lspHashCode(tags),
-        location,
         containerName,
+        kind,
+        location,
+        name,
+        lspHashCode(tags),
       );
 
   @override
@@ -45350,13 +45379,18 @@
 
   WorkspaceSymbolClientCapabilities({
     this.dynamicRegistration,
+    this.resolveSupport,
     this.symbolKind,
     this.tagSupport,
-    this.resolveSupport,
   });
   static WorkspaceSymbolClientCapabilities fromJson(Map<String, Object?> json) {
     final dynamicRegistrationJson = json['dynamicRegistration'];
     final dynamicRegistration = dynamicRegistrationJson as bool?;
+    final resolveSupportJson = json['resolveSupport'];
+    final resolveSupport = resolveSupportJson != null
+        ? WorkspaceSymbolClientCapabilitiesResolveSupport.fromJson(
+            resolveSupportJson as Map<String, Object?>)
+        : null;
     final symbolKindJson = json['symbolKind'];
     final symbolKind = symbolKindJson != null
         ? WorkspaceSymbolClientCapabilitiesSymbolKind.fromJson(
@@ -45367,16 +45401,11 @@
         ? WorkspaceSymbolClientCapabilitiesTagSupport.fromJson(
             tagSupportJson as Map<String, Object?>)
         : null;
-    final resolveSupportJson = json['resolveSupport'];
-    final resolveSupport = resolveSupportJson != null
-        ? WorkspaceSymbolClientCapabilitiesResolveSupport.fromJson(
-            resolveSupportJson as Map<String, Object?>)
-        : null;
     return WorkspaceSymbolClientCapabilities(
       dynamicRegistration: dynamicRegistration,
+      resolveSupport: resolveSupport,
       symbolKind: symbolKind,
       tagSupport: tagSupport,
-      resolveSupport: resolveSupport,
     );
   }
 
@@ -45403,15 +45432,15 @@
     if (dynamicRegistration != null) {
       __result['dynamicRegistration'] = dynamicRegistration;
     }
+    if (resolveSupport != null) {
+      __result['resolveSupport'] = resolveSupport?.toJson();
+    }
     if (symbolKind != null) {
       __result['symbolKind'] = symbolKind?.toJson();
     }
     if (tagSupport != null) {
       __result['tagSupport'] = tagSupport?.toJson();
     }
-    if (resolveSupport != null) {
-      __result['resolveSupport'] = resolveSupport?.toJson();
-    }
     return __result;
   }
 
@@ -45427,6 +45456,19 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('resolveSupport');
+      try {
+        final resolveSupport = obj['resolveSupport'];
+        if (resolveSupport != null &&
+            !(WorkspaceSymbolClientCapabilitiesResolveSupport.canParse(
+                resolveSupport, reporter))) {
+          reporter.reportError(
+              'must be of type WorkspaceSymbolClientCapabilitiesResolveSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('symbolKind');
       try {
         final symbolKind = obj['symbolKind'];
@@ -45453,19 +45495,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('resolveSupport');
-      try {
-        final resolveSupport = obj['resolveSupport'];
-        if (resolveSupport != null &&
-            !(WorkspaceSymbolClientCapabilitiesResolveSupport.canParse(
-                resolveSupport, reporter))) {
-          reporter.reportError(
-              'must be of type WorkspaceSymbolClientCapabilitiesResolveSupport');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type WorkspaceSymbolClientCapabilities');
@@ -45478,9 +45507,9 @@
     if (other is WorkspaceSymbolClientCapabilities &&
         other.runtimeType == WorkspaceSymbolClientCapabilities) {
       return dynamicRegistration == other.dynamicRegistration &&
+          resolveSupport == other.resolveSupport &&
           symbolKind == other.symbolKind &&
           tagSupport == other.tagSupport &&
-          resolveSupport == other.resolveSupport &&
           true;
     }
     return false;
@@ -45489,9 +45518,9 @@
   @override
   int get hashCode => Object.hash(
         dynamicRegistration,
+        resolveSupport,
         symbolKind,
         tagSupport,
-        resolveSupport,
       );
 
   @override
@@ -45896,11 +45925,19 @@
   );
 
   WorkspaceSymbolParams({
+    this.partialResultToken,
     required this.query,
     this.workDoneToken,
-    this.partialResultToken,
   });
   static WorkspaceSymbolParams fromJson(Map<String, Object?> json) {
+    final partialResultTokenJson = json['partialResultToken'];
+    final partialResultToken = partialResultTokenJson == null
+        ? null
+        : (partialResultTokenJson is int
+            ? Either2<int, String>.t1(partialResultTokenJson)
+            : (partialResultTokenJson is String
+                ? Either2<int, String>.t2(partialResultTokenJson)
+                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     final queryJson = json['query'];
     final query = queryJson as String;
     final workDoneTokenJson = json['workDoneToken'];
@@ -45911,18 +45948,10 @@
             : (workDoneTokenJson is String
                 ? Either2<int, String>.t2(workDoneTokenJson)
                 : (throw '''$workDoneTokenJson was not one of (int, String)''')));
-    final partialResultTokenJson = json['partialResultToken'];
-    final partialResultToken = partialResultTokenJson == null
-        ? null
-        : (partialResultTokenJson is int
-            ? Either2<int, String>.t1(partialResultTokenJson)
-            : (partialResultTokenJson is String
-                ? Either2<int, String>.t2(partialResultTokenJson)
-                : (throw '''$partialResultTokenJson was not one of (int, String)''')));
     return WorkspaceSymbolParams(
+      partialResultToken: partialResultToken,
       query: query,
       workDoneToken: workDoneToken,
-      partialResultToken: partialResultToken,
     );
   }
 
@@ -45939,18 +45968,29 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     __result['query'] = query;
     if (workDoneToken != null) {
       __result['workDoneToken'] = workDoneToken;
     }
-    if (partialResultToken != null) {
-      __result['partialResultToken'] = partialResultToken;
-    }
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
+      reporter.push('partialResultToken');
+      try {
+        final partialResultToken = obj['partialResultToken'];
+        if (partialResultToken != null &&
+            !((partialResultToken is int || partialResultToken is String))) {
+          reporter.reportError('must be of type Either2<int, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('query');
       try {
         if (!obj.containsKey('query')) {
@@ -45980,17 +46020,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('partialResultToken');
-      try {
-        final partialResultToken = obj['partialResultToken'];
-        if (partialResultToken != null &&
-            !((partialResultToken is int || partialResultToken is String))) {
-          reporter.reportError('must be of type Either2<int, String>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError('must be of type WorkspaceSymbolParams');
@@ -46002,9 +46031,9 @@
   bool operator ==(Object other) {
     if (other is WorkspaceSymbolParams &&
         other.runtimeType == WorkspaceSymbolParams) {
-      return query == other.query &&
+      return partialResultToken == other.partialResultToken &&
+          query == other.query &&
           workDoneToken == other.workDoneToken &&
-          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -46012,9 +46041,9 @@
 
   @override
   int get hashCode => Object.hash(
+        partialResultToken,
         query,
         workDoneToken,
-        partialResultToken,
       );
 
   @override
@@ -46122,10 +46151,10 @@
   );
 
   WorkspaceUnchangedDocumentDiagnosticReport({
-    required this.uri,
-    this.version,
     this.kind = 'unchanged',
     required this.resultId,
+    required this.uri,
+    this.version,
   }) {
     if (kind != 'unchanged') {
       throw 'kind may only be the literal \'unchanged\'';
@@ -46133,19 +46162,19 @@
   }
   static WorkspaceUnchangedDocumentDiagnosticReport fromJson(
       Map<String, Object?> json) {
-    final uriJson = json['uri'];
-    final uri = uriJson as String;
-    final versionJson = json['version'];
-    final version = versionJson as int?;
     final kindJson = json['kind'];
     final kind = kindJson as String;
     final resultIdJson = json['resultId'];
     final resultId = resultIdJson as String;
+    final uriJson = json['uri'];
+    final uri = uriJson as String;
+    final versionJson = json['version'];
+    final version = versionJson as int?;
     return WorkspaceUnchangedDocumentDiagnosticReport(
-      uri: uri,
-      version: version,
       kind: kind,
       resultId: resultId,
+      uri: uri,
+      version: version,
     );
   }
 
@@ -46166,47 +46195,15 @@
 
   Map<String, Object?> toJson() {
     var __result = <String, Object?>{};
-    __result['uri'] = uri;
-    __result['version'] = version;
     __result['kind'] = kind;
     __result['resultId'] = resultId;
+    __result['uri'] = uri;
+    __result['version'] = version;
     return __result;
   }
 
   static bool canParse(Object? obj, LspJsonReporter reporter) {
     if (obj is Map<String, Object?>) {
-      reporter.push('uri');
-      try {
-        if (!obj.containsKey('uri')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final uri = obj['uri'];
-        if (uri == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(uri is String)) {
-          reporter.reportError('must be of type String');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
-      reporter.push('version');
-      try {
-        if (!obj.containsKey('version')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        final version = obj['version'];
-        if (version != null && !(version is int)) {
-          reporter.reportError('must be of type int');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('kind');
       try {
         if (!obj.containsKey('kind')) {
@@ -46243,6 +46240,38 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('uri');
+      try {
+        if (!obj.containsKey('uri')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final uri = obj['uri'];
+        if (uri == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(uri is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (!obj.containsKey('version')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        final version = obj['version'];
+        if (version != null && !(version is int)) {
+          reporter.reportError('must be of type int');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError(
@@ -46255,10 +46284,10 @@
   bool operator ==(Object other) {
     if (other is WorkspaceUnchangedDocumentDiagnosticReport &&
         other.runtimeType == WorkspaceUnchangedDocumentDiagnosticReport) {
-      return uri == other.uri &&
-          version == other.version &&
-          kind == other.kind &&
+      return kind == other.kind &&
           resultId == other.resultId &&
+          uri == other.uri &&
+          version == other.version &&
           true;
     }
     return false;
@@ -46266,10 +46295,10 @@
 
   @override
   int get hashCode => Object.hash(
-        uri,
-        version,
         kind,
         resultId,
+        uri,
+        version,
       );
 
   @override
diff --git a/pkg/analysis_server/lib/src/cider/document_symbols.dart b/pkg/analysis_server/lib/src/cider/document_symbols.dart
index f8c77758..0e6fe0e 100644
--- a/pkg/analysis_server/lib/src/cider/document_symbols.dart
+++ b/pkg/analysis_server/lib/src/cider/document_symbols.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart' hide Outline;
 import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/cider/signature_help.dart b/pkg/analysis_server/lib/src/cider/signature_help.dart
index 107060e..d6fc27a 100644
--- a/pkg/analysis_server/lib/src/cider/signature_help.dart
+++ b/pkg/analysis_server/lib/src/cider/signature_help.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/computer/computer_signature.dart';
 import 'package:analysis_server/src/computer/computer_type_arguments_signature.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 8ae64a3..5c6934c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -7,7 +7,7 @@
 import 'package:_fe_analyzer_shared/src/parser/quote.dart'
     show analyzeQuote, Quote, firstQuoteLength, lastQuoteLength;
 import 'package:_fe_analyzer_shared/src/scanner/characters.dart' as char;
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart'
+import 'package:analysis_server/lsp_protocol/protocol.dart'
     show SemanticTokenTypes, SemanticTokenModifiers;
 import 'package:analysis_server/src/lsp/constants.dart'
     show CustomSemanticTokenModifiers, CustomSemanticTokenTypes;
diff --git a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
index 800ff38..e6831bc 100644
--- a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analysis_server/src/computer/computer_hover.dart';
 import 'package:analysis_server/src/lsp/dartdoc.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
@@ -98,7 +98,7 @@
       lsp.SignatureInformation(
         label: label,
         documentation: documentation != null
-            ? asStringOrMarkupContent(preferredFormats, documentation)
+            ? asMarkupContentOrString(preferredFormats, documentation)
             : null,
         parameters: parameters,
       ),
diff --git a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
index 506a745..4da59dc 100644
--- a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
@@ -6,8 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/lsp/lsp_packet_transformer.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart b/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart
index d6fa717..236e9d0 100644
--- a/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart
+++ b/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
 /// The abstract class [LspServerCommunicationChannel] defines the behavior of
diff --git a/pkg/analysis_server/lib/src/lsp/client_capabilities.dart b/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
index 9a50687..2a172ca 100644
--- a/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
+++ b/pkg/analysis_server/lib/src/lsp/client_capabilities.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 
 /// Wraps the client (editor) capabilities to improve performance.
 ///
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
index cb2da70..de28ea1 100644
--- a/pkg/analysis_server/lib/src/lsp/constants.dart
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 
 /// The characters that will cause the editor to automatically commit the selected
 /// completion item.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/abstract_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/abstract_refactor.dart
index 7c080cb..c710951 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/abstract_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/abstract_refactor.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/fix_all.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/fix_all.dart
index 01f0d88..c0c9aa7 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/fix_all.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/fix_all.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
index 5ef9c07..5e5bcf9 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
index 4f9fb46..018892a 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/abstract_refactor.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart
index 228e211..0043490 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/send_workspace_edit.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
index 317d1b9..467039d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
index bb0ff93..7634396 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/validate_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/validate_refactor.dart
index 402e934..72107e8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/validate_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/validate_refactor.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/abstract_refactor.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/progress.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart
index 3c081c8..067b15e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_diagnostic_server.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
index f3e68d1..4dde991 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_reanalyze.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart
index 46ab360..b9b0cd9 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_super.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart
index a2d3280..abc2644 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_cancel_request.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
 class CancelRequestHandler extends MessageHandler<CancelParams, void> {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
index ee5e401..590e49d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
 class WorkspaceFoldersHandler
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
index 93248df..82d2c4b 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index b624eed..0440ae0 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -4,9 +4,7 @@
 
 import 'dart:math' as math;
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
index 4a7b49b..195fe66 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
@@ -2,10 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart'
-    hide Element;
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart' hide Element;
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
@@ -123,7 +120,7 @@
         final dartDoc =
             analyzer.getDartDocPlainText(element.documentationComment);
         final documentation =
-            dartDoc != null ? asStringOrMarkupContent(formats, dartDoc) : null;
+            dartDoc != null ? asMarkupContentOrString(formats, dartDoc) : null;
         final supportsInsertReplace =
             clientCapabilities.insertReplaceCompletionRanges;
 
@@ -155,14 +152,14 @@
           insertText: newInsertText,
           insertTextFormat: item.insertTextFormat,
           textEdit: supportsInsertReplace && insertionRange != replacementRange
-              ? Either2<TextEdit, InsertReplaceEdit>.t2(
+              ? Either2<InsertReplaceEdit, TextEdit>.t1(
                   InsertReplaceEdit(
                     insert: insertionRange,
                     replace: replacementRange,
                     newText: newInsertText,
                   ),
                 )
-              : Either2<TextEdit, InsertReplaceEdit>.t1(
+              : Either2<InsertReplaceEdit, TextEdit>.t2(
                   TextEdit(
                     range: replacementRange,
                     newText: newInsertText,
@@ -256,7 +253,7 @@
       tags: item.tags,
       detail: item.detail,
       documentation: description != null
-          ? Either2<String, MarkupContent>.t1(description)
+          ? Either2<MarkupContent, String>.t2(description)
           : null,
       deprecated: item.deprecated,
       preselect: item.preselect,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
index 39e7fe8..a066a4c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart' hide Element;
 import 'package:analysis_server/protocol/protocol_generated.dart'
     hide AnalysisGetNavigationParams;
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
index d632039..51e1a16 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/computer/computer_color.dart'
     show ColorComputer, ColorReference;
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
index 3a14093..e5958a2 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
index 4b3bba5..0ffe8e5 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
index 38754f9..1e67440 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart' hide Outline;
 import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
index 4cbde68..ebf7cdc 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/fix_all.dart';
 import 'package:analysis_server/src/lsp/handlers/commands/organize_imports.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
index 56923e8..e351b48 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
@@ -4,8 +4,7 @@
 
 import 'dart:io';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
 class ExitMessageHandler extends MessageHandler<void, void> {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
index 27590e6..8c93f1c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_folding.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/computer/computer_folding.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
index 23cfd7d..f2d4a05 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
index ab8a7c1..b1200e6 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_range.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
index 10df929..36dafd6 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
index eaebf09..30ca65f 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/computer/computer_hover.dart';
 import 'package:analysis_server/src/lsp/dartdoc.dart';
@@ -85,7 +84,7 @@
     final formats = server.clientCapabilities?.hoverContentFormats;
     return Hover(
       contents:
-          asStringOrMarkupContent(formats, content.toString().trimRight()),
+          asMarkupContentOrString(formats, content.toString().trimRight()),
       range: toRange(lineInfo, hover.offset, hover.length),
     );
   }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart
index 2d74fe1..923248d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_implementation.dart
@@ -2,9 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart'
+import 'package:analysis_server/lsp_protocol/protocol.dart'
     hide TypeHierarchyItem;
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index 0d08fba..131daee 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -4,8 +4,7 @@
 
 import 'dart:io';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
index 912ab3c..e728d79 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
index 69aef3b..866b7e8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/protocol_server.dart' show SearchResult;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
index ddc4740..105a9e2 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
 /// A [MessageHandler] that rejects specific tpyes of messages with a given
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
index bd313fc..9e9088d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/client_configuration.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_select_range.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_select_range.dart
index 34a7f0a..01b2e76 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_select_range.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_select_range.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/computer/computer_selection_ranges.dart'
     hide SelectionRange;
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_semantic_tokens.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_semantic_tokens.dart
index cb6ea2a..52c5275 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_semantic_tokens.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_semantic_tokens.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
index 14a1273..4655b69 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
index 743f981..9d2018b 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/computer/computer_signature.dart';
 import 'package:analysis_server/src/computer/computer_type_arguments_signature.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index 8b130ae..5369d17 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/custom/handler_diagnostic_server.dart';
 import 'package:analysis_server/src/lsp/handlers/custom/handler_reanalyze.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
index aa59bfc..4376b67 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
index 2f75106..27198de 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_will_rename_files.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_will_rename_files.dart
index a34724b..ee8a2a4 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_will_rename_files.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_will_rename_files.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart
index 092d62b..b7bac11 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_configuration.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 
 class WorkspaceDidChangeConfigurationMessageHandler
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
index ad70de7..83e5bb5 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analyzer/src/dart/analysis/search.dart' as search;
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index a51eed8..3a80bca 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_cancel_request.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 0869d24..2a54557 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -4,9 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/computer/computer_closingLabels.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
index b2cb46f..34ca0ab 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 176162a..ff0fc5e 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -5,13 +5,8 @@
 import 'dart:io';
 import 'dart:math';
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart'
-    as lsp;
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
 import 'package:analysis_server/src/lsp/constants.dart' as lsp;
@@ -62,12 +57,12 @@
 /// field.
 final _upgradableDocCompletePattern = RegExp(r'^_([\w ]{0,20})_$');
 
-lsp.Either2<String, lsp.MarkupContent> asStringOrMarkupContent(
+lsp.Either2<lsp.MarkupContent, String> asMarkupContentOrString(
     Set<lsp.MarkupKind>? preferredFormats, String content) {
-  return preferredFormats == null
-      ? lsp.Either2<String, lsp.MarkupContent>.t1(content)
-      : lsp.Either2<String, lsp.MarkupContent>.t2(
-          _asMarkup(preferredFormats, content));
+  return preferredFormats != null
+      ? lsp.Either2<lsp.MarkupContent, String>.t1(
+          _asMarkup(preferredFormats, content))
+      : lsp.Either2<lsp.MarkupContent, String>.t2(content);
 }
 
 /// Creates a [lsp.WorkspaceEdit] from simple [server.SourceFileEdit]s.
@@ -98,7 +93,7 @@
 /// Create a [WorkspaceEdit] that renames [oldPath] to [newPath].
 WorkspaceEdit createRenameEdit(String oldPath, String newPath) {
   final changes =
-      <Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>[];
+      <Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>[];
 
   final rename = RenameFile(
     oldUri: Uri.file(oldPath).toString(),
@@ -106,16 +101,14 @@
   );
 
   final renameUnion =
-      Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t3(rename);
+      Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>.t3(rename);
 
   changes.add(renameUnion);
 
   final edit = WorkspaceEdit(
       documentChanges: Either2<
-          List<TextDocumentEdit>,
-          List<
-              Either4<TextDocumentEdit, CreateFile, RenameFile,
-                  DeleteFile>>>.t2(changes));
+          List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>,
+          List<TextDocumentEdit>>.t1(changes));
   return edit;
 }
 
@@ -169,21 +162,21 @@
   final textDocumentEdit = lsp.TextDocumentEdit(
     textDocument: server.getVersionedDocumentIdentifier(fileEdit.file),
     edits: snippetEdits
-        .map((e) => Either3<lsp.SnippetTextEdit, lsp.AnnotatedTextEdit,
-            lsp.TextEdit>.t1(e))
+        .map((e) => Either3<lsp.AnnotatedTextEdit, lsp.SnippetTextEdit,
+            lsp.TextEdit>.t2(e))
         .toList(),
   );
 
   // Convert to the union that documentChanges require.
-  final textDocumentEditsAsUnion = Either4<lsp.TextDocumentEdit, lsp.CreateFile,
-      lsp.RenameFile, lsp.DeleteFile>.t1(textDocumentEdit);
+  final textDocumentEditsAsUnion = Either4<lsp.CreateFile, lsp.DeleteFile,
+      lsp.RenameFile, lsp.TextDocumentEdit>.t4(textDocumentEdit);
 
   // Convert to the union that documentChanges is.
   final documentChanges = Either2<
-      List<lsp.TextDocumentEdit>,
       List<
-          Either4<lsp.TextDocumentEdit, lsp.CreateFile, lsp.RenameFile,
-              lsp.DeleteFile>>>.t2([textDocumentEditsAsUnion]);
+          Either4<lsp.CreateFile, lsp.DeleteFile, lsp.RenameFile,
+              lsp.TextDocumentEdit>>,
+      List<lsp.TextDocumentEdit>>.t1([textDocumentEditsAsUnion]);
 
   /// Add the textDocumentEdit to a WorkspaceEdit.
   return lsp.WorkspaceEdit(documentChanges: documentChanges);
@@ -700,24 +693,22 @@
   // TODO(dantup): This method (and much other code here) should be
   // significantly tidied up when nonfunction-type-aliases is available here.
   final changes =
-      <Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>[];
+      <Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>[];
 
   for (final edit in edits) {
     // Flatten the Either into just the Union side to get a flat list.
     final flatResourceChanges = edit.documentChanges!.map(
-      (edits) => edits.map((e) =>
-          Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t1(e)),
       (resources) => resources,
+      (edits) => edits.map((e) =>
+          Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>.t4(e)),
     );
     changes.addAll(flatResourceChanges);
   }
 
   return WorkspaceEdit(
       documentChanges: Either2<
-          List<TextDocumentEdit>,
-          List<
-              Either4<TextDocumentEdit, CreateFile, RenameFile,
-                  DeleteFile>>>.t2(changes));
+          List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>,
+          List<TextDocumentEdit>>.t1(changes));
 }
 
 lsp.Location navigationTargetToLocation(
@@ -1027,7 +1018,7 @@
     kind: lsp.CompletionItemKind.Snippet,
     command: command,
     documentation: documentation != null
-        ? asStringOrMarkupContent(formats, documentation)
+        ? asMarkupContentOrString(formats, documentation)
         : null,
     // Force snippets to be sorted at the bottom of the list.
     // TODO(dantup): Consider if we can rank these better. Client-side
@@ -1036,7 +1027,7 @@
     sortText: 'zzz${snippet.prefix}',
     insertTextFormat: lsp.InsertTextFormat.Snippet,
     insertTextMode: supportsAsIsInsertMode ? InsertTextMode.asIs : null,
-    textEdit: Either2<TextEdit, InsertReplaceEdit>.t1(mainEdit),
+    textEdit: Either2<InsertReplaceEdit, TextEdit>.t2(mainEdit),
     additionalTextEdits: nonMainEdits,
   );
 }
@@ -1227,7 +1218,7 @@
     data: resolutionData,
     detail: detail,
     documentation: cleanedDoc != null
-        ? asStringOrMarkupContent(formats, cleanedDoc)
+        ? asMarkupContentOrString(formats, cleanedDoc)
         : null,
     deprecated: supportsCompletionDeprecatedFlag && suggestion.isDeprecated
         ? true
@@ -1248,14 +1239,14 @@
     textEdit: (insertionRange == null || replacementRange == null)
         ? null
         : supportsInsertReplace && insertionRange != replacementRange
-            ? Either2<TextEdit, InsertReplaceEdit>.t2(
+            ? Either2<InsertReplaceEdit, TextEdit>.t1(
                 InsertReplaceEdit(
                   insert: insertionRange,
                   replace: replacementRange,
                   newText: insertText,
                 ),
               )
-            : Either2<TextEdit, InsertReplaceEdit>.t1(
+            : Either2<InsertReplaceEdit, TextEdit>.t2(
                 TextEdit(
                   range: replacementRange,
                   newText: insertText,
@@ -1481,7 +1472,7 @@
       lsp.SignatureInformation(
         label: getSignatureLabel(signature),
         documentation: cleanedDoc != null
-            ? asStringOrMarkupContent(preferredFormats, cleanedDoc)
+            ? asMarkupContentOrString(preferredFormats, cleanedDoc)
             : null,
         parameters: signature.parameters.map(toParameterInfo).toList(),
       ),
@@ -1567,7 +1558,7 @@
           .toList());
 }
 
-Either3<lsp.SnippetTextEdit, lsp.AnnotatedTextEdit, lsp.TextEdit>
+Either3<lsp.AnnotatedTextEdit, lsp.SnippetTextEdit, lsp.TextEdit>
     toTextDocumentEditEdit(
   LspClientCapabilities capabilities,
   server.LineInfo lineInfo,
@@ -1577,10 +1568,10 @@
 }) {
   if (!capabilities.experimentalSnippetTextEdit ||
       selectionOffsetRelative == null) {
-    return Either3<lsp.SnippetTextEdit, lsp.AnnotatedTextEdit, lsp.TextEdit>.t3(
+    return Either3<lsp.AnnotatedTextEdit, lsp.SnippetTextEdit, lsp.TextEdit>.t3(
         toTextEdit(lineInfo, edit));
   }
-  return Either3<lsp.SnippetTextEdit, lsp.AnnotatedTextEdit, lsp.TextEdit>.t1(
+  return Either3<lsp.AnnotatedTextEdit, lsp.SnippetTextEdit, lsp.TextEdit>.t2(
       snippetTextEditWithSelection(lineInfo, edit,
           selectionOffsetRelative: selectionOffsetRelative,
           selectionLength: selectionLength));
@@ -1601,8 +1592,8 @@
   if (supportsDocumentChanges) {
     final supportsCreate = capabilities.createResourceOperations;
     final changes = <
-        Either4<lsp.TextDocumentEdit, lsp.CreateFile, lsp.RenameFile,
-            lsp.DeleteFile>>[];
+        Either4<lsp.CreateFile, lsp.DeleteFile, lsp.RenameFile,
+            lsp.TextDocumentEdit>>[];
 
     // Convert each SourceEdit to either a TextDocumentEdit or a
     // CreateFile + a TextDocumentEdit depending on whether it's a new
@@ -1610,23 +1601,23 @@
     for (final edit in edits) {
       if (supportsCreate && edit.newFile) {
         final create = lsp.CreateFile(uri: edit.doc.uri);
-        final createUnion = Either4<lsp.TextDocumentEdit, lsp.CreateFile,
-            lsp.RenameFile, lsp.DeleteFile>.t2(create);
+        final createUnion = Either4<lsp.CreateFile, lsp.DeleteFile,
+            lsp.RenameFile, lsp.TextDocumentEdit>.t1(create);
         changes.add(createUnion);
       }
 
       final textDocEdit = toTextDocumentEdit(capabilities, edit);
-      final textDocEditUnion = Either4<lsp.TextDocumentEdit, lsp.CreateFile,
-          lsp.RenameFile, lsp.DeleteFile>.t1(textDocEdit);
+      final textDocEditUnion = Either4<lsp.CreateFile, lsp.DeleteFile,
+          lsp.RenameFile, lsp.TextDocumentEdit>.t4(textDocEdit);
       changes.add(textDocEditUnion);
     }
 
     return lsp.WorkspaceEdit(
         documentChanges: Either2<
-            List<lsp.TextDocumentEdit>,
             List<
-                Either4<lsp.TextDocumentEdit, lsp.CreateFile, lsp.RenameFile,
-                    lsp.DeleteFile>>>.t2(changes));
+                Either4<lsp.CreateFile, lsp.DeleteFile, lsp.RenameFile,
+                    lsp.TextDocumentEdit>>,
+            List<lsp.TextDocumentEdit>>.t1(changes));
   } else {
     return lsp.WorkspaceEdit(changes: toWorkspaceEditChanges(edits));
   }
diff --git a/pkg/analysis_server/lib/src/lsp/notification_manager.dart b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
index bae8def..46796d3 100644
--- a/pkg/analysis_server/lib/src/lsp/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/lsp/notification_manager.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/progress.dart b/pkg/analysis_server/lib/src/lsp/progress.dart
index 398d0b0..370f54e 100644
--- a/pkg/analysis_server/lib/src/lsp/progress.dart
+++ b/pkg/analysis_server/lib/src/lsp/progress.dart
@@ -5,8 +5,7 @@
 import 'dart:async';
 import 'dart:math';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 
 /// Reports progress of long-running operations to the LSP client.
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
index 170ff22..9689ab2 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/encoder.dart
@@ -5,7 +5,7 @@
 import 'dart:collection';
 import 'dart:math' as math;
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/semantic_tokens/legend.dart';
 import 'package:analysis_server/src/lsp/semantic_tokens/mapping.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart
index 5106306..1a49ca3 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/legend.dart
@@ -4,7 +4,7 @@
 
 import 'dart:math' as math;
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/semantic_tokens/mapping.dart';
 import 'package:meta/meta.dart';
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
index 68e43fd..5c9b19f 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index 7a67a93..7147ebd 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/client_capabilities.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
@@ -138,12 +137,12 @@
   Set<Registration> currentRegistrations = {};
   var _lastRegistrationId = 0;
 
-  final dartFiles = DocumentFilter(language: 'dart', scheme: 'file');
-  final pubspecFile = DocumentFilter(
+  final dartFiles = TextDocumentFilter(language: 'dart', scheme: 'file');
+  final pubspecFile = TextDocumentFilter(
       language: 'yaml', scheme: 'file', pattern: '**/pubspec.yaml');
-  final analysisOptionsFile = DocumentFilter(
+  final analysisOptionsFile = TextDocumentFilter(
       language: 'yaml', scheme: 'file', pattern: '**/analysis_options.yaml');
-  final fixDataFile = DocumentFilter(
+  final fixDataFile = TextDocumentFilter(
       language: 'yaml', scheme: 'file', pattern: '**/lib/fix_data.yaml');
 
   ServerCapabilitiesComputer(this._server);
@@ -168,7 +167,7 @@
     return ServerCapabilities(
       textDocumentSync: dynamicRegistrations.textSync
           ? null
-          : Either2<TextDocumentSyncOptions, TextDocumentSyncKind>.t1(
+          : Either2<TextDocumentSyncKind, TextDocumentSyncOptions>.t2(
               TextDocumentSyncOptions(
               // The open/close and sync kind flags are registered dynamically if the
               // client supports them, so these static registrations are based on whether
@@ -280,7 +279,7 @@
       workspace: ServerCapabilitiesWorkspace(
         workspaceFolders: WorkspaceFoldersServerCapabilities(
           supported: true,
-          changeNotifications: Either2<String, bool>.t2(true),
+          changeNotifications: Either2<bool, String>.t1(true),
         ),
         fileOperations: dynamicRegistrations.fileOperations
             ? null
@@ -304,7 +303,7 @@
         // All published plugins use something like `*.extension` as
         // interestingFiles. Prefix a `**/` so that the glob matches nested
         // folders as well.
-        .map((glob) => DocumentFilter(scheme: 'file', pattern: '**/$glob'));
+        .map((glob) => TextDocumentFilter(scheme: 'file', pattern: '**/$glob'));
     final pluginTypesExcludingDart =
         pluginTypes.where((filter) => filter.pattern != '**/*.dart');
 
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
index 1e2b464..e41855e 100644
--- a/pkg/analysis_server/lib/src/lsp/source_edits.dart
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/protocol_server.dart' as server
     show SourceEdit;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart b/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart
index 69e49fe..1fbda62 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/fuzzy_filter_sort.dart
@@ -17,7 +17,7 @@
   var matcher = FuzzyMatcher(pattern, matchStyle: MatchStyle.SYMBOL);
 
   double score(CompletionSuggestionBuilder suggestion) {
-    var textToMatch = suggestion.completion;
+    var textToMatch = suggestion.textToMatch;
 
     if (suggestion.kind == CompletionSuggestionKind.KEYWORD ||
         suggestion.kind == CompletionSuggestionKind.NAMED_ARGUMENT) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 74c2841..53e5e32 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -41,6 +41,9 @@
   /// See [CompletionSuggestion.relevance].
   int get relevance;
 
+  /// Return the text that should be matched against the filter.
+  String get textToMatch;
+
   CompletionSuggestion build();
 }
 
@@ -82,6 +85,9 @@
   }
 
   @override
+  String get textToMatch => completion;
+
+  @override
   CompletionSuggestion build() {
     return CompletionSuggestion(
       kind,
@@ -966,7 +972,10 @@
         displayText: displayText);
     suggestion.element = protocol.convertElement(element,
         withNullability: _isNonNullableByDefault);
-    _addSuggestion(suggestion);
+    _addSuggestion(
+      suggestion,
+      textToMatchOverride: element.displayName,
+    );
   }
 
   /// Add a suggestion for a [parameter].
@@ -1177,9 +1186,15 @@
 
   /// Add the given [suggestion] if it isn't shadowed by a previously added
   /// suggestion.
-  void _addSuggestion(protocol.CompletionSuggestion suggestion) {
+  void _addSuggestion(
+    protocol.CompletionSuggestion suggestion, {
+    String? textToMatchOverride,
+  }) {
     _addBuilder(
-      ValueCompletionSuggestionBuilder(suggestion),
+      ValueCompletionSuggestionBuilder(
+        suggestion,
+        textToMatchOverride: textToMatchOverride,
+      ),
     );
   }
 
@@ -1523,8 +1538,12 @@
 /// [CompletionSuggestionBuilder] that is based on a [CompletionSuggestion].
 class ValueCompletionSuggestionBuilder implements CompletionSuggestionBuilder {
   final CompletionSuggestion _suggestion;
+  final String? _textToMatchOverride;
 
-  ValueCompletionSuggestionBuilder(this._suggestion);
+  ValueCompletionSuggestionBuilder(
+    this._suggestion, {
+    String? textToMatchOverride,
+  }) : _textToMatchOverride = textToMatchOverride;
 
   @override
   String get completion => _suggestion.completion;
@@ -1539,6 +1558,9 @@
   int get relevance => _suggestion.relevance;
 
   @override
+  String get textToMatch => _textToMatchOverride ?? completion;
+
+  @override
   CompletionSuggestion build() {
     return _suggestion;
   }
diff --git a/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart b/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
index 214cf6f..43dfdd4 100644
--- a/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
index 2f6f70b..7d0ab6c 100644
--- a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_byte_stream_channel.dart';
 import 'package:analysis_server/src/services/pub/pub_command.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
diff --git a/pkg/analysis_server/test/lsp/analyzer_status_test.dart b/pkg/analysis_server/test/lsp/analyzer_status_test.dart
index b7c9b792..aed95e7 100644
--- a/pkg/analysis_server/test/lsp/analyzer_status_test.dart
+++ b/pkg/analysis_server/test/lsp/analyzer_status_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -33,7 +33,7 @@
 abstract class AnalyzerStatusTest extends AbstractLspAnalysisServerTest {
   bool get progressSupport;
 
-  ClientCapabilitiesWindow get _windowCapabilities => progressSupport
+  WindowClientCapabilities get _windowCapabilities => progressSupport
       ? withWorkDoneProgressSupport(emptyWindowClientCapabilities)
       : emptyWindowClientCapabilities;
 
diff --git a/pkg/analysis_server/test/lsp/cancel_request_test.dart b/pkg/analysis_server/test/lsp/cancel_request_test.dart
index f967928..0101b06 100644
--- a/pkg/analysis_server/test/lsp/cancel_request_test.dart
+++ b/pkg/analysis_server/test/lsp/cancel_request_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/code_actions_abstract.dart b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
index cd29ba9..4eef36f 100644
--- a/pkg/analysis_server/test/lsp/code_actions_abstract.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:collection/collection.dart';
 import 'package:test/test.dart';
 
diff --git a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
index 21685a5..ad18e28 100644
--- a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
@@ -4,9 +4,7 @@
 
 import 'dart:convert';
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:collection/collection.dart';
@@ -132,6 +130,9 @@
         "textDocument": {
           "uri": "${mainFileUri.toString()}"
         },
+        "context": {
+          "diagnostics": []
+        },
         "range": {
           "start": {
             "line": 3,
@@ -392,8 +393,8 @@
     final textEdits = _extractTextDocumentEdits(edit.documentChanges!)
         .expand((tde) => tde.edits)
         .map((edit) => edit.map(
-              (e) => e,
               (e) => throw 'Expected SnippetTextEdit, got AnnotatedTextEdit',
+              (e) => e,
               (e) => throw 'Expected SnippetTextEdit, got TextEdit',
             ))
         .toList();
@@ -537,8 +538,8 @@
     final textEdits = _extractTextDocumentEdits(edit.documentChanges!)
         .expand((tde) => tde.edits)
         .map((edit) => edit.map(
-              (e) => e,
               (e) => throw 'Expected SnippetTextEdit, got AnnotatedTextEdit',
+              (e) => e,
               (e) => throw 'Expected SnippetTextEdit, got TextEdit',
             ))
         .toList();
@@ -548,26 +549,26 @@
 
   List<TextDocumentEdit> _extractTextDocumentEdits(
           Either2<
-                  List<TextDocumentEdit>,
                   List<
-                      Either4<TextDocumentEdit, CreateFile, RenameFile,
-                          DeleteFile>>>
+                      Either4<CreateFile, DeleteFile, RenameFile,
+                          TextDocumentEdit>>,
+                  List<TextDocumentEdit>>
               documentChanges) =>
       documentChanges.map(
-        // Already TextDocumentEdits
-        (edits) => edits,
         // Extract TextDocumentEdits from union of resource changes
         (changes) => changes
             .map(
               (change) => change.map(
-                (textDocEdit) => textDocEdit,
                 (create) => null,
-                (rename) => null,
                 (delete) => null,
+                (rename) => null,
+                (textDocEdit) => textDocEdit,
               ),
             )
             .whereNotNull()
             .toList(),
+        // Already TextDocumentEdits
+        (edits) => edits,
       );
 }
 
diff --git a/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart b/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
index 72ff233..d058b29 100644
--- a/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:linter/src/rules.dart';
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index 824d782..4fb647d 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/lsp/code_actions_source_test.dart b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
index 172c10f..0c364d5 100644
--- a/pkg/analysis_server/test/lsp/code_actions_source_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:linter/src/rules.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/lsp/completion.dart b/pkg/analysis_server/test/lsp/completion.dart
index ea8d26b..6454ee9 100644
--- a/pkg/analysis_server/test/lsp/completion.dart
+++ b/pkg/analysis_server/test/lsp/completion.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 
 import 'server_abstract.dart';
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 1ae1b51..40f2f70 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analysis_server/src/services/snippets/dart/dart_snippet_producers.dart';
diff --git a/pkg/analysis_server/test/lsp/configuration_test.dart b/pkg/analysis_server/test/lsp/configuration_test.dart
index a1bb699..c4d5b12 100644
--- a/pkg/analysis_server/test/lsp/configuration_test.dart
+++ b/pkg/analysis_server/test/lsp/configuration_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/definition_test.dart b/pkg/analysis_server/test/lsp/definition_test.dart
index 3eca8f3..6f574ca 100644
--- a/pkg/analysis_server/test/lsp/definition_test.dart
+++ b/pkg/analysis_server/test/lsp/definition_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index 553b8fe..a825b00 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:linter/src/rules.dart';
diff --git a/pkg/analysis_server/test/lsp/document_changes_test.dart b/pkg/analysis_server/test/lsp/document_changes_test.dart
index ebdb22b..db37854 100644
--- a/pkg/analysis_server/test/lsp/document_changes_test.dart
+++ b/pkg/analysis_server/test/lsp/document_changes_test.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Position;
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/lsp/document_color_test.dart b/pkg/analysis_server/test/lsp/document_color_test.dart
index 2bb92a0..5e3a80d 100644
--- a/pkg/analysis_server/test/lsp/document_color_test.dart
+++ b/pkg/analysis_server/test/lsp/document_color_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/document_highlights_test.dart b/pkg/analysis_server/test/lsp/document_highlights_test.dart
index d8df6ac..300b61e 100644
--- a/pkg/analysis_server/test/lsp/document_highlights_test.dart
+++ b/pkg/analysis_server/test/lsp/document_highlights_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/document_symbols_test.dart b/pkg/analysis_server/test/lsp/document_symbols_test.dart
index 43b129b..a64a535 100644
--- a/pkg/analysis_server/test/lsp/document_symbols_test.dart
+++ b/pkg/analysis_server/test/lsp/document_symbols_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/file_modification_test.dart b/pkg/analysis_server/test/lsp/file_modification_test.dart
index 10c4323..b4fc00a 100644
--- a/pkg/analysis_server/test/lsp/file_modification_test.dart
+++ b/pkg/analysis_server/test/lsp/file_modification_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/flutter_outline_test.dart b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
index 2059de5..c400feb 100644
--- a/pkg/analysis_server/test/lsp/flutter_outline_test.dart
+++ b/pkg/analysis_server/test/lsp/flutter_outline_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/folding_test.dart b/pkg/analysis_server/test/lsp/folding_test.dart
index 7f17866a8..ecb3690 100644
--- a/pkg/analysis_server/test/lsp/folding_test.dart
+++ b/pkg/analysis_server/test/lsp/folding_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/lsp/format_test.dart b/pkg/analysis_server/test/lsp/format_test.dart
index 69932f3..238d141 100644
--- a/pkg/analysis_server/test/lsp/format_test.dart
+++ b/pkg/analysis_server/test/lsp/format_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/hover_test.dart b/pkg/analysis_server/test/lsp/hover_test.dart
index 9c06937..a20f335 100644
--- a/pkg/analysis_server/test/lsp/hover_test.dart
+++ b/pkg/analysis_server/test/lsp/hover_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -350,15 +350,15 @@
 
   MarkupContent _getMarkupContents(Hover hover) {
     return hover.contents.map(
-      (t1) => throw 'Hover contents were String, not MarkupContent',
-      (t2) => t2,
+      (t1) => t1,
+      (t2) => throw 'Hover contents were String, not MarkupContent',
     );
   }
 
   String _getStringContents(Hover hover) {
     return hover.contents.map(
-      (t1) => t1,
-      (t2) => throw 'Hover contents were MarkupContent, not String',
+      (t1) => throw 'Hover contents were MarkupContent, not String',
+      (t2) => t2,
     );
   }
 }
diff --git a/pkg/analysis_server/test/lsp/implementation_test.dart b/pkg/analysis_server/test/lsp/implementation_test.dart
index ace85a3..75ebbd0 100644
--- a/pkg/analysis_server/test/lsp/implementation_test.dart
+++ b/pkg/analysis_server/test/lsp/implementation_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index 94d60fa..a70a2db 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -4,8 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/lsp/server_capabilities_computer.dart';
@@ -321,12 +320,12 @@
     // request text document open/close and incremental updates.
     expect(initResult.capabilities.textDocumentSync, isNotNull);
     initResult.capabilities.textDocumentSync!.map(
+      (_) =>
+          throw 'Expected textDocumentSync capabilities to be a TextDocumentSyncOptions',
       (options) {
         expect(options.openClose, isTrue);
         expect(options.change, equals(TextDocumentSyncKind.Incremental));
       },
-      (_) =>
-          throw 'Expected textDocumentSync capabilities to be a $TextDocumentSyncOptions',
     );
     expect(initResult.capabilities.completionProvider, isNotNull);
     expect(initResult.capabilities.hoverProvider, isNotNull);
@@ -492,8 +491,9 @@
             .registrations;
 
     final documentFilterSql =
-        DocumentFilter(scheme: 'file', pattern: '**/*.sql');
-    final documentFilterDart = DocumentFilter(language: 'dart', scheme: 'file');
+        TextDocumentFilter(scheme: 'file', pattern: '**/*.sql');
+    final documentFilterDart =
+        TextDocumentFilter(language: 'dart', scheme: 'file');
 
     expect(
       registrations,
@@ -697,13 +697,13 @@
     // Check some basic capabilities that are unlikely to change.
     expect(result.capabilities.textDocumentSync, isNotNull);
     result.capabilities.textDocumentSync!.map(
+      (_) =>
+          throw 'Expected textDocumentSync capabilities to be a TextDocumentSyncOptions',
       (options) {
         // We'll always request open/closed notifications and incremental updates.
         expect(options.openClose, isTrue);
         expect(options.change, equals(TextDocumentSyncKind.Incremental));
       },
-      (_) =>
-          throw 'Expected textDocumentSync capabilities to be a $TextDocumentSyncOptions',
     );
   }
 
diff --git a/pkg/analysis_server/test/lsp/mapping_test.dart b/pkg/analysis_server/test/lsp/mapping_test.dart
index 196b547..46d86bf 100644
--- a/pkg/analysis_server/test/lsp/mapping_test.dart
+++ b/pkg/analysis_server/test/lsp/mapping_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analysis_server/src/lsp/mapping.dart' as lsp;
 import 'package:analysis_server/src/protocol_server.dart' as server;
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/lsp/outline_test.dart b/pkg/analysis_server/test/lsp/outline_test.dart
index 4310ec9..7c630a2 100644
--- a/pkg/analysis_server/test/lsp/outline_test.dart
+++ b/pkg/analysis_server/test/lsp/outline_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/reanalyze_test.dart b/pkg/analysis_server/test/lsp/reanalyze_test.dart
index ca2de91..5d4c5c2 100644
--- a/pkg/analysis_server/test/lsp/reanalyze_test.dart
+++ b/pkg/analysis_server/test/lsp/reanalyze_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'server_abstract.dart';
diff --git a/pkg/analysis_server/test/lsp/references_test.dart b/pkg/analysis_server/test/lsp/references_test.dart
index 36c52bf..47bdd84 100644
--- a/pkg/analysis_server/test/lsp/references_test.dart
+++ b/pkg/analysis_server/test/lsp/references_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/rename_test.dart b/pkg/analysis_server/test/lsp/rename_test.dart
index ce69a25..ab9bf56 100644
--- a/pkg/analysis_server/test/lsp/rename_test.dart
+++ b/pkg/analysis_server/test/lsp/rename_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -719,7 +719,7 @@
     String? filePath,
     String? expectedFilePath,
     bool sendRenameVersion = true,
-    ClientCapabilitiesWorkspace? workspaceCapabilities,
+    WorkspaceClientCapabilities? workspaceCapabilities,
     Map<String, String>? contents,
   }) async {
     contents ??= {};
diff --git a/pkg/analysis_server/test/lsp/selection_range_test.dart b/pkg/analysis_server/test/lsp/selection_range_test.dart
index 2a4da46..74fb0b0 100644
--- a/pkg/analysis_server/test/lsp/selection_range_test.dart
+++ b/pkg/analysis_server/test/lsp/selection_range_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
index 696b750..1acfef1 100644
--- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
+++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/semantic_tokens/legend.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 5c61998..273369b 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -4,9 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_custom_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
@@ -229,9 +227,9 @@
 mixin ClientCapabilitiesHelperMixin {
   final emptyTextDocumentClientCapabilities = TextDocumentClientCapabilities();
 
-  final emptyWorkspaceClientCapabilities = ClientCapabilitiesWorkspace();
+  final emptyWorkspaceClientCapabilities = WorkspaceClientCapabilities();
 
-  final emptyWindowClientCapabilities = ClientCapabilitiesWindow();
+  final emptyWindowClientCapabilities = WindowClientCapabilities();
 
   TextDocumentClientCapabilities extendTextDocumentCapabilities(
     TextDocumentClientCapabilities source,
@@ -242,22 +240,22 @@
     return TextDocumentClientCapabilities.fromJson(json);
   }
 
-  ClientCapabilitiesWindow extendWindowCapabilities(
-    ClientCapabilitiesWindow source,
+  WindowClientCapabilities extendWindowCapabilities(
+    WindowClientCapabilities source,
     Map<String, dynamic> windowCapabilities,
   ) {
     final json = source.toJson();
     mergeJson(windowCapabilities, json);
-    return ClientCapabilitiesWindow.fromJson(json);
+    return WindowClientCapabilities.fromJson(json);
   }
 
-  ClientCapabilitiesWorkspace extendWorkspaceCapabilities(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities extendWorkspaceCapabilities(
+    WorkspaceClientCapabilities source,
     Map<String, dynamic> workspaceCapabilities,
   ) {
     final json = source.toJson();
     mergeJson(workspaceCapabilities, json);
-    return ClientCapabilitiesWorkspace.fromJson(json);
+    return WorkspaceClientCapabilities.fromJson(json);
   }
 
   void mergeJson(Map<String, dynamic> source, Map<String, dynamic> dest) {
@@ -308,8 +306,8 @@
     });
   }
 
-  ClientCapabilitiesWorkspace withAllSupportedWorkspaceDynamicRegistrations(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withAllSupportedWorkspaceDynamicRegistrations(
+    WorkspaceClientCapabilities source,
   ) {
     // This list (when combined with the textDocument list) should match all of
     // the fields listed in `ClientDynamicRegistrations.supported`.
@@ -318,8 +316,8 @@
     });
   }
 
-  ClientCapabilitiesWorkspace withApplyEditSupport(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withApplyEditSupport(
+    WorkspaceClientCapabilities source,
   ) {
     return extendWorkspaceCapabilities(source, {'applyEdit': true});
   }
@@ -409,8 +407,8 @@
     });
   }
 
-  ClientCapabilitiesWorkspace withConfigurationSupport(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withConfigurationSupport(
+    WorkspaceClientCapabilities source,
   ) {
     return extendWorkspaceCapabilities(source, {'configuration': true});
   }
@@ -436,16 +434,16 @@
     });
   }
 
-  ClientCapabilitiesWorkspace withDidChangeConfigurationDynamicRegistration(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withDidChangeConfigurationDynamicRegistration(
+    WorkspaceClientCapabilities source,
   ) {
     return extendWorkspaceCapabilities(source, {
       'didChangeConfiguration': {'dynamicRegistration': true}
     });
   }
 
-  ClientCapabilitiesWorkspace withDocumentChangesSupport(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withDocumentChangesSupport(
+    WorkspaceClientCapabilities source,
   ) {
     return extendWorkspaceCapabilities(source, {
       'workspaceEdit': {'documentChanges': true}
@@ -473,8 +471,8 @@
     });
   }
 
-  ClientCapabilitiesWorkspace withFileOperationDynamicRegistration(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withFileOperationDynamicRegistration(
+    WorkspaceClientCapabilities source,
   ) {
     return extendWorkspaceCapabilities(source, {
       'fileOperations': {'dynamicRegistration': true}
@@ -516,8 +514,8 @@
     });
   }
 
-  ClientCapabilitiesWorkspace withResourceOperationKinds(
-    ClientCapabilitiesWorkspace source,
+  WorkspaceClientCapabilities withResourceOperationKinds(
+    WorkspaceClientCapabilities source,
     List<ResourceOperationKind> kinds,
   ) {
     return extendWorkspaceCapabilities(source, {
@@ -550,8 +548,8 @@
     });
   }
 
-  ClientCapabilitiesWindow withWorkDoneProgressSupport(
-      ClientCapabilitiesWindow source) {
+  WindowClientCapabilities withWorkDoneProgressSupport(
+      WindowClientCapabilities source) {
     return extendWindowCapabilities(source, {'workDoneProgress': true});
   }
 }
@@ -686,8 +684,8 @@
 
   void applyDocumentChanges(
     Map<String, String> fileContents,
-    Either2<List<TextDocumentEdit>,
-            List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>
+    Either2<List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>,
+            List<TextDocumentEdit>>
         documentChanges, {
     Map<String, int>? expectedVersions,
   }) {
@@ -697,21 +695,21 @@
       expectDocumentVersions(documentChanges, expectedVersions);
     }
     documentChanges.map(
-      (edits) => applyTextDocumentEdits(fileContents, edits),
       (changes) => applyResourceChanges(fileContents, changes),
+      (edits) => applyTextDocumentEdits(fileContents, edits),
     );
   }
 
   void applyResourceChanges(
     Map<String, String> oldFileContent,
-    List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>> changes,
+    List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>> changes,
   ) {
     for (final change in changes) {
       change.map(
-        (textDocEdit) => applyTextDocumentEdits(oldFileContent, [textDocEdit]),
         (create) => applyResourceCreate(oldFileContent, create),
-        (rename) => applyResourceRename(oldFileContent, rename),
         (delete) => throw 'applyResourceChanges:Delete not currently supported',
+        (rename) => applyResourceRename(oldFileContent, rename),
+        (textDocEdit) => applyTextDocumentEdits(oldFileContent, [textDocEdit]),
       );
     }
   }
@@ -753,7 +751,7 @@
   }
 
   String applyTextEdit(String content,
-      Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit> change) {
+      Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit> change) {
     // Both sites of the union can cast to TextEdit.
     final edit = change.map((e) => e, (e) => e, (e) => e);
     final startPos = edit.range.start;
@@ -817,7 +815,7 @@
 
     for (final change in sortedChanges) {
       newContent = applyTextEdit(newContent,
-          Either3<SnippetTextEdit, AnnotatedTextEdit, TextEdit>.t3(change));
+          Either3<AnnotatedTextEdit, SnippetTextEdit, TextEdit>.t3(change));
     }
 
     return newContent;
@@ -906,30 +904,30 @@
   /// Validates the document versions for a set of edits match the versions in
   /// the supplied map.
   void expectDocumentVersions(
-    Either2<List<TextDocumentEdit>,
-            List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>
+    Either2<List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>,
+            List<TextDocumentEdit>>
         documentChanges,
     Map<String, int> expectedVersions,
   ) {
     documentChanges.map(
-      // Validate versions on simple doc edits
-      (edits) {
-        for (var edit in edits) {
-          expectDocumentVersion(edit, expectedVersions);
-        }
-      },
       // For resource changes, we only need to validate changes since
       // creates/renames/deletes do not supply versions.
       (changes) {
         for (var change in changes) {
           change.map(
-            (edit) => expectDocumentVersion(edit, expectedVersions),
             (create) => {},
-            (rename) {},
             (delete) {},
+            (rename) {},
+            (edit) => expectDocumentVersion(edit, expectedVersions),
           );
         }
       },
+      // Validate versions on simple doc edits
+      (edits) {
+        for (var edit in edits) {
+          expectDocumentVersion(edit, expectedVersions);
+        }
+      },
     );
   }
 
@@ -1412,8 +1410,8 @@
     Uri? rootUri,
     List<Uri>? workspaceFolders,
     TextDocumentClientCapabilities? textDocumentCapabilities,
-    ClientCapabilitiesWorkspace? workspaceCapabilities,
-    ClientCapabilitiesWindow? windowCapabilities,
+    WorkspaceClientCapabilities? workspaceCapabilities,
+    WindowClientCapabilities? windowCapabilities,
     Map<String, Object?>? experimentalCapabilities,
     Map<String, Object?>? initializationOptions,
     bool throwOnFailure = true,
@@ -1785,22 +1783,22 @@
   }
 
   /// Creates a [TextEdit] using the `insert` range of a [InsertReplaceEdit].
-  TextEdit textEditForInsert(Either2<TextEdit, InsertReplaceEdit> edit) =>
+  TextEdit textEditForInsert(Either2<InsertReplaceEdit, TextEdit> edit) =>
       edit.map(
-        (_) => throw 'Expected InsertReplaceEdit, got TextEdit',
         (e) => TextEdit(range: e.insert, newText: e.newText),
+        (_) => throw 'Expected InsertReplaceEdit, got TextEdit',
       );
 
   /// Creates a [TextEdit] using the `replace` range of a [InsertReplaceEdit].
-  TextEdit textEditForReplace(Either2<TextEdit, InsertReplaceEdit> edit) =>
+  TextEdit textEditForReplace(Either2<InsertReplaceEdit, TextEdit> edit) =>
       edit.map(
-        (_) => throw 'Expected InsertReplaceEdit, got TextEdit',
         (e) => TextEdit(range: e.replace, newText: e.newText),
+        (_) => throw 'Expected InsertReplaceEdit, got TextEdit',
       );
 
-  TextEdit toTextEdit(Either2<TextEdit, InsertReplaceEdit> edit) => edit.map(
-        (e) => e,
+  TextEdit toTextEdit(Either2<InsertReplaceEdit, TextEdit> edit) => edit.map(
         (_) => throw 'Expected TextEdit, got InsertReplaceEdit',
+        (e) => e,
       );
 
   WorkspaceFolder toWorkspaceFolder(Uri uri) {
diff --git a/pkg/analysis_server/test/lsp/server_test.dart b/pkg/analysis_server/test/lsp/server_test.dart
index ec72020..b29f98e 100644
--- a/pkg/analysis_server/test/lsp/server_test.dart
+++ b/pkg/analysis_server/test/lsp/server_test.dart
@@ -4,8 +4,7 @@
 
 import 'dart:io';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/lsp/signature_help_test.dart b/pkg/analysis_server/test/lsp/signature_help_test.dart
index d5add03..f7559fe 100644
--- a/pkg/analysis_server/test/lsp/signature_help_test.dart
+++ b/pkg/analysis_server/test/lsp/signature_help_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/super_test.dart b/pkg/analysis_server/test/lsp/super_test.dart
index b9192d9..e0609c4 100644
--- a/pkg/analysis_server/test/lsp/super_test.dart
+++ b/pkg/analysis_server/test/lsp/super_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/type_definition_test.dart b/pkg/analysis_server/test/lsp/type_definition_test.dart
index c2ad165..8d78416 100644
--- a/pkg/analysis_server/test/lsp/type_definition_test.dart
+++ b/pkg/analysis_server/test/lsp/type_definition_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/will_rename_files_test.dart b/pkg/analysis_server/test/lsp/will_rename_files_test.dart
index 9d88945..85688d2 100644
--- a/pkg/analysis_server/test/lsp/will_rename_files_test.dart
+++ b/pkg/analysis_server/test/lsp/will_rename_files_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/lsp/workspace_symbols_test.dart b/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
index c617811..1bda682 100644
--- a/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
+++ b/pkg/analysis_server/test/lsp/workspace_symbols_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart
index 2b447a3..f10cddf 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart
@@ -6,7 +6,7 @@
 
 class AppBar extends StatefulWidget {
   AppBar({
-    Key key,
+    Key? key,
     title,
     backgroundColor,
   });
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart
index 181ae90..fecb5da 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart
@@ -6,7 +6,7 @@
 
 class Scaffold extends StatefulWidget {
   const Scaffold({
-    Key key,
+    Key? key,
     Widget body,
   });
 }
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart
index f5b17e0..826aa7d 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart
@@ -10,8 +10,8 @@
 class AsyncSnapshot<T> {}
 
 class StreamBuilder<T> {
-  final T initialData;
+  final T? initialData;
   final AsyncWidgetBuilder<T> builder;
   const StreamBuilder(
-      {Key key, this.initialData, Stream<T> stream, @required this.builder});
+      {Key? key, this.initialData, Stream<T>? stream, @required this.builder});
 }
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
index 020e8fd..83eb5d0 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
@@ -32,22 +32,22 @@
   /// If non-null, sets its width to the child's width multiplied by this factor.
   ///
   /// Can be both greater and less than 1.0 but must be positive.
-  final double widthFactor;
+  final double? widthFactor;
 
   /// If non-null, sets its height to the child's height multiplied by this factor.
   ///
   /// Can be both greater and less than 1.0 but must be positive.
-  final double heightFactor;
+  final double? heightFactor;
 
   /// Creates an alignment widget.
   ///
   /// The alignment defaults to [Alignment.center].
   const Align({
-    Key key,
+    Key? key,
     this.alignment = Alignment.center,
     this.widthFactor,
     this.heightFactor,
-    Widget child,
+    Widget? child,
   })  : assert(alignment != null),
         assert(widthFactor == null || widthFactor >= 0.0),
         assert(heightFactor == null || heightFactor >= 0.0),
@@ -56,50 +56,51 @@
 
 class AspectRatio extends SingleChildRenderObjectWidget {
   const AspectRatio({
-    Key key,
+    Key? key,
     @required double aspectRatio,
-    Widget child,
+    Widget? child,
   });
 }
 
 class Center extends StatelessWidget {
-  const Center({Key key, double heightFactor, Widget child});
+  const Center({Key? key, double? heightFactor, Widget? child});
 }
 
 class SizedBox extends SingleChildRenderObjectWidget {
-  const SizedBox({Key key, this.width, this.height, Widget child})
+  const SizedBox({Key? key, this.width, this.height, Widget? child})
       : super(key: key, child: child);
 
-  const SizedBox.expand({Key key, Widget child})
+  const SizedBox.expand({Key? key, Widget? child})
       : width = double.infinity,
         height = double.infinity,
         super(key: key, child: child);
 
-  const SizedBox.shrink({Key key, Widget child})
+  const SizedBox.shrink({Key? key, Widget? child})
       : width = 0.0,
         height = 0.0,
         super(key: key, child: child);
 
-  SizedBox.fromSize({Key key, Widget child, Size size})
+  SizedBox.fromSize({Key? key, Widget? child, Size? size})
       : width = size?.width,
         height = size?.height,
         super(key: key, child: child);
 
-  final double width;
+  final double? width;
 
-  final double height;
+  final double? height;
 }
 
 class ClipRect extends SingleChildRenderObjectWidget {
-  const ClipRect({Key key, Widget child}) : super(key: key, child: child);
+  const ClipRect({Key? key, Widget? child}) : super(key: key, child: child);
 
   /// Does not actually exist in Flutter.
-  const ClipRect.rect({Key key, Widget child}) : super(key: key, child: child);
+  const ClipRect.rect({Key? key, Widget? child})
+      : super(key: key, child: child);
 }
 
 class Column extends Flex {
   Column({
-    Key key,
+    Key? key,
     MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
     MainAxisSize mainAxisSize = MainAxisSize.max,
     CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
@@ -112,7 +113,7 @@
 
 class Expanded extends StatelessWidget {
   const Expanded({
-    Key key,
+    Key? key,
     int flex = 1,
     @required Widget child,
   });
@@ -120,7 +121,7 @@
 
 class Flex extends Widget {
   Flex({
-    Key key,
+    Key? key,
     List<Widget> children = const <Widget>[],
   });
 }
@@ -129,15 +130,15 @@
   final EdgeInsetsGeometry padding;
 
   const Padding({
-    Key key,
+    Key? key,
     @required this.padding,
-    Widget child,
+    Widget? child,
   });
 }
 
 class Row extends Flex {
   Row({
-    Key key,
+    Key? key,
     MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
     MainAxisSize mainAxisSize = MainAxisSize.max,
     CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
@@ -150,12 +151,12 @@
 
 class Transform extends SingleChildRenderObjectWidget {
   const Transform({
-    Key key,
+    Key? key,
     @required transform,
     origin,
     alignment,
     transformHitTests = true,
-    Widget child,
+    Widget? child,
   });
 }
 
@@ -163,5 +164,5 @@
 
 class Builder {
   final WidgetBuilder builder;
-  const Builder({Key key, @required this.builder});
+  const Builder({Key? key, @required this.builder});
 }
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart
index ede265b..0b91346 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart
@@ -7,7 +7,7 @@
 import 'framework.dart';
 
 class Container extends StatelessWidget {
-  final Widget child;
+  final Widget? child;
 
   /// Align the [child] within the container.
   ///
@@ -23,14 +23,14 @@
   ///    specify an [AlignmentGeometry].
   ///  * [AlignmentDirectional], like [Alignment] for specifying alignments
   ///    relative to text direction.
-  final AlignmentGeometry alignment;
+  final AlignmentGeometry? alignment;
 
   /// Empty space to inscribe inside the [decoration]. The [child], if any, is
   /// placed inside this padding.
   ///
   /// This padding is in addition to any padding inherent in the [decoration];
   /// see [Decoration.padding].
-  final EdgeInsetsGeometry padding;
+  final EdgeInsetsGeometry? padding;
 
   /// The decoration to paint behind the [child].
   ///
@@ -40,23 +40,23 @@
   ///
   /// The [child] is not clipped to the decoration. To clip a child to the shape
   /// of a particular [ShapeDecoration], consider using a [ClipPath] widget.
-  final Decoration decoration;
+  final Decoration? decoration;
 
   /// The decoration to paint in front of the [child].
-  final Decoration foregroundDecoration;
+  final Decoration? foregroundDecoration;
 
   /// Empty space to surround the [decoration] and [child].
-  final EdgeInsetsGeometry margin;
+  final EdgeInsetsGeometry? margin;
 
   Container({
-    Key key,
+    Key? key,
     this.alignment,
     this.padding,
-    Color color,
-    Decoration decoration,
+    Color? color,
+    Decoration? decoration,
     this.foregroundDecoration,
-    double width,
-    double height,
+    double? width,
+    double? height,
     this.margin,
     this.child,
   })  : decoration = decoration,
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart
index bbe243f..587cdf7 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart
@@ -14,13 +14,13 @@
 }
 
 abstract class RenderObjectWidget extends Widget {
-  const RenderObjectWidget({Key key}) : super(key: key);
+  const RenderObjectWidget({Key? key}) : super(key: key);
 }
 
 abstract class SingleChildRenderObjectWidget extends RenderObjectWidget {
-  final Widget child;
+  final Widget? child;
 
-  const SingleChildRenderObjectWidget({Key key, this.child}) : super(key: key);
+  const SingleChildRenderObjectWidget({Key? key, this.child}) : super(key: key);
 }
 
 abstract class State<T extends StatefulWidget> {
@@ -36,19 +36,19 @@
 }
 
 abstract class StatefulWidget extends Widget {
-  const StatefulWidget({Key key}) : super(key: key);
+  const StatefulWidget({Key? key}) : super(key: key);
 
   State createState() => null;
 }
 
 abstract class StatelessWidget extends Widget {
-  const StatelessWidget({Key key}) : super(key: key);
+  const StatelessWidget({Key? key}) : super(key: key);
 
   Widget build(BuildContext context) => null;
 }
 
 class Widget extends DiagnosticableTree {
-  final Key key;
+  final Key? key;
 
   const Widget({this.key});
 
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart
index 0e20e3d..0371893 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart
@@ -6,8 +6,8 @@
 
 class GestureDetector extends StatelessWidget {
   GestureDetector({
-    Key key,
-    Widget child,
+    Key? key,
+    Widget? child,
     onTap,
   });
 }
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart
index 53d7a16..0b33913 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart
@@ -5,17 +5,17 @@
 import 'framework.dart';
 
 class Icon extends StatelessWidget {
-  final IconData icon;
+  final IconData? icon;
 
   const Icon(
     this.icon, {
-    Key key,
+    Key? key,
   }) : super(key: key);
 }
 
 class IconData {
   final int codePoint;
-  final String fontFamily;
+  final String? fontFamily;
 
   const IconData(
     this.codePoint, {
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart
index a052b28..c7f319e 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart
@@ -16,17 +16,17 @@
   /// The text to display.
   ///
   /// This will be null if a [textSpan] is provided instead.
-  final String data;
+  final String? data;
 
   /// If non-null, the style to use for this text.
   ///
   /// If the style's "inherit" property is true, the style will be merged with
   /// the closest enclosing [DefaultTextStyle]. Otherwise, the style will
   /// replace the closest enclosing [DefaultTextStyle].
-  final TextStyle style;
+  final TextStyle? style;
 
   /// How the text should be aligned horizontally.
-  final TextAlign textAlign;
+  final TextAlign? textAlign;
 
   /// The directionality of the text.
   ///
@@ -41,15 +41,15 @@
   /// its left.
   ///
   /// Defaults to the ambient [Directionality], if any.
-  final TextDirection textDirection;
+  final TextDirection? textDirection;
 
   /// Whether the text should break at soft line breaks.
   ///
   /// If false, the glyphs in the text will be positioned as if there was unlimited horizontal space.
-  final bool softWrap;
+  final bool? softWrap;
 
   /// How visual overflow should be handled.
-  final TextOverflow overflow;
+  final TextOverflow? overflow;
 
   /// The number of font pixels for each logical pixel.
   ///
@@ -59,7 +59,7 @@
   /// The value given to the constructor as textScaleFactor. If null, will
   /// use the [MediaQueryData.textScaleFactor] obtained from the ambient
   /// [MediaQuery], or 1.0 if there is no [MediaQuery] in scope.
-  final double textScaleFactor;
+  final double? textScaleFactor;
 
   /// An optional maximum number of lines for the text to span, wrapping if necessary.
   /// If the text exceeds the given number of lines, it will be truncated according
@@ -72,7 +72,7 @@
   /// an explicit number for its [DefaultTextStyle.maxLines], then the
   /// [DefaultTextStyle] value will take precedence. You can use a [RichText]
   /// widget directly to entirely override the [DefaultTextStyle].
-  final int maxLines;
+  final int? maxLines;
 
   /// An alternative semantics label for this text.
   ///
@@ -86,10 +86,10 @@
   /// ```dart
   /// Text(r'$$', semanticsLabel: 'Double dollars')
   /// ```
-  final String semanticsLabel;
+  final String? semanticsLabel;
 
   /// {@macro flutter.dart:ui.text.TextWidthBasis}
-  final TextWidthBasis textWidthBasis;
+  final TextWidthBasis? textWidthBasis;
 
   /// Creates a text widget.
   ///
@@ -99,7 +99,7 @@
   /// The [data] parameter must not be null.
   const Text(
     this.data, {
-    Key key,
+    Key? key,
     this.style,
     this.textAlign,
     this.textDirection,
diff --git a/pkg/analysis_server/test/mocks_lsp.dart b/pkg/analysis_server/test/mocks_lsp.dart
index 45201cc..07358d8 100644
--- a/pkg/analysis_server/test/mocks_lsp.dart
+++ b/pkg/analysis_server/test/mocks_lsp.dart
@@ -5,8 +5,7 @@
 import 'dart:async';
 import 'dart:convert';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
-import 'package:analysis_server/lsp_protocol/protocol_special.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 
 const _jsonEncoder = JsonEncoder.withIndent('    ');
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
index a7094e8..ff98794 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -154,6 +154,14 @@
   }
 
   @useResult
+  CheckTarget<String?> get displayText {
+    return nest(
+      value.suggestion.displayText,
+      (selected) => 'has displayText ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<String?> get docComplete {
     return nest(
       value.suggestion.docComplete,
@@ -402,6 +410,18 @@
   }
 
   @useResult
+  CheckTarget<Iterable<CompletionSuggestionForTesting>> get overrides {
+    var result = value
+        .where((suggestion) =>
+            suggestion.suggestion.kind == CompletionSuggestionKind.OVERRIDE)
+        .toList();
+    return nest(
+      result,
+      (selected) => 'overrides ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
   CheckTarget<Iterable<CompletionSuggestionForTesting>> get withElementClass {
     return nest(
       value.where((e) {
diff --git a/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart b/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart
index d473b9f..ca3535f 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart
@@ -18,14 +18,14 @@
 
 @reflectiveTest
 class ClassBodyTest1 extends AbstractCompletionDriverTest
-    with ClassBodyTestCases {
+    with ClassBodyTestCases, OverrideTestCases {
   @override
   TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
 }
 
 @reflectiveTest
 class ClassBodyTest2 extends AbstractCompletionDriverTest
-    with ClassBodyTestCases {
+    with ClassBodyTestCases, OverrideTestCases {
   @override
   TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
 }
@@ -311,6 +311,79 @@
   }
 }
 
+mixin OverrideTestCases on AbstractCompletionDriverTest {
+  Future<void> test_class_method_fromExtends() async {
+    final response = await getTestCodeSuggestions('''
+class A {
+  void foo01() {}
+}
+
+class B extends A {
+  foo^
+}
+''');
+
+    check(response).suggestions.overrides.includesAll([
+      (suggestion) => suggestion
+        ..displayText.isEqualTo('foo01() { … }')
+        ..hasSelection(offset: 60, length: 14)
+        ..completion.isEqualTo(r'''
+@override
+  void foo01() {
+    // TODO: implement foo01
+    super.foo01();
+  }'''),
+    ]);
+  }
+
+  Future<void> test_class_method_fromImplements() async {
+    final response = await getTestCodeSuggestions('''
+class A {
+  void foo01() {}
+}
+
+class B implements A {
+  foo^
+}
+''');
+
+    check(response).suggestions.overrides.includesAll([
+      (suggestion) => suggestion
+        ..displayText.isEqualTo('foo01() { … }')
+        ..hasSelection(offset: 55)
+        ..completion.isEqualTo(r'''
+@override
+  void foo01() {
+    // TODO: implement foo01
+  }'''),
+    ]);
+  }
+
+  Future<void> test_class_method_fromWith() async {
+    final response = await getTestCodeSuggestions('''
+mixin M {
+  void foo01() {}
+}
+
+class A with M {
+  foo^
+}
+''');
+
+    check(response).suggestions.overrides.includesAll([
+      (suggestion) => suggestion
+        ..displayText.isEqualTo('foo01() { … }')
+        ..hasSelection(offset: 60, length: 14)
+        ..completion.isEqualTo(r'''
+@override
+  void foo01() {
+    // TODO: implement foo01
+    super.foo01();
+  }'''),
+    ]);
+  }
+}
+
 class _Context {
   final bool isClass;
   final bool isMixin;
diff --git a/pkg/analysis_server/test/src/cider/document_symbols_test.dart b/pkg/analysis_server/test/src/cider/document_symbols_test.dart
index 7f59ea4..7d25c9e 100644
--- a/pkg/analysis_server/test/src/cider/document_symbols_test.dart
+++ b/pkg/analysis_server/test/src/cider/document_symbols_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/cider/document_symbols.dart';
 import 'package:test/expect.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/src/cider/signature_help_test.dart b/pkg/analysis_server/test/src/cider/signature_help_test.dart
index ca6c2ca..356b1cf 100644
--- a/pkg/analysis_server/test/src/cider/signature_help_test.dart
+++ b/pkg/analysis_server/test/src/cider/signature_help_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/cider/signature_help.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:collection/collection.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index 48dc9e0..7e676fc 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -64,10 +64,7 @@
     await assertNoAssist();
   }
 
-  @failingTest
   Future<void> test_inConstantContext() async {
-    // TODO(brianwilkerson) Get this test to pass again. Not clear whether it's
-    //  a problem with the test code or the mock flutter package.
     await resolveTestCode('''
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart
index cc18b0b..6eabd61 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_key_to_constructors_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -211,7 +210,7 @@
 class MyWidget extends A {
   MyWidget({super.key}) : super(text: '');
 }
-''', errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void>
@@ -241,7 +240,7 @@
 class MyWidget extends A {
   MyWidget({super.key}) : super(text: '',);
 }
-''', errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void>
@@ -271,9 +270,7 @@
 class B extends A {
   B({super.key}) : super(const Text(''),);
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_initializer_final_constant() async {
@@ -292,9 +289,7 @@
 
   const MyWidget({super.key});
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_initializer_final_not_constant() async {
@@ -332,9 +327,7 @@
 
   MyWidget({super.key});
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_initializer_not_final_not_constant() async {
@@ -372,9 +365,7 @@
 
   const MyWidget({super.key});
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_super_not_constant() async {
@@ -402,7 +393,7 @@
 class MyWidget extends ParentWidget {
   MyWidget({super.key});
 }
-''', errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 }
 
@@ -452,9 +443,7 @@
 class B extends A {
   B({Key? key}) : super(const Text(''), key: key);
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 }
 
@@ -637,7 +626,7 @@
 class MyWidget extends A {
   MyWidget({Key? key}) : super(key: key, text: '');
 }
-''', errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void>
@@ -667,7 +656,7 @@
 class MyWidget extends A {
   MyWidget({Key? key}) : super(key: key, text: '',);
 }
-''', errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void>
@@ -697,9 +686,7 @@
 class B extends A {
   B({Key? key}) : super(const Text(''), key: key,);
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_initializer_final_constant() async {
@@ -718,9 +705,7 @@
 
   const MyWidget({Key? key}) : super(key: key);
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_initializer_final_not_constant() async {
@@ -758,9 +743,7 @@
 
   MyWidget({Key? key}) : super(key: key);
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_initializer_not_final_not_constant() async {
@@ -798,9 +781,7 @@
 
   const MyWidget({Key? key}) : super(key: key);
 }
-''',
-        //TODO(asashour) there should be no other errors
-        errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 
   Future<void> test_super_not_constant() async {
@@ -828,6 +809,6 @@
 class MyWidget extends ParentWidget {
   MyWidget({Key? key}) : super(key: key);
 }
-''', errorFilter: (error) => error.errorCode is LintCode);
+''');
   }
 }
diff --git a/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart b/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart
index 4e7b051..0093cff 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart
@@ -19,7 +19,7 @@
 
     test('handles union types', () {
       expect(_union(['string', 'int']).dartTypeWithTypeArgs,
-          equals('Either2<String, int>'));
+          equals('Either2<int, String>'));
     });
 
     test('handles arrays', () {
diff --git a/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart b/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
index a506de9..4661b5c 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/generated_classes_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:test/test.dart';
 
 void main() {
@@ -29,10 +28,12 @@
     });
 
     test('with aliased list fields can be checked for equality', () {
-      final a = TextDocumentRegistrationOptions(
-          documentSelector: [DocumentFilter(language: 'dart', scheme: 'file')]);
-      final b = TextDocumentRegistrationOptions(
-          documentSelector: [DocumentFilter(language: 'dart', scheme: 'file')]);
+      final a = TextDocumentRegistrationOptions(documentSelector: [
+        TextDocumentFilter(language: 'dart', scheme: 'file')
+      ]);
+      final b = TextDocumentRegistrationOptions(documentSelector: [
+        TextDocumentFilter(language: 'dart', scheme: 'file')
+      ]);
 
       expect(a, equals(b));
       expect(a.hashCode, equals(b.hashCode));
@@ -73,11 +74,11 @@
     test('with union fields can be checked for equality', () {
       final a = SignatureInformation(
           label: 'a',
-          documentation: Either2<String, MarkupContent>.t1('a'),
+          documentation: Either2<MarkupContent, String>.t2('a'),
           parameters: []);
       final b = SignatureInformation(
           label: 'a',
-          documentation: Either2<String, MarkupContent>.t1('a'),
+          documentation: Either2<MarkupContent, String>.t2('a'),
           parameters: []);
 
       expect(a, equals(b));
@@ -85,11 +86,14 @@
     });
 
     test('consider subclasses when checking for equality', () {
-      final a = TextDocumentRegistrationOptions(
-          documentSelector: [DocumentFilter(language: 'dart', scheme: 'file')]);
+      final a = TextDocumentRegistrationOptions(documentSelector: [
+        TextDocumentFilter(language: 'dart', scheme: 'file')
+      ]);
       final b = TextDocumentSaveRegistrationOptions(
           includeText: true,
-          documentSelector: [DocumentFilter(language: 'dart', scheme: 'file')]);
+          documentSelector: [
+            TextDocumentFilter(language: 'dart', scheme: 'file')
+          ]);
 
       expect(a, isNot(equals(b)));
       expect(b, isNot(equals(a)));
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index 7b8ab8b..52a6859 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -4,8 +4,7 @@
 
 import 'dart:convert';
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
-import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:test/test.dart';
 
@@ -24,7 +23,7 @@
           method: Method.shutdown,
           jsonrpc: 'test');
       final output = json.encode(message.toJson());
-      expect(output, equals('{"id":1,"method":"shutdown","jsonrpc":"test"}'));
+      expect(output, equals('{"id":1,"jsonrpc":"test","method":"shutdown"}'));
     });
 
     test('returns correct output for union types containing interface types',
@@ -35,7 +34,7 @@
       expect(
           output,
           equals(
-              '{"uri":"!uri","languageId":"!language","version":1,"text":"!text"}'));
+              '{"languageId":"!language","text":"!text","uri":"!uri","version":1}'));
     });
 
     test('returns correct output for types with lists', () {
@@ -55,26 +54,26 @@
       );
       final output = json.encode(codeAction.toJson());
       final expected = '''{
-        "range":{
-            "start":{"line":1,"character":1},
-            "end":{"line":2,"character":2}
-        },
-        "severity":1,
         "code":"test_err",
-        "source":"/tmp/source.dart",
         "message":"err!!",
+        "range":{
+            "end":{"character":2,"line":2},
+            "start":{"character":1,"line":1}
+        },
         "relatedInformation":[
             {
               "location":{
-                  "uri":"y-uri",
                   "range":{
-                    "start":{"line":1,"character":1},
-                    "end":{"line":2,"character":2}
-                  }
+                    "end":{"character":2,"line":2},
+                    "start":{"character":1,"line":1}
+                  },
+                  "uri":"y-uri"
               },
               "message":"message"
             }
-        ]
+        ],
+        "severity":1,
+        "source":"/tmp/source.dart"
       }'''
           .replaceAll(RegExp('[ \n]'), '');
       expect(output, equals(expected));
@@ -102,11 +101,11 @@
           kind: FoldingRangeKind.Comment);
       final output = json.encode(foldingRange.toJson());
       final expected = '''{
-        "startLine":1,
-        "startCharacter":2,
-        "endLine":3,
         "endCharacter":4,
-        "kind":"comment"
+        "endLine":3,
+        "kind":"comment",
+        "startCharacter":2,
+        "startLine":1
       }'''
           .replaceAll(RegExp('[ \n]'), '');
       expect(output, equals(expected));
@@ -254,9 +253,12 @@
     test('canParse records nested undefined fields', () {
       final reporter = LspJsonReporter('params');
       expect(
-          CompletionParams.canParse(
-              {'textDocument': <String, dynamic>{}}, reporter),
-          isFalse);
+        CompletionParams.canParse({
+          'position': {'line': 1, 'character': 1},
+          'textDocument': <String, dynamic>{},
+        }, reporter),
+        isFalse,
+      );
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(reporter.errors.first,
           equals('params.textDocument.uri must not be undefined'));
@@ -265,10 +267,12 @@
     test('canParse records nested null fields', () {
       final reporter = LspJsonReporter('params');
       expect(
-          CompletionParams.canParse({
-            'textDocument': {'uri': null}
-          }, reporter),
-          isFalse);
+        CompletionParams.canParse({
+          'position': {'line': 1, 'character': 1},
+          'textDocument': {'uri': null},
+        }, reporter),
+        isFalse,
+      );
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(reporter.errors.first,
           equals('params.textDocument.uri must not be null'));
@@ -277,10 +281,12 @@
     test('canParse records nested fields of the wrong type', () {
       final reporter = LspJsonReporter('params');
       expect(
-          CompletionParams.canParse({
-            'textDocument': {'uri': 1}
-          }, reporter),
-          isFalse);
+        CompletionParams.canParse({
+          'position': {'line': 1, 'character': 1},
+          'textDocument': {'uri': 1},
+        }, reporter),
+        isFalse,
+      );
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(reporter.errors.first,
           equals('params.textDocument.uri must be of type String'));
@@ -291,15 +297,16 @@
         () {
       final reporter = LspJsonReporter('params');
       expect(
-          WorkspaceEdit.canParse({
-            'documentChanges': {'uri': 1}
-          }, reporter),
-          isFalse);
+        WorkspaceEdit.canParse({
+          'documentChanges': {'uri': 1}
+        }, reporter),
+        isFalse,
+      );
       expect(reporter.errors, hasLength(greaterThanOrEqualTo(1)));
       expect(
           reporter.errors.first,
           equals(
-              'params.documentChanges must be of type Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>'));
+              'params.documentChanges must be of type Either2<List<Either4<CreateFile, DeleteFile, RenameFile, TextDocumentEdit>>, List<TextDocumentEdit>>'));
     });
 
     test('ResponseMessage can include a null result', () {
diff --git a/pkg/analysis_server/test/tool/lsp_spec/matchers.dart b/pkg/analysis_server/test/tool/lsp_spec/matchers.dart
index 65bb7ae..64731c3 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/matchers.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/matchers.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:matcher/matcher.dart';
 
 import '../../../tool/lsp_spec/typescript_parser.dart';
diff --git a/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart b/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
index 990d952..ebc92f9 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
@@ -356,8 +356,8 @@
       expect(field.type, const TypeMatcher<UnionType>());
       final union = field.type as UnionType;
       expect(union.types, hasLength(2));
-      expect(union.types[0], isSimpleType('string'));
-      expect(union.types[1], isArrayOf(isSimpleType('number')));
+      expect(union.types[0], isArrayOf(isSimpleType('number')));
+      expect(union.types[1], isSimpleType('string'));
     });
 
     test('parses an union including Object into a single type', () {
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index b8e03a0..e2463db 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -65,6 +65,41 @@
       .forEach((namespace) => _namespaces[namespace.name] = namespace);
 }
 
+/// Renames types that may have been generated with bad names.
+Iterable<AstNode> renameTypes(List<AstNode> types) sync* {
+  const renames = {
+    // TODO(dantup): These entries can be removed after the
+    //   the migration to JSON meta_model.
+    'ClientCapabilitiesWindow': 'WindowClientCapabilities',
+    'ClientCapabilitiesWorkspace': 'WorkspaceClientCapabilities',
+    'DocumentFilter': 'TextDocumentFilter',
+  };
+
+  for (final type in types) {
+    if (type is Interface) {
+      final newName = renames[type.name];
+      if (newName != null) {
+        // Replace with renamed interface.
+        yield Interface(
+          type.commentNode,
+          Token.identifier(newName),
+          type.typeArgs,
+          type.baseTypes,
+          type.members,
+        );
+        // Plus a TypeAlias for the old name.
+        yield TypeAlias(
+          type.commentNode,
+          Token.identifier(type.name),
+          Type.identifier(newName),
+        );
+        continue;
+      }
+    }
+    yield type;
+  }
+}
+
 TypeBase resolveTypeAlias(TypeBase type, {bool resolveEnumClasses = false}) {
   if (type is Type) {
     // The LSP spec contains type aliases for `integer` and `uinteger` that map
@@ -101,13 +136,16 @@
   if (interface == null) {
     return [];
   }
-  return interface.members
+
+  final allFields = interface.members
       .whereType<Field>()
       .followedBy(interface.baseTypes
           // This cast is safe because base types are always real types.
           .map((type) => _getAllFields(_interfaces[(type as Type).name]))
           .expand((ts) => ts))
       .toList();
+
+  return _getSortedUnique(allFields);
 }
 
 /// Returns a copy of the list sorted by name with duplicates (by name+type) removed.
@@ -153,6 +191,7 @@
 }
 
 bool _isSpecType(TypeBase type) {
+  type = resolveTypeAlias(type);
   return type is Type &&
       (_interfaces.containsKey(type.name) ||
           (_namespaces.containsKey(type.name)));
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 115f15a..86764dc 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -29,8 +29,13 @@
   Directory(outFolder).createSync();
 
   // Collect definitions for types in the spec and our custom extensions.
-  final specTypes = await getSpecClasses(args);
-  final customTypes = getCustomClasses();
+  var specTypes = await getSpecClasses(args);
+  var customTypes = getCustomClasses();
+
+  // Handle some renames of types where we generate names that might not be
+  // ideal.
+  specTypes = renameTypes(specTypes).toList();
+  customTypes = renameTypes(customTypes).toList();
 
   // Record both sets of types in dictionaries for faster lookups, but also so
   // they can reference each other and we can find the definitions during
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
index 57c9bb3..e4415a8 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -5,6 +5,7 @@
 import 'dart:math';
 
 import 'package:analysis_server/src/utilities/strings.dart' show capitalize;
+import 'package:collection/collection.dart';
 
 import 'codegen_dart.dart';
 import 'typescript.dart';
@@ -1011,7 +1012,11 @@
 class UnionType extends TypeBase {
   final List<TypeBase> types;
 
-  UnionType(this.types);
+  UnionType(this.types) {
+    // Ensure types are always sorted alphabetically to simplify sharing code
+    // because `Either2<A, B>` and `Either2<B, A>` are not the same.
+    types.sortBy((type) => type.dartTypeWithTypeArgs.toLowerCase());
+  }
 
   @override
   String get dartType {
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index a1acd97..53a072f 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -39,6 +39,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
+import 'package:meta/meta.dart';
 
 /// Two or more string literals that are implicitly concatenated because of
 /// being adjacent (separated only by whitespace).
@@ -504,6 +505,8 @@
 
   R? visitLabeledStatement(LabeledStatement node);
 
+  R? visitLibraryAugmentationDirective(LibraryAugmentationDirective node);
+
   R? visitLibraryDirective(LibraryDirective node);
 
   R? visitLibraryIdentifier(LibraryIdentifier node);
@@ -3111,6 +3114,24 @@
   Statement get statement;
 }
 
+/// A library augmentation directive.
+///
+///    libraryAugmentationDirective ::=
+///        [metadata] 'library' 'augment' [StringLiteral] ';'
+///
+/// Clients may not extend, implement or mix-in this class.
+@experimental
+abstract class LibraryAugmentationDirective implements UriBasedDirective {
+  /// Return the token representing the 'augment' keyword.
+  Token get augmentKeyword;
+
+  /// Return the token representing the 'library' keyword.
+  Token get libraryKeyword;
+
+  /// Return the semicolon terminating the directive.
+  Token get semicolon;
+}
+
 /// A library directive.
 ///
 ///    libraryDirective ::=
@@ -4473,6 +4494,7 @@
 /// A directive that references a URI.
 ///
 ///    uriBasedDirective ::=
+///        [LibraryAugmentationDirective]
 ///        [ExportDirective]
 ///      | [ImportDirective]
 ///      | [PartDirective]
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 364355a..92ab86a 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -426,6 +426,11 @@
   R? visitLabeledStatement(LabeledStatement node) => visitStatement(node);
 
   @override
+  R? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    return visitUriBasedDirective(node);
+  }
+
+  @override
   R? visitLibraryDirective(LibraryDirective node) => visitDirective(node);
 
   @override
@@ -1113,6 +1118,12 @@
   }
 
   @override
+  R? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitLibraryDirective(LibraryDirective node) {
     node.visitChildren(this);
     return null;
@@ -1683,6 +1694,11 @@
   R? visitLabeledStatement(LabeledStatement node) => null;
 
   @override
+  R? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    return null;
+  }
+
+  @override
   R? visitLibraryDirective(LibraryDirective node) => null;
 
   @override
@@ -2099,6 +2115,11 @@
   R? visitLabeledStatement(LabeledStatement node) => _throw(node);
 
   @override
+  R? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    _throw(node);
+  }
+
+  @override
   R? visitLibraryDirective(LibraryDirective node) => _throw(node);
 
   @override
@@ -2265,7 +2286,7 @@
   @override
   R? visitYieldStatement(YieldStatement node) => _throw(node);
 
-  R _throw(AstNode node) {
+  Never _throw(AstNode node) {
     throw Exception('Missing implementation of visit${node.runtimeType}');
   }
 }
@@ -2902,6 +2923,14 @@
   }
 
   @override
+  T? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    stopwatch.start();
+    T? result = _baseVisitor.visitLibraryAugmentationDirective(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T? visitLibraryDirective(LibraryDirective node) {
     stopwatch.start();
     T? result = _baseVisitor.visitLibraryDirective(node);
@@ -3596,6 +3625,11 @@
   R? visitLabeledStatement(LabeledStatement node) => visitNode(node);
 
   @override
+  R? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    return visitNode(node);
+  }
+
+  @override
   R? visitLibraryDirective(LibraryDirective node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/src/context/package_config_json.dart b/pkg/analyzer/lib/src/context/package_config_json.dart
deleted file mode 100644
index cfda8b6..0000000
--- a/pkg/analyzer/lib/src/context/package_config_json.dart
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:convert';
-
-import 'package:pub_semver/pub_semver.dart';
-
-/// Parse the content of a `package_config.json` file located at the [uri].
-PackageConfigJson parsePackageConfigJson(Uri uri, String content) {
-  assert(uri.isAbsolute);
-  return _PackageConfigJsonParser(uri, content).parse();
-}
-
-class LanguageVersion {
-  final int major;
-  final int minor;
-
-  const LanguageVersion(this.major, this.minor);
-
-  @override
-  bool operator ==(Object other) {
-    return other is LanguageVersion &&
-        other.major == major &&
-        other.minor == minor;
-  }
-
-  @override
-  String toString() => '$major.$minor';
-}
-
-/// Information about packages used by a Pub package.
-///
-/// It represents a parsed and processed `package_config.json` file.
-class PackageConfigJson {
-  /// The absolute URI of the file.
-  final Uri uri;
-
-  /// The version of the format.
-  final int configVersion;
-
-  /// The list of packages.
-  final List<PackageConfigJsonPackage> packages;
-
-  /// The timestamp for when the file was generated.
-  ///
-  /// Might be `null`.
-  final DateTime? generated;
-
-  /// The generator which created the file, typically "pub".
-  ///
-  /// Might be `null`.
-  final String? generator;
-
-  /// The version of the generator, if the generator wants to remember that
-  /// information. The version must be a Semantic Version. Pub can use the
-  /// SDK version.
-  ///
-  /// Might be `null`.
-  final Version? generatorVersion;
-
-  PackageConfigJson({
-    required this.uri,
-    required this.configVersion,
-    required this.packages,
-    required this.generated,
-    required this.generator,
-    required this.generatorVersion,
-  });
-}
-
-/// Description of a single package in [PackageConfigJson].
-class PackageConfigJsonPackage {
-  /// The name of the package.
-  final String name;
-
-  /// The root directory of the package. All files inside this directory,
-  /// including any  subdirectories, are considered to belong to the package.
-  final Uri rootUri;
-
-  /// The package directory, containing files available to Dart programs
-  /// using `package:packageName/...` URIs. It is either the [rootUri], or a
-  /// sub-directory of the [rootUri].
-  final Uri packageUri;
-
-  /// The language version for the package, or `null` if not specified.
-  final LanguageVersion? languageVersion;
-
-  PackageConfigJsonPackage({
-    required this.name,
-    required this.rootUri,
-    required this.packageUri,
-    required this.languageVersion,
-  });
-}
-
-class _PackageConfigJsonParser {
-  final RegExp _languageVersionRegExp = RegExp(r'(0|[1-9]\d*)\.(0|[1-9]\d*)');
-
-  final Uri uri;
-  final String content;
-
-  late int version;
-  List<PackageConfigJsonPackage> packages = [];
-  DateTime? generated;
-  String? generator;
-  Version? generatorVersion;
-
-  _PackageConfigJsonParser(this.uri, this.content);
-
-  PackageConfigJson parse() {
-    var contentObject = json.decode(content);
-    if (contentObject is Map<String, dynamic>) {
-      _parseVersion(contentObject);
-      _parsePackages(contentObject);
-      _parseGenerated(contentObject);
-      return PackageConfigJson(
-        uri: uri,
-        configVersion: version,
-        packages: packages,
-        generated: generated,
-        generator: generator,
-        generatorVersion: generatorVersion,
-      );
-    } else {
-      throw FormatException("Expected a JSON object.", content);
-    }
-  }
-
-  T? _getOptionalField<T>(Map<String, dynamic> map, String name) {
-    var object = map[name];
-    if (object is T?) {
-      return object;
-    } else {
-      var actualType = object.runtimeType;
-      throw FormatException(
-        "Expected '$T' value for the '$name' field, found '$actualType'.",
-        content,
-      );
-    }
-  }
-
-  T _getRequiredField<T>(Map<String, dynamic> map, String name) {
-    var object = map[name];
-    if (object is T) {
-      return object;
-    } else if (object == null) {
-      throw FormatException("Missing the '$name' field.", content);
-    } else {
-      var actualType = object.runtimeType;
-      throw FormatException(
-        "Expected '$T' value for the '$name' field, found '$actualType'.",
-        content,
-      );
-    }
-  }
-
-  void _parseGenerated(Map<String, dynamic> map) {
-    var generatedStr = _getOptionalField<String>(map, 'generated');
-    if (generatedStr != null) {
-      generated = DateTime.parse(generatedStr);
-    }
-
-    generator = _getOptionalField<String>(map, 'generator');
-
-    var generatorVersionStr = _getOptionalField<String>(
-      map,
-      'generatorVersion',
-    );
-    if (generatorVersionStr != null) {
-      generatorVersion = Version.parse(generatorVersionStr);
-    }
-  }
-
-  void _parsePackage(Map<String, Object?> map) {
-    var name = _getRequiredField<String>(map, 'name');
-
-    var rootUriStr = _getRequiredField<String>(map, 'rootUri');
-    var rootUri = uri.resolve(rootUriStr);
-    rootUri = _ensureDirectoryUri(rootUri);
-
-    var packageUri = rootUri;
-    var packageUriStr = _getOptionalField<String>(map, 'packageUri');
-    if (packageUriStr != null) {
-      var packageUriRel = Uri.parse(packageUriStr);
-      if (packageUriRel.isAbsolute) {
-        throw FormatException(
-          "The value of the field 'packageUri' must be relative, "
-          "actually '$packageUriStr', for the package '$name'.",
-          content,
-        );
-      }
-
-      packageUri = rootUri.resolveUri(packageUriRel);
-      packageUri = _ensureDirectoryUri(packageUri);
-
-      if (!_isNestedUri(packageUri, rootUri)) {
-        throw FormatException(
-          "The resolved 'packageUri' must be inside the rootUri, "
-          "actually '$packageUri' is not in '$rootUri', "
-          "for the package '$name'.",
-          content,
-        );
-      }
-    }
-
-    var languageVersion = _parsePackageLanguageVersion(map);
-
-    packages.add(
-      PackageConfigJsonPackage(
-        name: name,
-        rootUri: rootUri,
-        packageUri: packageUri,
-        languageVersion: languageVersion,
-      ),
-    );
-  }
-
-  LanguageVersion? _parsePackageLanguageVersion(Map<String, Object?> map) {
-    var versionStr = _getOptionalField<String>(map, 'languageVersion');
-    if (versionStr == null) {
-      return null;
-    }
-
-    var match = _languageVersionRegExp.matchAsPrefix(versionStr);
-    if (match != null && match.end == versionStr.length) {
-      var major = int.parse(match.group(1)!);
-      var minor = int.parse(match.group(2)!);
-      return LanguageVersion(major, minor);
-    } else {
-      throw FormatException(
-        "Invalid 'languageVersion' format '$versionStr'.",
-        content,
-      );
-    }
-  }
-
-  void _parsePackages(Map<String, Object?> map) {
-    var packagesObject = _getRequiredField<List<Object?>>(map, 'packages');
-    for (var packageObject in packagesObject) {
-      if (packageObject is Map<String, dynamic>) {
-        _parsePackage(packageObject);
-      }
-    }
-  }
-
-  void _parseVersion(Map<String, Object?> map) {
-    version = _getRequiredField(map, 'configVersion');
-    if (version != 2) {
-      throw FormatException("Unsupported config version: $version");
-    }
-  }
-
-  static Uri _ensureDirectoryUri(Uri uri) {
-    var path = uri.path;
-    if (path.endsWith('/')) {
-      return uri;
-    } else {
-      return uri.replace(path: '$path/');
-    }
-  }
-
-  /// Return `true` if the [nested] is the [enclosing], or is in it.
-  static bool _isNestedUri(Uri nested, Uri enclosing) {
-    var nestedStr = '$nested';
-    var enclosingStr = '$enclosing';
-    return nestedStr.contains(enclosingStr);
-  }
-}
diff --git a/pkg/analyzer/lib/src/context/packages.dart b/pkg/analyzer/lib/src/context/packages.dart
index 78f5bb5..6369690 100644
--- a/pkg/analyzer/lib/src/context/packages.dart
+++ b/pkg/analyzer/lib/src/context/packages.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/package_config_json.dart';
 import 'package:analyzer/src/util/uri.dart';
+import 'package:package_config/package_config_types.dart';
 import 'package:package_config/src/packages_file.dart'
     as package_config_packages_file;
 import 'package:pub_semver/pub_semver.dart';
@@ -74,7 +74,7 @@
 Packages parsePackageConfigJsonFile(ResourceProvider provider, File file) {
   var uri = file.toUri();
   var content = file.readAsStringSync();
-  var jsonConfig = parsePackageConfigJson(uri, content);
+  var jsonConfig = PackageConfig.parseString(content, uri);
 
   var map = <String, Package>{};
   for (var jsonPackage in jsonConfig.packages) {
@@ -82,12 +82,12 @@
 
     var rootPath = fileUriToNormalizedPath(
       provider.pathContext,
-      jsonPackage.rootUri,
+      jsonPackage.root,
     );
 
     var libPath = fileUriToNormalizedPath(
       provider.pathContext,
-      jsonPackage.packageUri,
+      jsonPackage.packageUriRoot,
     );
 
     Version? languageVersion;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index b4ff5c0..1f4cdab 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -977,6 +977,15 @@
 
       // We have a contributor that looks at the type, but it is syntactic.
       if (parent is VariableDeclaration && parent.name == node) {
+        final parent2 = parent.parent;
+        final parent3 = parent2?.parent;
+        // `class A { foo^ }` looks like `class A { <noType> foo; }`.
+        if (parent2 is VariableDeclarationList &&
+            parent2.type == null &&
+            parent3 is FieldDeclaration &&
+            parent3.semicolon.isSynthetic) {
+          return false;
+        }
         return true;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index a4fbc57..524586d 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta.dart';
 
 /// Two or more string literals that are implicitly concatenated because of
 /// being adjacent (separated only by whitespace).
@@ -7138,6 +7139,60 @@
 
 /// A library directive.
 ///
+///    libraryAugmentationDirective ::=
+///        [metadata] 'library' 'augment' [StringLiteral] ';'
+@experimental
+class LibraryAugmentationDirectiveImpl extends UriBasedDirectiveImpl
+    implements LibraryAugmentationDirective {
+  @override
+  Token libraryKeyword;
+
+  @override
+  Token augmentKeyword;
+
+  @override
+  Token semicolon;
+
+  LibraryAugmentationDirectiveImpl({
+    required CommentImpl? comment,
+    required List<Annotation>? metadata,
+    required this.libraryKeyword,
+    required this.augmentKeyword,
+    required StringLiteralImpl uri,
+    required this.semicolon,
+  }) : super(comment, metadata, uri);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => libraryKeyword;
+
+  @override
+  Token get keyword => libraryKeyword;
+
+  @override
+  LibraryElement? get uriElement {
+    // TODO(scheglov) Implement it.
+    throw UnimplementedError();
+    // return element?.importedLibrary;
+  }
+
+  @override
+  ChildEntities get _childEntities => super._childEntities
+    ..addToken('libraryKeyword', libraryKeyword)
+    ..addToken('augmentKeyword', augmentKeyword)
+    ..addNode('uri', uri)
+    ..addToken('semicolon', semicolon);
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) {
+    return visitor.visitLibraryAugmentationDirective(this);
+  }
+}
+
+/// A library directive.
+///
 ///    libraryDirective ::=
 ///        [Annotation] 'library' [Identifier] ';'
 class LibraryDirectiveImpl extends DirectiveImpl implements LibraryDirective {
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index df44e47..becc0af 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -713,6 +713,15 @@
   }
 
   @override
+  void visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
+    sink.write('library ');
+    sink.write('augment ');
+    _visitNode(node.uri);
+    sink.write(';');
+  }
+
+  @override
   void visitLibraryDirective(LibraryDirective node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     sink.write('library ');
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 263dcde..65a3293 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -822,6 +822,18 @@
   }
 
   @override
+  bool? visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    final other = _other as LibraryAugmentationDirective;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.libraryKeyword, other.libraryKeyword) &&
+        isEqualTokens(node.augmentKeyword, other.augmentKeyword) &&
+        isEqualNodes(node.uri, other.uri) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective other = _other as LibraryDirective;
     return isEqualNodes(
@@ -2503,6 +2515,13 @@
   }
 
   @override
+  bool? visitLibraryAugmentationDirective(
+    covariant LibraryAugmentationDirectiveImpl node,
+  ) {
+    return visitUriBasedDirective(node);
+  }
+
+  @override
   bool visitLibraryDirective(covariant LibraryDirectiveImpl node) {
     if (identical(node.name, _oldNode)) {
       node.name = _newNode as LibraryIdentifier;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index d6491fa..878abf5 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -331,6 +331,9 @@
   void beginIsOperatorType(Token asOperator) {}
 
   @override
+  void beginLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {}
+
+  @override
   void beginLiteralString(Token literalString) {
     assert(identical(literalString.kind, STRING_TOKEN));
     debugEvent("beginLiteralString");
@@ -1925,6 +1928,24 @@
   }
 
   @override
+  void endLibraryAugmentation(
+      Token libraryKeyword, Token augmentKeyword, Token semicolon) {
+    final uri = pop() as StringLiteralImpl;
+    final metadata = pop() as List<Annotation>?;
+    final comment = _findComment(metadata, libraryKeyword);
+    directives.add(
+      LibraryAugmentationDirectiveImpl(
+        comment: comment,
+        metadata: metadata,
+        libraryKeyword: libraryKeyword,
+        augmentKeyword: augmentKeyword,
+        uri: uri,
+        semicolon: semicolon,
+      ),
+    );
+  }
+
+  @override
   void endLibraryName(Token libraryKeyword, Token semicolon) {
     assert(optional('library', libraryKeyword));
     assert(optional(';', semicolon));
@@ -4200,7 +4221,8 @@
     }
   }
 
-  Comment? _findComment(List<Annotation>? metadata, Token tokenAfterMetadata) {
+  CommentImpl? _findComment(
+      List<Annotation>? metadata, Token tokenAfterMetadata) {
     // Find the dartdoc tokens
     var dartdoc = parser.findDartDoc(tokenAfterMetadata);
     if (dartdoc == null) {
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 674c573..2c0aee8 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -315,6 +315,10 @@
     return _node(search, (n) => n is LibraryDirective);
   }
 
+  LibraryAugmentationDirective libraryAugmentation(String search) {
+    return _node(search, (n) => n is LibraryAugmentationDirective);
+  }
+
   LibraryIdentifier libraryIdentifier(String search) {
     return _node(search, (n) => n is LibraryIdentifier);
   }
diff --git a/pkg/analyzer/test/src/context/package_config_json_test.dart b/pkg/analyzer/test/src/context/package_config_json_test.dart
deleted file mode 100644
index 3f2061d..0000000
--- a/pkg/analyzer/test/src/context/package_config_json_test.dart
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/context/package_config_json.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(PackageConfigJsonTest);
-  });
-}
-
-@reflectiveTest
-class PackageConfigJsonTest with ResourceProviderMixin {
-  void assertPackage(
-      PackageConfigJsonPackage actual, _ExpectedPackage expected) {
-    expect(actual.name, expected.name);
-    expect(actual.rootUri, toUri(expected.rootUriPath));
-    expect(actual.packageUri, toUri(expected.packageUriPath));
-    expect(actual.languageVersion, expected.languageVersion);
-  }
-
-  void setUp() {
-    newFile('/test/lib/test.dart', '');
-  }
-
-  test_configVersion_2() {
-    var config = _parse('''
-{
-  "configVersion": 2,
-  "packages": []
-}
-''');
-    expect(config.configVersion, 2);
-    expect(config.packages, isEmpty);
-  }
-
-  test_configVersion_3() {
-    _throwsFormatException('''
-{
-  "configVersion": 3,
-  "packages": []
-}
-''', 'config version');
-  }
-
-  test_configVersion_missing() {
-    _throwsFormatException('''
-{
-  "packages": []
-}
-''', 'configVersion');
-  }
-
-  test_configVersion_notInt() {
-    _throwsFormatException('''
-{
-  "configVersion": "2",
-  "packages": []
-}
-''', 'configVersion');
-  }
-
-  test_format_notMap() {
-    _throwsFormatException('42', 'JSON object');
-  }
-
-  test_generated() {
-    var config = _parse('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/",
-      "languageVersion": "2.6"
-    }
-  ],
-  "generated": "2019-12-10T18:29:14.336160Z",
-  "generator": "pub",
-  "generatorVersion": "2.8.0-edge.28b0f1839726c0743e25a2765c5322a24f6e2afa"
-}
-''');
-    var generated = config.generated!;
-    expect(generated.year, 2019);
-    expect(generated.month, 12);
-    expect(generated.day, 10);
-    expect(generated.hour, 18);
-    expect(generated.minute, 29);
-    expect(generated.second, 14);
-
-    expect(config.generator, 'pub');
-
-    var generatorVersion = config.generatorVersion!;
-    expect(generatorVersion.major, 2);
-    expect(generatorVersion.minor, 8);
-    expect(generatorVersion.patch, 0);
-  }
-
-  test_packages() {
-    var config = _parse('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/",
-      "languageVersion": "2.6"
-    },
-    {
-      "name": "aaa",
-      "rootUri": "${toUriStr('/packages/aaa')}",
-      "packageUri": "lib/",
-      "languageVersion": "2.0"
-    },
-    {
-      "name": "bbb",
-      "rootUri": "${toUriStr('/packages/bbb/lib')}",
-      "languageVersion": "2.1"
-    }
-  ]
-}
-''');
-    assertPackage(
-      config.packages[0],
-      _ExpectedPackage(
-        name: 'test',
-        rootUriPath: '/test/',
-        packageUriPath: '/test/lib/',
-        languageVersion: LanguageVersion(2, 6),
-      ),
-    );
-    assertPackage(
-      config.packages[1],
-      _ExpectedPackage(
-        name: 'aaa',
-        rootUriPath: '/packages/aaa/',
-        packageUriPath: '/packages/aaa/lib/',
-        languageVersion: LanguageVersion(2, 0),
-      ),
-    );
-    assertPackage(
-      config.packages[2],
-      _ExpectedPackage(
-        name: 'bbb',
-        rootUriPath: '/packages/bbb/lib/',
-        packageUriPath: '/packages/bbb/lib/',
-        languageVersion: LanguageVersion(2, 1),
-      ),
-    );
-  }
-
-  test_packages_languageVersion_default() {
-    var config = _parse('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/"
-    }
-  ]
-}
-''');
-    assertPackage(
-      config.packages[0],
-      _ExpectedPackage(
-        name: 'test',
-        rootUriPath: '/test/',
-        packageUriPath: '/test/lib/',
-        languageVersion: null,
-      ),
-    );
-  }
-
-  test_packages_languageVersion_invalidPrefix() {
-    _throwsFormatException('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/",
-      "languageVersion": " 2.6"
-    }
-  ]
-}
-''', 'languageVersion');
-  }
-
-  test_packages_languageVersion_invalidSuffix() {
-    _throwsFormatException('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "lib/",
-      "languageVersion": "2.6 "
-    }
-  ]
-}
-''', 'languageVersion');
-  }
-
-  test_packages_missing() {
-    _throwsFormatException('''
-{
-  "configVersion": 2
-}
-''', 'packages');
-  }
-
-  test_packages_packageUri_absolute() {
-    _throwsFormatException('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": "${toUriStr('/test/lib')}",
-      "languageVersion": "2.6"
-    }
-  ]
-}
-''', 'packageUri');
-  }
-
-  test_packages_packageUri_empty() {
-    var config = _parse('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "../",
-      "packageUri": ""
-    }
-  ]
-}
-''');
-    assertPackage(
-      config.packages[0],
-      _ExpectedPackage(
-        name: 'test',
-        rootUriPath: '/test/',
-        packageUriPath: '/test/',
-        languageVersion: null,
-      ),
-    );
-  }
-
-  test_packages_packageUri_notInRootUri() {
-    _throwsFormatException('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "aaa",
-      "rootUri": "${toUriStr('/packages/aaa')}",
-      "packageUri": "..",
-      "languageVersion": "2.6"
-    }
-  ]
-}
-''', 'packageUri');
-  }
-
-  test_packages_rootUri_doesNotEndWithSlash() {
-    var config = _parse('''
-{
-  "configVersion": 2,
-  "packages": [
-    {
-      "name": "test",
-      "rootUri": "..",
-      "packageUri": "lib"
-    }
-  ]
-}
-''');
-    assertPackage(
-      config.packages[0],
-      _ExpectedPackage(
-        name: 'test',
-        rootUriPath: '/test/',
-        packageUriPath: '/test/lib/',
-        languageVersion: null,
-      ),
-    );
-  }
-
-  PackageConfigJson _parse(String content) {
-    var path = '/test/.dart_tool/package_config.json';
-    newFile(path, content);
-
-    var uri = toUri(path);
-    return parsePackageConfigJson(uri, content);
-  }
-
-  void _throwsFormatException(String content, String expectedSubString) {
-    try {
-      _parse(content);
-      fail('Expected to throw FormatException');
-    } on FormatException catch (e) {
-      expect(e.message, contains(expectedSubString));
-    }
-  }
-}
-
-class _ExpectedPackage {
-  final String name;
-  final String rootUriPath;
-  final String packageUriPath;
-  final LanguageVersion? languageVersion;
-
-  _ExpectedPackage({
-    required this.name,
-    required this.rootUriPath,
-    required this.packageUriPath,
-    required this.languageVersion,
-  });
-}
diff --git a/pkg/analyzer/test/src/context/test_all.dart b/pkg/analyzer/test/src/context/test_all.dart
index 83971d1..c56a5c5 100644
--- a/pkg/analyzer/test/src/context/test_all.dart
+++ b/pkg/analyzer/test/src/context/test_all.dart
@@ -5,14 +5,12 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'builder_test.dart' as builder_test;
-import 'package_config_json_test.dart' as package_config_json_test;
 import 'packages_test.dart' as packages_test;
 
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
     builder_test.main();
-    package_config_json_test.main();
     packages_test.main();
   }, name: 'context');
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
index a677d49..f0f8f69 100644
--- a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
@@ -130,6 +130,22 @@
     result.assertResolvedNodes([]);
   }
 
+  test_classDeclaration_body_identifier() async {
+    var result = await _resolveTestCode(r'''
+class A {}
+
+class B {
+  void foo() {}
+
+  bar^
+}
+''');
+
+    result.assertResolvedNodes([
+      'bar;',
+    ]);
+  }
+
   test_constructorDeclaration_body() async {
     var result = await _resolveTestCode(r'''
 class A {}
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 7a1569f..9a9a099 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -2353,6 +2353,16 @@
             [AstTestFactory.label2("a")], AstTestFactory.returnStatement()));
   }
 
+  void test_visitLibraryAugmentationDirective() {
+    var findNode = _parseStringToFindNode(r'''
+library augment 'a.dart';
+''');
+    _assertSource(
+      "library augment 'a.dart';",
+      findNode.libraryAugmentation('library'),
+    );
+  }
+
   void test_visitLibraryDirective() {
     _assertSource("library l;", AstTestFactory.libraryDirective2("l"));
   }
diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
index b1cbcbd..32fbc78 100644
--- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart
+++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
@@ -385,6 +385,23 @@
 ''');
   }
 
+  void test_library_augment() {
+    var parseResult = parseStringWithErrors(r'''
+library augment 'a.dart';
+''');
+    parseResult.assertNoErrors();
+
+    var node = parseResult.findNode.libraryAugmentation('library');
+    assertParsedNodeText(node, r'''
+LibraryAugmentationDirective
+  libraryKeyword: library
+  augmentKeyword: augment
+  uri: SimpleStringLiteral
+    literal: 'a.dart'
+  semicolon: ;
+''');
+  }
+
   void test_superFormalParameter() {
     var parseResult = parseStringWithErrors(r'''
 class A {
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 0b4c9bc..638d321 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -720,6 +720,19 @@
   }
 
   @override
+  void visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+    _writeln('LibraryAugmentationDirective');
+    _withIndent(() {
+      _writeNamedChildEntities(node);
+      // TODO(scheglov) Implement.
+      // _writeElement('element', node.element);
+      // _writeRaw('uriContent', node.uriContent);
+      // _writeElement('uriElement', node.uriElement);
+      // _writeSource('uriSource', node.uriSource);
+    });
+  }
+
+  @override
   void visitLibraryDirective(LibraryDirective node) {
     _writeln('LibraryDirective');
     _withIndent(() {
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index cb44cf3..d2e8bbb 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -98,9 +98,9 @@
   protobuf:
     path: ../../third_party/pkg/protobuf/protobuf
   shelf:
-    path: ../../third_party/pkg/shelf
+    path: ../../third_party/pkg/shelf/pkgs/shelf
   shelf_static:
-    path: ../../third_party/pkg/shelf_static
+    path: ../../third_party/pkg/shelf/pkgs/shelf_static
   source_span:
     path: ../../third_party/pkg/source_span
   stack_trace:
diff --git a/pkg/compiler/test/end_to_end/dill_loader_test.dart b/pkg/compiler/test/end_to_end/dill_loader_test.dart
index fe24e88..8cfe81a 100644
--- a/pkg/compiler/test/end_to_end/dill_loader_test.dart
+++ b/pkg/compiler/test/end_to_end/dill_loader_test.dart
@@ -28,7 +28,7 @@
     var options = CompilerOptions()
       ..target = Dart2jsTarget("dart2js", TargetFlags(enableNullSafety: true))
       ..nnbdMode = NnbdMode.Strong
-      ..packagesFileUri = Uri.base.resolve('.packages')
+      ..packagesFileUri = Uri.base.resolve('.dart_tool/package_config.json')
       ..additionalDills = <Uri>[
         computePlatformBinariesLocation().resolve("dart2js_platform.dill"),
       ]
diff --git a/pkg/compiler/test/end_to_end/no_platform_test.dart b/pkg/compiler/test/end_to_end/no_platform_test.dart
index e786f3f..349b129 100644
--- a/pkg/compiler/test/end_to_end/no_platform_test.dart
+++ b/pkg/compiler/test/end_to_end/no_platform_test.dart
@@ -22,7 +22,8 @@
             new Dart2jsTarget('dart2js', new TargetFlags()),
             sdkLibrariesSpecificationUri,
             [], // additionalDills
-            Uri.base.resolve('.packages'), // packagesFileUri
+            Uri.base
+                .resolve('.dart_tool/package_config.json'), // packagesFileUri
             explicitExperimentalFlags: experimentalFlags,
             verify: true);
     ir.Component component = await fe.compile(
diff --git a/pkg/compiler/test/helpers/memory_compiler.dart b/pkg/compiler/test/helpers/memory_compiler.dart
index 04ec18c..310120a 100644
--- a/pkg/compiler/test/helpers/memory_compiler.dart
+++ b/pkg/compiler/test/helpers/memory_compiler.dart
@@ -133,8 +133,8 @@
       packageConfig = Uri.base.resolve(Platform.packageConfig);
     } else {
       // The tests are run with the base directory as the SDK root
-      // so just use the .packages file there.
-      packageConfig = Uri.base.resolve('.packages');
+      // so just use the package config there.
+      packageConfig = Uri.base.resolve('.dart_tool/package_config.json');
     }
   }
 
diff --git a/pkg/dartdev/test/commands/create_integration_test.dart b/pkg/dartdev/test/commands/create_integration_test.dart
index 05d0bf0..fe8b203 100644
--- a/pkg/dartdev/test/commands/create_integration_test.dart
+++ b/pkg/dartdev/test/commands/create_integration_test.dart
@@ -33,6 +33,7 @@
       final p = proj!;
       final templateGenerator = getGenerator(templateId)!;
 
+      print('$templateId: creating template');
       ProcessResult createResult = await p.run([
         'create',
         '--force',
@@ -43,6 +44,7 @@
       expect(createResult.exitCode, 0, reason: createResult.stderr);
 
       // Validate that the project analyzes cleanly.
+      print('$templateId: analyzing generated project');
       ProcessResult analyzeResult = await p.run(
         ['analyze', '--fatal-infos', projectName],
         workingDir: p.dir.path,
@@ -50,6 +52,7 @@
       expect(analyzeResult.exitCode, 0, reason: analyzeResult.stdout);
 
       // Validate that the code is well formatted.
+      print('$templateId: checking formatting');
       ProcessResult formatResult = await p.run([
         'format',
         '--output',
@@ -77,6 +80,11 @@
         return commandParts;
       }).toList();
 
+      print('$templateId: running the following commands:');
+      for (final command in runCommands) {
+        print('  $command');
+      }
+
       final isServerTemplate = templateGenerator.categories.contains('server');
       final isWebTemplate = templateGenerator.categories.contains('web');
       final workingDir = path.join(p.dirPath, projectName);
@@ -88,7 +96,7 @@
         final isLastCommand = i == runCommands.length - 1;
         final command = runCommands[i];
         Process process;
-
+        print('[${i + 1} / ${runCommands.length}] Running "$command"...');
         if (isLastCommand && isWebTemplate) {
           // The web template uses `webdev` to execute, not `dart`, so don't
           // run the test through the project utility method.
@@ -148,6 +156,7 @@
           // an exit code of 0.
           expect(await process.exitCode, 0);
         }
+        print('[${i + 1} / ${runCommands.length}] Done "$command".');
       }
     });
   }
diff --git a/pkg/dev_compiler/pubspec.yaml b/pkg/dev_compiler/pubspec.yaml
index 90c1a69..9ff430c 100644
--- a/pkg/dev_compiler/pubspec.yaml
+++ b/pkg/dev_compiler/pubspec.yaml
@@ -52,6 +52,6 @@
   meta:
     path: ../meta
   shelf:
-    path: ../../third_party/pkg/shelf
+    path: ../../third_party/pkg/shelf/pkgs/shelf
   http_multi_server:
     path: ../../third_party/pkg/http_multi_server
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index ea96e19..e75d3d0 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -59,8 +59,10 @@
 
     var ddcSdkSummary = findInOutDir('ddc_outline.dill');
 
+    var packageConfigPath =
+        sdkRoot.uri.resolve('.dart_tool/package_config.json').toFilePath();
     var args = <String>[
-      "--packages=${sdkRoot.uri.resolve(".packages").toFilePath()}",
+      '--packages=$packageConfigPath',
       '--modules=es6',
       '--dart-sdk-summary=${ddcSdkSummary.path}',
       '-o',
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index b18526f..8b992bf 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
@@ -692,6 +692,17 @@
   }
 
   @override
+  void beginLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {
+    _unexpected();
+  }
+
+  @override
+  void endLibraryAugmentation(
+      Token libraryKeyword, Token augmentKeyword, Token semicolon) {
+    _unexpected();
+  }
+
+  @override
   void beginLibraryName(Token token) {
     _unexpected();
   }
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
index b691d1c..5137b17 100644
--- a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -1249,6 +1249,25 @@
   }
 
   @override
+  void beginLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {
+    LibraryAugmentationBegin data = new LibraryAugmentationBegin(
+        ParserAstType.BEGIN,
+        libraryKeyword: libraryKeyword,
+        augmentKeyword: augmentKeyword);
+    seen(data);
+  }
+
+  @override
+  void endLibraryAugmentation(
+      Token libraryKeyword, Token augmentKeyword, Token semicolon) {
+    LibraryAugmentationEnd data = new LibraryAugmentationEnd(ParserAstType.END,
+        libraryKeyword: libraryKeyword,
+        augmentKeyword: augmentKeyword,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
   void beginLibraryName(Token token) {
     LibraryNameBegin data =
         new LibraryNameBegin(ParserAstType.BEGIN, token: token);
@@ -4812,6 +4831,40 @@
       };
 }
 
+class LibraryAugmentationBegin extends ParserAstNode {
+  final Token libraryKeyword;
+  final Token augmentKeyword;
+
+  LibraryAugmentationBegin(ParserAstType type,
+      {required this.libraryKeyword, required this.augmentKeyword})
+      : super("LibraryAugmentation", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "libraryKeyword": libraryKeyword,
+        "augmentKeyword": augmentKeyword,
+      };
+}
+
+class LibraryAugmentationEnd extends ParserAstNode {
+  final Token libraryKeyword;
+  final Token augmentKeyword;
+  final Token semicolon;
+
+  LibraryAugmentationEnd(ParserAstType type,
+      {required this.libraryKeyword,
+      required this.augmentKeyword,
+      required this.semicolon})
+      : super("LibraryAugmentation", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "libraryKeyword": libraryKeyword,
+        "augmentKeyword": augmentKeyword,
+        "semicolon": semicolon,
+      };
+}
+
 class LibraryNameBegin extends ParserAstNode {
   final Token token;
 
diff --git a/pkg/front_end/test/async_but_no_await_git_test.dart b/pkg/front_end/test/async_but_no_await_git_test.dart
index 6721ee1..fb27bc2 100644
--- a/pkg/front_end/test/async_but_no_await_git_test.dart
+++ b/pkg/front_end/test/async_but_no_await_git_test.dart
@@ -31,11 +31,11 @@
 Future<void> main(List<String> args) async {
   api.CompilerOptions compilerOptions = getOptions();
 
-  Uri dotPackagesUri = repoDir.resolve(".packages");
-  if (!new File.fromUri(dotPackagesUri).existsSync()) {
+  Uri packageConfigUri = repoDir.resolve(".dart_tool/package_config.json");
+  if (!new File.fromUri(packageConfigUri).existsSync()) {
     throw "Couldn't find .packages";
   }
-  compilerOptions.packagesFileUri = dotPackagesUri;
+  compilerOptions.packagesFileUri = packageConfigUri;
 
   ProcessedOptions options = new ProcessedOptions(options: compilerOptions);
 
diff --git a/pkg/front_end/test/comments_on_certain_arguments_tool.dart b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
index 3607cc2..c588afc 100644
--- a/pkg/front_end/test/comments_on_certain_arguments_tool.dart
+++ b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
@@ -61,11 +61,11 @@
 Future<void> main(List<String> args) async {
   api.CompilerOptions compilerOptions = getOptions();
 
-  Uri dotPackagesUri = repoDir.resolve(".packages");
-  if (!new File.fromUri(dotPackagesUri).existsSync()) {
-    throw "Couldn't find .packages";
+  Uri packageConfigUri = repoDir.resolve(".dart_tool/package_config.json");
+  if (!new File.fromUri(packageConfigUri).existsSync()) {
+    throw "Couldn't find .dart_tool/package_config.json";
   }
-  compilerOptions.packagesFileUri = dotPackagesUri;
+  compilerOptions.packagesFileUri = packageConfigUri;
 
   ProcessedOptions options = new ProcessedOptions(options: compilerOptions);
 
diff --git a/pkg/front_end/test/deps_git_test.dart b/pkg/front_end/test/deps_git_test.dart
index 2017352..e123def 100644
--- a/pkg/front_end/test/deps_git_test.dart
+++ b/pkg/front_end/test/deps_git_test.dart
@@ -49,11 +49,11 @@
   Ticker ticker = new Ticker(isVerbose: false);
   CompilerOptions compilerOptions = getOptions();
 
-  Uri dotPackagesUri = repoDir.resolve(".packages");
-  if (!new File.fromUri(dotPackagesUri).existsSync()) {
-    throw "Couldn't find .packages";
+  Uri packageConfigUri = repoDir.resolve(".dart_tool/package_config.json");
+  if (!new File.fromUri(packageConfigUri).existsSync()) {
+    throw "Couldn't find .dart_tool/package_config.json";
   }
-  compilerOptions.packagesFileUri = dotPackagesUri;
+  compilerOptions.packagesFileUri = packageConfigUri;
 
   ProcessedOptions options = new ProcessedOptions(options: compilerOptions);
 
@@ -123,7 +123,7 @@
   // * Everything else is an error.
 
   // Remove white-listed non-dart files.
-  otherNonDartUris.remove(dotPackagesUri);
+  otherNonDartUris.remove(packageConfigUri);
   otherNonDartUris.remove(repoDir.resolve("sdk/lib/libraries.json"));
   otherNonDartUris.remove(repoDir.resolve(".dart_tool/package_config.json"));
 
diff --git a/pkg/front_end/test/explicit_creation_git_test.dart b/pkg/front_end/test/explicit_creation_git_test.dart
index 3200635..9a6676c 100644
--- a/pkg/front_end/test/explicit_creation_git_test.dart
+++ b/pkg/front_end/test/explicit_creation_git_test.dart
@@ -49,11 +49,11 @@
   Ticker ticker = new Ticker(isVerbose: false);
   api.CompilerOptions compilerOptions = getOptions();
 
-  Uri dotPackagesUri = repoDir.resolve(".packages");
-  if (!new File.fromUri(dotPackagesUri).existsSync()) {
-    throw "Couldn't find .packages";
+  Uri packageConfigUri = repoDir.resolve(".dart_tool/package_config.json");
+  if (!new File.fromUri(packageConfigUri).existsSync()) {
+    throw "Couldn't find .dart_tool/package_config.json";
   }
-  compilerOptions.packagesFileUri = dotPackagesUri;
+  compilerOptions.packagesFileUri = packageConfigUri;
 
   ProcessedOptions options = new ProcessedOptions(options: compilerOptions);
 
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index 125ef12..6a6daac 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -37,7 +37,7 @@
 
 Future<void> test({required bool sdkFromSource}) async {
   final CompilerOptions optionBuilder = new CompilerOptions()
-    ..packagesFileUri = Uri.base.resolve(".packages")
+    ..packagesFileUri = Uri.base.resolve(".dart_tool/package_config.json")
     ..target = new VmTarget(new TargetFlags())
     ..omitPlatform = true
     ..onDiagnostic = diagnosticMessageHandler
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 65269dd..bbbcbc6b 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -537,7 +537,7 @@
     UriTranslator? uriTranslator = _uriTranslators[uriConfiguration];
     if (uriTranslator == null) {
       Uri sdk = Uri.base.resolve("sdk/");
-      Uri packages = Uri.base.resolve(".packages");
+      Uri packages = Uri.base.resolve(".dart_tool/package_config.json");
       FolderOptions folderOptions = computeFolderOptions(description);
       CompilerOptions compilerOptions = new CompilerOptions()
         ..onDiagnostic = (DiagnosticMessage message) {
diff --git a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
index a1c2094..193d734 100644
--- a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
+++ b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
@@ -86,7 +86,8 @@
 
   final CompilerContext context = new CompilerContext(new ProcessedOptions(
       options: new CompilerOptions()
-        ..packagesFileUri = Uri.base.resolve(".packages")));
+        ..packagesFileUri =
+            Uri.base.resolve(".dart_tool/package_config.json")));
 
   asyncTest(() => context.runInContext<void>((_) async {
         DillTarget target = new DillTarget(
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
index 618c014..e4466af 100644
--- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -66,7 +66,8 @@
   final Ticker ticker = new Ticker();
   final CompilerContext context = new CompilerContext(new ProcessedOptions(
       options: new CompilerOptions()
-        ..packagesFileUri = Uri.base.resolve(".packages")));
+        ..packagesFileUri =
+            Uri.base.resolve(".dart_tool/package_config.json")));
   context.runInContext<void>(
       (_) => new FastaLegacyUpperBoundTest(ticker, context).test());
 }
diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart
index 55095c7..efbfacc 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart
@@ -42,7 +42,8 @@
   final Ticker ticker = new Ticker(isVerbose: false);
   final CompilerContext context = new CompilerContext(new ProcessedOptions(
       options: new CompilerOptions()
-        ..packagesFileUri = Uri.base.resolve(".packages")));
+        ..packagesFileUri =
+            Uri.base.resolve(".dart_tool/package_config.json")));
   final Uri uri = Uri.parse("dart:core");
   final TypeParserEnvironment environment = new TypeParserEnvironment(uri, uri);
   final Component sdk = parseSdk(uri, environment);
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
index 165313e..d1f1428 100644
--- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
@@ -138,7 +138,8 @@
 
   final CompilerContext context = new CompilerContext(new ProcessedOptions(
       options: new CompilerOptions()
-        ..packagesFileUri = Uri.base.resolve(".packages")));
+        ..packagesFileUri =
+            Uri.base.resolve(".dart_tool/package_config.json")));
   await context.runInContext<void>((_) async {
     DillTarget target = new DillTarget(
         ticker,
diff --git a/pkg/front_end/test/outline_extractor_suite.dart b/pkg/front_end/test/outline_extractor_suite.dart
index 80754c7..02be7f5 100644
--- a/pkg/front_end/test/outline_extractor_suite.dart
+++ b/pkg/front_end/test/outline_extractor_suite.dart
@@ -100,7 +100,7 @@
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) async {
-    Uri? packages = description.uri.resolve(".packages");
+    Uri? packages = description.uri.resolve(".dart_tool/package_config.json");
     if (!new File.fromUri(packages).existsSync()) {
       packages = null;
     }
@@ -142,7 +142,7 @@
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) async {
-    Uri? packages = description.uri.resolve(".packages");
+    Uri? packages = description.uri.resolve(".dart_tool/package_config.json");
     if (!new File.fromUri(packages).existsSync()) {
       packages = null;
     }
diff --git a/pkg/front_end/test/outline_extractor_tester.dart b/pkg/front_end/test/outline_extractor_tester.dart
index 941b5c0..01fbca9 100644
--- a/pkg/front_end/test/outline_extractor_tester.dart
+++ b/pkg/front_end/test/outline_extractor_tester.dart
@@ -18,7 +18,7 @@
 Future<void> main(List<String> args) async {
   if (args.length != 1) throw "Wants 1 argument.";
   Uri input = Uri.base.resolve(args.single);
-  Uri packageUri = input.resolve(".packages");
+  Uri packageUri = input.resolve(".dart_tool/package_config.json");
   Stopwatch stopwatch = new Stopwatch()..start();
   PackageConfig packageFile = await loadPackageConfigUri(packageUri);
   print("Read packages file in ${stopwatch.elapsedMilliseconds} ms");
diff --git a/pkg/front_end/test/packages_format_error_test.dart b/pkg/front_end/test/packages_format_error_test.dart
index a19551f..593e1bd 100644
--- a/pkg/front_end/test/packages_format_error_test.dart
+++ b/pkg/front_end/test/packages_format_error_test.dart
@@ -26,7 +26,7 @@
 void main() {
   Uri root = Uri.parse("org-dartlang-test:///");
   MemoryFileSystem fs = new MemoryFileSystem(root);
-  Uri packages = root.resolve(".packages");
+  Uri packages = root.resolve(".dart_tool/package_config.json");
   fs.entityForUri(packages).writeAsStringSync("bad\n");
   List<DiagnosticMessage> messages = <DiagnosticMessage>[];
   CompilerContext c = new CompilerContext(new ProcessedOptions(
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index 92bd9ea..0e1788a 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -1359,6 +1359,27 @@
   }
 
   @override
+  void beginLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {
+    seen(libraryKeyword);
+    seen(augmentKeyword);
+    doPrint('beginLibraryAugmentation(' '$libraryKeyword, ' '$augmentKeyword)');
+    indent++;
+  }
+
+  @override
+  void endLibraryAugmentation(
+      Token libraryKeyword, Token augmentKeyword, Token semicolon) {
+    indent--;
+    seen(libraryKeyword);
+    seen(augmentKeyword);
+    seen(semicolon);
+    doPrint('endLibraryAugmentation('
+        '$libraryKeyword, '
+        '$augmentKeyword, '
+        '$semicolon)');
+  }
+
+  @override
   void beginLibraryName(Token token) {
     seen(token);
     doPrint('beginLibraryName(' '$token)');
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index 0e24107..c270e56 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -177,6 +177,15 @@
   }
 
   @override
+  Token parseLibraryAugmentation(Token libraryKeyword, Token augmentKeyword) {
+    doPrint('parseLibraryAugmentation(' '$libraryKeyword, ' '$augmentKeyword)');
+    indent++;
+    var result = super.parseLibraryAugmentation(libraryKeyword, augmentKeyword);
+    indent--;
+    return result;
+  }
+
+  @override
   Token parseLibraryName(Token libraryKeyword) {
     doPrint('parseLibraryName(' '$libraryKeyword)');
     indent++;
diff --git a/pkg/front_end/test/parts/parts_test.dart b/pkg/front_end/test/parts/parts_test.dart
index 9bfe8ff..3e42c00 100644
--- a/pkg/front_end/test/parts/parts_test.dart
+++ b/pkg/front_end/test/parts/parts_test.dart
@@ -13,7 +13,7 @@
   Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
   CompilerOptions options = new CompilerOptions()
     ..sdkRoot = computePlatformBinariesLocation()
-    ..packagesFileUri = Uri.base.resolve('.packages');
+    ..packagesFileUri = Uri.base.resolve('.dart_tool/package_config.json');
   for (FileSystemEntity dir in dataDir.listSync()) {
     if (dir is Directory) {
       print('Compiling ${dir.path}');
diff --git a/pkg/testing/lib/src/discover.dart b/pkg/testing/lib/src/discover.dart
index 6b761ab..193590b 100644
--- a/pkg/testing/lib/src/discover.dart
+++ b/pkg/testing/lib/src/discover.dart
@@ -62,7 +62,7 @@
 Uri computePackageConfig() {
   String? path = Platform.packageConfig;
   if (path != null) return Uri.base.resolve(path);
-  return Uri.base.resolve(".packages");
+  return Uri.base.resolve(".dart_tool/package_config.json");
 }
 
 // TODO(eernst): Use `bool.hasEnvironment` below when possible;
diff --git a/runtime/lib/simd128.cc b/runtime/lib/simd128.cc
index 9adf5c3..92aee8a 100644
--- a/runtime/lib/simd128.cc
+++ b/runtime/lib/simd128.cc
@@ -195,7 +195,8 @@
   float _w;
   // ARM semantics are different from X86/X64 at an instruction level. Ensure
   // that we match the semantics of the architecture in the C version.
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(USING_SIMULATOR)
   _x = self.x() < hi.x() ? self.x() : hi.x();
   _y = self.y() < hi.y() ? self.y() : hi.y();
   _z = self.z() < hi.z() ? self.z() : hi.z();
@@ -741,7 +742,8 @@
 
   // ARM semantics are different from X86/X64 at an instruction level. Ensure
   // that we match the semantics of the architecture in the C version.
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) ||                   \
+    defined(USING_SIMULATOR)
   _x = self.x() < hi.x() ? self.x() : hi.x();
   _y = self.y() < hi.y() ? self.y() : hi.y();
   _x = lo.x() < _x ? _x : lo.x();
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 0010aba..9daefc3 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -6732,6 +6732,25 @@
       "ret\n");
 }
 
+// Verify that vmaxs(-0.0, 0.0) = 0.0
+ASSEMBLER_TEST_GENERATE(Vmaxs_zero, assembler) {
+  __ veor(V1, V1, V1);
+  __ vnegd(V2, V1);
+  __ vmaxs(V0, V2, V1);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(Vmaxs_zero, test) {
+  typedef double (*DoubleReturn)() DART_UNUSED;
+  double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
+  EXPECT_EQ(true, !signbit(d) && (d == 0.0));
+  EXPECT_DISASSEMBLY(
+      "veor v1, v1, v1\n"
+      "vnegd v2, v1\n"
+      "vmaxs v0, v2, v1\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(Vmaxs, assembler) {
   __ LoadDImmediate(V0, 10.5);
   __ LoadDImmediate(V1, 10.0);
@@ -6791,6 +6810,25 @@
       "ret\n");
 }
 
+// Verify that vmaxd(-0.0, 0.0) = 0.0
+ASSEMBLER_TEST_GENERATE(Vmaxd_zero, assembler) {
+  __ veor(V1, V1, V1);
+  __ vnegd(V2, V1);
+  __ vmaxd(V0, V2, V1);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(Vmaxd_zero, test) {
+  typedef double (*DoubleReturn)() DART_UNUSED;
+  double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
+  EXPECT_EQ(true, !signbit(d) && (d == 0.0));
+  EXPECT_DISASSEMBLY(
+      "veor v1, v1, v1\n"
+      "vnegd v2, v1\n"
+      "vmaxd v0, v2, v1\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(Vmaxd, assembler) {
   __ LoadDImmediate(V0, 21.0);
   __ LoadDImmediate(V1, 20.5);
@@ -6826,6 +6864,26 @@
       "ret\n");
 }
 
+// Verify that vmins(-0.0, 0.0) = -0.0
+ASSEMBLER_TEST_GENERATE(Vmins_zero, assembler) {
+  __ veor(V1, V1, V1);
+  __ vnegd(V2, V1);
+  __ vmins(V0, V1, V2);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(Vmins_zero, test) {
+  typedef double (*DoubleReturn)() DART_UNUSED;
+  double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
+  fprintf(stderr, "d: %f\n", d);
+  EXPECT_EQ(true, signbit(d) && (d == 0.0));
+  EXPECT_DISASSEMBLY(
+      "veor v1, v1, v1\n"
+      "vnegd v2, v1\n"
+      "vmins v0, v1, v2\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(Vmins, assembler) {
   __ LoadDImmediate(V0, 10.5);
   __ LoadDImmediate(V1, 11.0);
@@ -6885,6 +6943,26 @@
       "ret\n");
 }
 
+// Verify that vmind(-0.0, 0.0) = -0.0
+ASSEMBLER_TEST_GENERATE(Vmind_zero, assembler) {
+  __ veor(V1, V1, V1);
+  __ vnegd(V2, V1);
+  __ vmind(V0, V1, V2);
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(Vmind_zero, test) {
+  typedef double (*DoubleReturn)() DART_UNUSED;
+  double d = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
+  fprintf(stderr, "d: %f\n", d);
+  EXPECT_EQ(true, signbit(d) && (d == 0.0));
+  EXPECT_DISASSEMBLY(
+      "veor v1, v1, v1\n"
+      "vnegd v2, v1\n"
+      "vmind v0, v1, v2\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(Vmind, assembler) {
   __ LoadDImmediate(V0, 21.0);
   __ LoadDImmediate(V1, 21.5);
diff --git a/runtime/vm/compiler/assembler/assembler_arm_test.cc b/runtime/vm/compiler/assembler/assembler_arm_test.cc
index 11adcf2..be8de03 100644
--- a/runtime/vm/compiler/assembler/assembler_arm_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm_test.cc
@@ -3409,6 +3409,25 @@
   }
 }
 
+// Verify that vmins(-0.0, 0.0) = -0.0
+ASSEMBLER_TEST_GENERATE(Vminqs_zero, assembler) {
+  if (TargetCPUFeatures::neon_supported()) {
+    __ veorq(Q1, Q1, Q1);
+    __ vnegqs(Q2, Q1);
+    __ vminqs(Q0, Q1, Q2);
+  }
+  __ Ret();
+}
+
+ASSEMBLER_TEST_RUN(Vminqs_zero, test) {
+  EXPECT(test != NULL);
+  if (TargetCPUFeatures::neon_supported()) {
+    typedef int (*Tst)() DART_UNUSED;
+    float res = EXECUTE_TEST_CODE_FLOAT(Tst, test->entry());
+    EXPECT_EQ(true, signbit(res) && (res == 0.0));
+  }
+}
+
 ASSEMBLER_TEST_GENERATE(Vminqs, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
     __ LoadSImmediate(S0, 1.0);
@@ -3441,6 +3460,25 @@
   }
 }
 
+ASSEMBLER_TEST_GENERATE(Vmaxqs_zero, assembler) {
+  if (TargetCPUFeatures::neon_supported()) {
+    __ veorq(Q1, Q1, Q1);
+    __ vnegqs(Q2, Q1);
+    __ vmaxqs(Q0, Q2, Q1);
+  }
+  __ Ret();
+}
+
+// Verify that vmaxqs(-0.0, 0.0) = 0.0
+ASSEMBLER_TEST_RUN(Vmaxqs_zero, test) {
+  EXPECT(test != NULL);
+  if (TargetCPUFeatures::neon_supported()) {
+    typedef int (*Tst)() DART_UNUSED;
+    float res = EXECUTE_TEST_CODE_FLOAT(Tst, test->entry());
+    EXPECT_EQ(true, !signbit(res) && (res == 0.0));
+  }
+}
+
 ASSEMBLER_TEST_GENERATE(Vmaxqs, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
     __ LoadSImmediate(S0, 1.0);
diff --git a/runtime/vm/instructions.cc b/runtime/vm/instructions.cc
new file mode 100644
index 0000000..b265420
--- /dev/null
+++ b/runtime/vm/instructions.cc
@@ -0,0 +1,41 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/instructions.h"
+
+#include "vm/object.h"
+#if defined(DART_PRECOMPILER)
+#include "vm/compiler/aot/precompiler.h"
+#endif
+
+namespace dart {
+
+bool ObjectAtPoolIndex(const Code& code, intptr_t index, Object* obj) {
+#if defined(DART_PRECOMPILER)
+  if (FLAG_precompiled_mode) {
+    Precompiler* precompiler = Precompiler::Instance();
+    if (precompiler != nullptr) {
+      compiler::ObjectPoolBuilder* pool =
+          precompiler->global_object_pool_builder();
+      if (index < pool->CurrentLength()) {
+        compiler::ObjectPoolBuilderEntry& entry = pool->EntryAt(index);
+        if (entry.type() == compiler::ObjectPoolBuilderEntry::kTaggedObject) {
+          *obj = entry.obj_->ptr();
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+#endif
+  const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
+  if (!pool.IsNull() && (index < pool.Length()) &&
+      (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
+    *obj = pool.ObjectAt(index);
+    return true;
+  }
+  return false;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/instructions.h b/runtime/vm/instructions.h
index 5dbe5d6..3ddb87d 100644
--- a/runtime/vm/instructions.h
+++ b/runtime/vm/instructions.h
@@ -26,6 +26,7 @@
 class Object;
 class Code;
 
+bool ObjectAtPoolIndex(const Code& code, intptr_t index, Object* obj);
 bool DecodeLoadObjectFromPoolOrThread(uword pc, const Code& code, Object* obj);
 
 #if !defined(TARGET_ARCH_IA32)
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index ecacd45..9a3f92f 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -197,12 +197,7 @@
   Register dst;
   if (IsLoadWithOffset(instr, PP, &offset, &dst)) {
     intptr_t index = ObjectPool::IndexFromOffset(offset);
-    const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
-    if (!pool.IsNull() && (index < pool.Length()) &&
-        (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
-      *obj = pool.ObjectAt(index);
-      return true;
-    }
+    return ObjectAtPoolIndex(code, index, obj);
   } else if (IsLoadWithOffset(instr, THR, &offset, &dst)) {
     return Thread::ObjectAtOffset(offset, obj);
   }
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 0c64963..d78c779 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -304,17 +304,27 @@
       // PP is untagged on ARM64.
       ASSERT(Utils::IsAligned(offset, 8));
       intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
-      const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
-      if (!pool.IsNull() && (index < pool.Length()) &&
-          (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
-        *obj = pool.ObjectAt(index);
-        return true;
-      }
+      return ObjectAtPoolIndex(code, index, obj);
     } else if (instr->RnField() == THR) {
       return Thread::ObjectAtOffset(offset, obj);
     }
+    if (instr->RnField() == instr->RtField()) {
+      Instr* add = Instr::At(pc - Instr::kInstrSize);
+      if (add->IsAddSubImmOp() && add->SFField() && (instr->Bit(22) == 1) &&
+          (add->RdField() == add->RtField())) {
+        offset = (add->Imm12Field() << 12) + offset;
+        if (add->RnField() == PP) {
+          // PP is untagged on ARM64.
+          ASSERT(Utils::IsAligned(offset, 8));
+          intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
+          return ObjectAtPoolIndex(code, index, obj);
+        } else if (add->RnField() == THR) {
+          return Thread::ObjectAtOffset(offset, obj);
+        }
+      }
+    }
+    // TODO(rmacnak): Loads with offsets beyond 24 bits.
   }
-  // TODO(rmacnak): Loads with offsets beyond 12 bits.
 
   if (instr->IsAddSubImmOp() && instr->SFField() &&
       (instr->RnField() == NULL_REG)) {
diff --git a/runtime/vm/instructions_riscv.cc b/runtime/vm/instructions_riscv.cc
index cabe480..3a7d2a8 100644
--- a/runtime/vm/instructions_riscv.cc
+++ b/runtime/vm/instructions_riscv.cc
@@ -231,12 +231,7 @@
           return false;  // Being used as argument register A5.
         }
         intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
-        const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
-        if (!pool.IsNull() && (index < pool.Length()) &&
-            (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
-          *obj = pool.ObjectAt(index);
-          return true;
-        }
+        return ObjectAtPoolIndex(code, index, obj);
       } else if (instr.rs1p() == THR) {
         return Thread::ObjectAtOffset(offset, obj);
       }
@@ -255,12 +250,7 @@
           return false;  // Being used as argument register A5.
         }
         intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
-        const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
-        if (!pool.IsNull() && (index < pool.Length()) &&
-            (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
-          *obj = pool.ObjectAt(index);
-          return true;
-        }
+        return ObjectAtPoolIndex(code, index, obj);
       } else if (instr.rs1() == THR) {
         return Thread::ObjectAtOffset(offset, obj);
       }
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index 30d7ed7..e2a6403 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -59,21 +59,11 @@
     if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) {  // movq, cmpq
       if ((bytes[2] & 0xc7) == (0x80 | (PP & 7))) {  // [r15+disp32]
         intptr_t index = IndexFromPPLoadDisp32(pc + 3);
-        const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
-        if (!pool.IsNull() && (index < pool.Length()) &&
-            (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
-          *obj = pool.ObjectAt(index);
-          return true;
-        }
+        return ObjectAtPoolIndex(code, index, obj);
       }
       if ((bytes[2] & 0xc7) == (0x40 | (PP & 7))) {  // [r15+disp8]
         intptr_t index = IndexFromPPLoadDisp8(pc + 3);
-        const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool());
-        if (!pool.IsNull() && (index < pool.Length()) &&
-            (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) {
-          *obj = pool.ObjectAt(index);
-          return true;
-        }
+        return ObjectAtPoolIndex(code, index, obj);
       }
     }
   }
diff --git a/runtime/vm/log.cc b/runtime/vm/log.cc
index 809df77..70669b3 100644
--- a/runtime/vm/log.cc
+++ b/runtime/vm/log.cc
@@ -161,8 +161,11 @@
 
 bool Log::ShouldLogForIsolateGroup(const IsolateGroup* isolate_group) {
   if (FLAG_isolate_log_filter == nullptr) {
+    // By default, do not log for the service or kernel isolates.
+    if (isolate_group == Dart::vm_isolate_group()) {
+      return true;
+    }
     if (IsolateGroup::IsSystemIsolateGroup(isolate_group)) {
-      // By default, do not log for the service or kernel isolates.
       return false;
     }
     return true;
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 8dd8013..e6381eb 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -2893,6 +2893,22 @@
   s2->data_[i2].u = tmp;
 }
 
+static float vminf(float f1, float f2) {
+  if (f1 == f2) {
+    // take care of (-0.0) < 0.0, (they are equal according to minss)
+    return signbit(f1) ? f1 : f2;
+  }
+  return f1 > f2 ? f2 : f1;
+}
+
+static float vmaxf(float f1, float f2) {
+  if (f1 == f2) {
+    // take care of (-0.0) < 0.0, (they are equal according to minss)
+    return signbit(f1) ? f2 : f1;
+  }
+  return f1 < f2 ? f2 : f1;
+}
+
 void Simulator::DecodeSIMDDataProcessing(Instr* instr) {
   ASSERT(instr->ConditionField() == kSpecialCondition);
 
@@ -3118,13 +3134,13 @@
                (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 0)) {
       // Format(instr, "vminqs 'qd, 'qn, 'qm");
       for (int i = 0; i < 4; i++) {
-        s8d.data_[i].f = fminf(s8n.data_[i].f, s8m.data_[i].f);
+        s8d.data_[i].f = vminf(s8n.data_[i].f, s8m.data_[i].f);
       }
     } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) &&
                (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
       // Format(instr, "vmaxqs 'qd, 'qn, 'qm");
       for (int i = 0; i < 4; i++) {
-        s8d.data_[i].f = fmaxf(s8n.data_[i].f, s8m.data_[i].f);
+        s8d.data_[i].f = vmaxf(s8n.data_[i].f, s8m.data_[i].f);
       }
     } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
                (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 4f34a91..fbb9df4 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -3003,6 +3003,38 @@
   }
 }
 
+static float vminf(float f1, float f2) {
+  if (f1 == f2) {
+    // take care of (-0.0) < 0.0, (they are equal according to minss)
+    return signbit(f1) ? f1 : f2;
+  }
+  return f1 > f2 ? f2 : f1;
+}
+
+static float vmaxf(float f1, float f2) {
+  if (f1 == f2) {
+    // take care of (-0.0) < 0.0, (they are equal according to minss)
+    return signbit(f1) ? f2 : f1;
+  }
+  return f1 < f2 ? f2 : f1;
+}
+
+static double vmind(double f1, double f2) {
+  if (f1 == f2) {
+    // take care of (-0.0) < 0.0, (they are equal according to minss)
+    return signbit(f1) ? f1 : f2;
+  }
+  return f1 > f2 ? f2 : f1;
+}
+
+static double vmaxd(double f1, double f2) {
+  if (f1 == f2) {
+    // take care of (-0.0) < 0.0, (they are equal according to minss)
+    return signbit(f1) ? f2 : f1;
+  }
+  return f1 < f2 ? f2 : f1;
+}
+
 void Simulator::DecodeSIMDThreeSame(Instr* instr) {
   const int Q = instr->Bit(30);
   const int U = instr->Bit(29);
@@ -3069,11 +3101,11 @@
       } else if ((U == 0) && (opcode == 0x1e)) {
         if (instr->Bit(23) == 1) {
           // Format(instr, "vmin'vsz 'vd, 'vn, 'vm");
-          const float m = fminf(vn_flt, vm_flt);
+          const float m = vminf(vn_flt, vm_flt);
           res = bit_cast<int32_t, float>(m);
         } else {
           // Format(instr, "vmax'vsz 'vd, 'vn, 'vm");
-          const float m = fmaxf(vn_flt, vm_flt);
+          const float m = vmaxf(vn_flt, vm_flt);
           res = bit_cast<int32_t, float>(m);
         }
       } else if ((U == 0) && (opcode == 0x1f)) {
@@ -3143,11 +3175,11 @@
       } else if ((U == 0) && (opcode == 0x1e)) {
         if (instr->Bit(23) == 1) {
           // Format(instr, "vmin'vsz 'vd, 'vn, 'vm");
-          const double m = fmin(vn_dbl, vm_dbl);
+          const double m = vmind(vn_dbl, vm_dbl);
           res = bit_cast<int64_t, double>(m);
         } else {
           // Format(instr, "vmax'vsz 'vd, 'vn, 'vm");
-          const double m = fmax(vn_dbl, vm_dbl);
+          const double m = vmaxd(vn_dbl, vm_dbl);
           res = bit_cast<int64_t, double>(m);
         }
       } else {
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index 0a2264a..b7a9c01 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -126,6 +126,7 @@
   "hash_table.h",
   "image_snapshot.cc",
   "image_snapshot.h",
+  "instructions.cc",
   "instructions.h",
   "instructions_arm.cc",
   "instructions_arm.h",
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index e17cc71..b9bcd19 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -299,42 +299,6 @@
   const _ZoneFunction(this.zone, this.function);
 }
 
-class _RunNullaryZoneFunction {
-  final _Zone zone;
-  final RunHandler function;
-  const _RunNullaryZoneFunction(this.zone, this.function);
-}
-
-class _RunUnaryZoneFunction {
-  final _Zone zone;
-  final RunUnaryHandler function;
-  const _RunUnaryZoneFunction(this.zone, this.function);
-}
-
-class _RunBinaryZoneFunction {
-  final _Zone zone;
-  final RunBinaryHandler function;
-  const _RunBinaryZoneFunction(this.zone, this.function);
-}
-
-class _RegisterNullaryZoneFunction {
-  final _Zone zone;
-  final RegisterCallbackHandler function;
-  const _RegisterNullaryZoneFunction(this.zone, this.function);
-}
-
-class _RegisterUnaryZoneFunction {
-  final _Zone zone;
-  final RegisterUnaryCallbackHandler function;
-  const _RegisterUnaryZoneFunction(this.zone, this.function);
-}
-
-class _RegisterBinaryZoneFunction {
-  final _Zone zone;
-  final RegisterBinaryCallbackHandler function;
-  const _RegisterBinaryZoneFunction(this.zone, this.function);
-}
-
 /// A parameter object with custom zone function handlers for [Zone.fork].
 ///
 /// A zone specification is a parameter object passed to [Zone.fork]
@@ -1069,12 +1033,12 @@
 
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
   // all fields.
-  _RunNullaryZoneFunction get _run;
-  _RunUnaryZoneFunction get _runUnary;
-  _RunBinaryZoneFunction get _runBinary;
-  _RegisterNullaryZoneFunction get _registerCallback;
-  _RegisterUnaryZoneFunction get _registerUnaryCallback;
-  _RegisterBinaryZoneFunction get _registerBinaryCallback;
+  _ZoneFunction<RunHandler> get _run;
+  _ZoneFunction<RunUnaryHandler> get _runUnary;
+  _ZoneFunction<RunBinaryHandler> get _runBinary;
+  _ZoneFunction<RegisterCallbackHandler> get _registerCallback;
+  _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback;
+  _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
   _ZoneFunction<CreateTimerHandler> get _createTimer;
@@ -1121,12 +1085,12 @@
   // inheritable zone functions.
   // TODO(floitsch): the types of the `_ZoneFunction`s should have a type for
   // all fields, but we can't use generic function types as type arguments.
-  _RunNullaryZoneFunction _run;
-  _RunUnaryZoneFunction _runUnary;
-  _RunBinaryZoneFunction _runBinary;
-  _RegisterNullaryZoneFunction _registerCallback;
-  _RegisterUnaryZoneFunction _registerUnaryCallback;
-  _RegisterBinaryZoneFunction _registerBinaryCallback;
+  _ZoneFunction<RunHandler> _run;
+  _ZoneFunction<RunUnaryHandler> _runUnary;
+  _ZoneFunction<RunBinaryHandler> _runBinary;
+  _ZoneFunction<RegisterCallbackHandler> _registerCallback;
+  _ZoneFunction<RegisterUnaryCallbackHandler> _registerUnaryCallback;
+  _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback;
   _ZoneFunction<ErrorCallbackHandler> _errorCallback;
   _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
   _ZoneFunction<CreateTimerHandler> _createTimer;
@@ -1168,29 +1132,30 @@
     // All other zones have a non-null parent.
     var run = specification.run;
     if (run != null) {
-      _run = _RunNullaryZoneFunction(this, run);
+      _run = _ZoneFunction<RunHandler>(this, run);
     }
     var runUnary = specification.runUnary;
     if (runUnary != null) {
-      _runUnary = _RunUnaryZoneFunction(this, runUnary);
+      _runUnary = _ZoneFunction<RunUnaryHandler>(this, runUnary);
     }
     var runBinary = specification.runBinary;
     if (runBinary != null) {
-      _runBinary = _RunBinaryZoneFunction(this, runBinary);
+      _runBinary = _ZoneFunction<RunBinaryHandler>(this, runBinary);
     }
     var registerCallback = specification.registerCallback;
     if (registerCallback != null) {
-      _registerCallback = _RegisterNullaryZoneFunction(this, registerCallback);
+      _registerCallback =
+          _ZoneFunction<RegisterCallbackHandler>(this, registerCallback);
     }
     var registerUnaryCallback = specification.registerUnaryCallback;
     if (registerUnaryCallback != null) {
-      _registerUnaryCallback =
-          _RegisterUnaryZoneFunction(this, registerUnaryCallback);
+      _registerUnaryCallback = _ZoneFunction<RegisterUnaryCallbackHandler>(
+          this, registerUnaryCallback);
     }
     var registerBinaryCallback = specification.registerBinaryCallback;
     if (registerBinaryCallback != null) {
-      _registerBinaryCallback =
-          _RegisterBinaryZoneFunction(this, registerBinaryCallback);
+      _registerBinaryCallback = _ZoneFunction<RegisterBinaryCallbackHandler>(
+          this, registerBinaryCallback);
     }
     var errorCallback = specification.errorCallback;
     if (errorCallback != null) {
@@ -1546,18 +1511,21 @@
 class _RootZone extends _Zone {
   const _RootZone();
 
-  _RunNullaryZoneFunction get _run =>
-      const _RunNullaryZoneFunction(_rootZone, _rootRun);
-  _RunUnaryZoneFunction get _runUnary =>
-      const _RunUnaryZoneFunction(_rootZone, _rootRunUnary);
-  _RunBinaryZoneFunction get _runBinary =>
-      const _RunBinaryZoneFunction(_rootZone, _rootRunBinary);
-  _RegisterNullaryZoneFunction get _registerCallback =>
-      const _RegisterNullaryZoneFunction(_rootZone, _rootRegisterCallback);
-  _RegisterUnaryZoneFunction get _registerUnaryCallback =>
-      const _RegisterUnaryZoneFunction(_rootZone, _rootRegisterUnaryCallback);
-  _RegisterBinaryZoneFunction get _registerBinaryCallback =>
-      const _RegisterBinaryZoneFunction(_rootZone, _rootRegisterBinaryCallback);
+  _ZoneFunction<RunHandler> get _run =>
+      const _ZoneFunction<RunHandler>(_rootZone, _rootRun);
+  _ZoneFunction<RunUnaryHandler> get _runUnary =>
+      const _ZoneFunction<RunUnaryHandler>(_rootZone, _rootRunUnary);
+  _ZoneFunction<RunBinaryHandler> get _runBinary =>
+      const _ZoneFunction<RunBinaryHandler>(_rootZone, _rootRunBinary);
+  _ZoneFunction<RegisterCallbackHandler> get _registerCallback =>
+      const _ZoneFunction<RegisterCallbackHandler>(
+          _rootZone, _rootRegisterCallback);
+  _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback =>
+      const _ZoneFunction<RegisterUnaryCallbackHandler>(
+          _rootZone, _rootRegisterUnaryCallback);
+  _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback =>
+      const _ZoneFunction<RegisterBinaryCallbackHandler>(
+          _rootZone, _rootRegisterBinaryCallback);
   _ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
       const _ZoneFunction<ErrorCallbackHandler>(_rootZone, _rootErrorCallback);
   _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
diff --git a/tests/lib_2/typed_data/float64x2_clamp_test.dart b/tests/lib_2/typed_data/float64x2_clamp_test.dart
index 3bbe32f..ea028d0 100644
--- a/tests/lib_2/typed_data/float64x2_clamp_test.dart
+++ b/tests/lib_2/typed_data/float64x2_clamp_test.dart
@@ -1,7 +1,8 @@
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
+// VMOptions=--intrinsify --optimization-counter-threshold=10 --no-background-compilation
+// VMOptions=--no-intrinsify --optimization-counter-threshold=10 --no-background-compilation
 
 // @dart = 2.9
 
diff --git a/tools/VERSION b/tools/VERSION
index ed908bd..05f1cda 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 106
+PRERELEASE 107
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 150f06f..3553d41 100644
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -20,6 +20,7 @@
     ...listSubdirectories(platform('third_party/pkg')),
     ...listSubdirectories(platform('third_party/pkg/file/packages')),
     ...listSubdirectories(platform('third_party/pkg/test/pkgs')),
+    ...listSubdirectories(platform('third_party/pkg/shelf/pkgs')),
     platform('pkg/vm_service/test/test_package'),
     platform('runtime/observatory_2'),
     platform(
@@ -36,6 +37,12 @@
   // Remove the package at the top-level of the package:file monorepo.
   packageDirs.remove(platform('third_party/pkg/file'));
 
+  // Temporarily ignored copies of shelf mono repo package
+  packageDirs.remove(platform('third_party/pkg/shelf_packages_handler'));
+  packageDirs.remove(platform('third_party/pkg/shelf_proxy'));
+  packageDirs.remove(platform('third_party/pkg/shelf_static'));
+  packageDirs.remove(platform('third_party/pkg/shelf_web_socket'));
+
   var cfePackageDirs = [
     platform('pkg/front_end/testcases'),
   ];
