Version 2.10.0-7.1.beta

Merge commit 'f073f8d7497e2031489eaabdc3b099cbb7ddf869' into beta
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 25d9592..706d694 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-06-29T11:21:54.984521",
+  "generated": "2020-08-07T16:47:24.963156",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -21,6 +21,41 @@
       "languageVersion": "2.2"
     },
     {
+      "name": "_fe_analyzer_shared_assigned_variables",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/assigned_variables",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_definite_assignment",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/definite_assignment",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_definite_unassignment",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/definite_unassignment",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_inheritance",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/inheritance",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_nullability",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/nullability",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_reachability",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/reachability",
+      "packageUri": ".nonexisting/"
+    },
+    {
+      "name": "_fe_analyzer_shared_type_promotion",
+      "rootUri": "../pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion",
+      "packageUri": ".nonexisting/"
+    },
+    {
       "name": "_js_interop_checks",
       "rootUri": "../pkg/_js_interop_checks",
       "packageUri": "lib/",
@@ -48,7 +83,7 @@
       "name": "analyzer",
       "rootUri": "../pkg/analyzer",
       "packageUri": "lib/",
-      "languageVersion": "2.6"
+      "languageVersion": "2.7"
     },
     {
       "name": "analyzer_cli",
@@ -72,7 +107,7 @@
       "name": "async",
       "rootUri": "../third_party/pkg/async",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.10"
     },
     {
       "name": "async_helper",
@@ -83,19 +118,19 @@
       "name": "bazel_worker",
       "rootUri": "../third_party/pkg/bazel_worker",
       "packageUri": "lib/",
-      "languageVersion": "2.1"
+      "languageVersion": "2.3"
     },
     {
       "name": "benchmark_harness",
       "rootUri": "../third_party/pkg/benchmark_harness",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "boolean_selector",
       "rootUri": "../third_party/pkg/boolean_selector",
       "packageUri": "lib/",
-      "languageVersion": "2.4"
+      "languageVersion": "2.10"
     },
     {
       "name": "build_integration",
@@ -107,7 +142,7 @@
       "name": "charcode",
       "rootUri": "../third_party/pkg/charcode",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.9"
     },
     {
       "name": "cli_util",
@@ -119,7 +154,7 @@
       "name": "collection",
       "rootUri": "../third_party/pkg/collection",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "compiler",
@@ -131,7 +166,7 @@
       "name": "convert",
       "rootUri": "../third_party/pkg/convert",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "crypto",
@@ -225,7 +260,7 @@
       "name": "fixnum",
       "rootUri": "../third_party/pkg/fixnum",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "front_end",
@@ -327,7 +362,7 @@
       "name": "js",
       "rootUri": "../pkg/js",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "js_ast",
@@ -339,7 +374,7 @@
       "name": "js_runtime",
       "rootUri": "../sdk/lib/_internal/js_runtime",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "json_rpc_2",
@@ -354,6 +389,11 @@
       "languageVersion": "2.2"
     },
     {
+      "name": "language_versioning_2.7_test",
+      "rootUri": "../pkg/language_versioning_2.7_test",
+      "languageVersion": "2.7"
+    },
+    {
       "name": "linter",
       "rootUri": "../third_party/pkg/linter",
       "packageUri": "lib/",
@@ -369,19 +409,19 @@
       "name": "markdown",
       "rootUri": "../third_party/pkg/markdown",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.6"
     },
     {
       "name": "matcher",
       "rootUri": "../third_party/pkg/matcher",
       "packageUri": "lib/",
-      "languageVersion": "2.4"
+      "languageVersion": "2.10"
     },
     {
       "name": "meta",
       "rootUri": "../pkg/meta",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "mime",
@@ -446,19 +486,19 @@
       "name": "path",
       "rootUri": "../third_party/pkg/path",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "pedantic",
       "rootUri": "../third_party/pkg/pedantic",
       "packageUri": "lib/",
-      "languageVersion": "2.1"
+      "languageVersion": "2.10"
     },
     {
       "name": "pool",
       "rootUri": "../third_party/pkg/pool",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "protobuf",
@@ -494,7 +534,7 @@
       "name": "sdk_library_metadata",
       "rootUri": "../sdk/lib/_internal/sdk_library_metadata",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "shelf",
@@ -536,19 +576,19 @@
       "name": "source_map_stack_trace",
       "rootUri": "../third_party/pkg/source_map_stack_trace",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.10"
     },
     {
       "name": "source_maps",
       "rootUri": "../third_party/pkg/source_maps",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "source_span",
       "rootUri": "../third_party/pkg/source_span",
       "packageUri": "lib/",
-      "languageVersion": "2.6"
+      "languageVersion": "2.10"
     },
     {
       "name": "sourcemap_testing",
@@ -557,10 +597,16 @@
       "languageVersion": "2.1"
     },
     {
+      "name": "sse",
+      "rootUri": "../third_party/pkg/sse",
+      "packageUri": "lib/",
+      "languageVersion": "2.2"
+    },
+    {
       "name": "stack_trace",
       "rootUri": "../third_party/pkg/stack_trace",
       "packageUri": "lib/",
-      "languageVersion": "2.0"
+      "languageVersion": "2.10"
     },
     {
       "name": "stagehand",
@@ -578,12 +624,18 @@
       "name": "stream_channel",
       "rootUri": "../third_party/pkg/stream_channel",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.10"
     },
     {
       "name": "string_scanner",
       "rootUri": "../third_party/pkg/string_scanner",
       "packageUri": "lib/",
+      "languageVersion": "2.10"
+    },
+    {
+      "name": "sync_http",
+      "rootUri": "../third_party/pkg/sync_http",
+      "packageUri": "lib/",
       "languageVersion": "2.0"
     },
     {
@@ -596,25 +648,25 @@
       "name": "term_glyph",
       "rootUri": "../third_party/pkg/term_glyph",
       "packageUri": "lib/",
-      "languageVersion": "1.8"
+      "languageVersion": "2.10"
     },
     {
       "name": "test",
       "rootUri": "../third_party/pkg/test/pkgs/test",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.10"
     },
     {
       "name": "test_api",
       "rootUri": "../third_party/pkg/test/pkgs/test_api",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.10"
     },
     {
       "name": "test_core",
       "rootUri": "../third_party/pkg/test/pkgs/test_core",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.10"
     },
     {
       "name": "test_descriptor",
@@ -656,7 +708,7 @@
       "name": "typed_data",
       "rootUri": "../third_party/pkg/typed_data",
       "packageUri": "lib/",
-      "languageVersion": "2.9"
+      "languageVersion": "2.10"
     },
     {
       "name": "usage",
@@ -665,6 +717,12 @@
       "languageVersion": "2.0"
     },
     {
+      "name": "vector_math",
+      "rootUri": "../third_party/pkg/vector_math",
+      "packageUri": "lib/",
+      "languageVersion": "2.10"
+    },
+    {
       "name": "vm",
       "rootUri": "../pkg/vm",
       "packageUri": "lib/",
@@ -701,10 +759,16 @@
       "languageVersion": "2.0"
     },
     {
+      "name": "webdriver",
+      "rootUri": "../third_party/pkg/webdriver",
+      "packageUri": "lib/",
+      "languageVersion": "2.0"
+    },
+    {
       "name": "yaml",
       "rootUri": "../third_party/pkg/yaml",
       "packageUri": "lib/",
       "languageVersion": "2.4"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/.packages b/.packages
index 2b486aa..ee073a7 100644
--- a/.packages
+++ b/.packages
@@ -92,11 +92,13 @@
 sourcemap_testing:pkg/sourcemap_testing/lib
 source_maps:third_party/pkg/source_maps/lib
 source_span:third_party/pkg/source_span/lib
+sse:third_party/pkg/sse/lib
 stack_trace:third_party/pkg/stack_trace/lib
 stagehand:third_party/pkg/stagehand/lib
 status_file:pkg/status_file/lib
 stream_channel:third_party/pkg/stream_channel/lib
 string_scanner:third_party/pkg/string_scanner/lib
+sync_http:third_party/pkg/sync_http/lib
 telemetry:pkg/telemetry/lib
 term_glyph:third_party/pkg/term_glyph/lib
 test:third_party/pkg/test/pkgs/test/lib
@@ -110,10 +112,12 @@
 tflite_native:third_party/pkg/tflite_native/lib
 typed_data:third_party/pkg/typed_data/lib
 usage:third_party/pkg/usage/lib
+vector_math:third_party/pkg/vector_math/lib
 vm:pkg/vm/lib
 vm_service:pkg/vm_service/lib
 vm_snapshot_analysis:pkg/vm_snapshot_analysis/lib
 watcher:third_party/pkg/watcher/lib
+webdriver:third_party/pkg/webdriver/lib
 web_components:third_party/pkg/web_components/lib
 web_socket_channel:third_party/pkg/web_socket_channel/lib
 yaml:third_party/pkg/yaml/lib
diff --git a/BUILD.gn b/BUILD.gn
index c758c49..d59ce8e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -61,7 +61,10 @@
   # TODO(bkonyi): this dep causes a segfault on Android XARM_X64 builds.
   # See issue #41776.
   if (dart_target_arch != "arm") {
-    deps += [ "utils/dartdev:dartdev" ]
+    deps += [
+      "utils/dartdev:dartdev",
+      "utils/dds:dds",
+    ]
   }
 }
 
@@ -149,3 +152,66 @@
 group("compressed_observatory_archive") {
   deps = [ "runtime/observatory:copy_compressed_observatory_archive" ]
 }
+
+if (is_fuchsia) {
+  import("third_party/fuchsia/sdk/linux/build/component.gni")
+  import("third_party/fuchsia/sdk/linux/build/package.gni")
+
+  fuchsia_component("fuchsia_test_component") {
+    testonly = true
+    data_deps = [ "runtime/bin:dart" ]
+    manifest = "build/fuchsia/dart.cmx"
+
+    resource_files = [
+      ".dart_tool/package_config.json",
+      "pkg/testing/test/hello_test.dart",
+      "tools/addlatexhash.dart",
+    ]
+    resource_dirs = [
+      "tests/standalone_2",
+      "pkg/async_helper",
+      "pkg/expect",
+      "pkg/meta",
+      "pkg/native_stack_traces",
+      "pkg/smith",
+      "third_party/pkg/args",
+      "third_party/pkg/async",
+      "third_party/pkg/charcode",
+      "third_party/pkg/collection",
+      "third_party/pkg/convert",
+      "third_party/pkg/crypto",
+      "third_party/pkg/http",
+      "third_party/pkg/http_parser",
+      "third_party/pkg/path",
+      "third_party/pkg/pool",
+      "third_party/pkg/stack_trace",
+      "third_party/pkg/string_scanner",
+      "third_party/pkg/typed_data",
+    ]
+
+    resources = []
+    foreach(file, resource_files) {
+      resources += [
+        {
+          path = file
+          dest = "data/" + file
+        },
+      ]
+    }
+    resources +=
+        exec_script("tools/fuchsia/find_resources.py", resource_dirs, "json")
+  }
+
+  fuchsia_package("fuchsia_test_package") {
+    package_name = "dart_test_"
+    if (is_debug) {
+      package_name += "debug"
+    } else if (is_release) {
+      package_name += "release"
+    } else if (is_product) {
+      package_name += "product"
+    }
+    testonly = true
+    deps = [ ":fuchsia_test_component" ]
+  }
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 725055b..a03d376 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,35 @@
-## 2.9.0
+## 2.10.0
+
+### Core libraries
+
+#### `dart:typed_data`
+
+*   Class `BytesBuilder` is moved from `dart:io` to `dart:typed_data`.
+    It's temporarily being exported from `dart:io` as well.
+
+### Dart VM
+
+*   Introduces `Dart_FinalizableHandle`s. They do auto-delete, and the weakly
+    referred object cannot be accessed through them.
+
+### Tools
+
+#### Linter
+
+Updated the Linter to `0.1.118`, which includes:
+
+* New lint: `unnecessary_nullable_for_final_variable_declarations`.
+* Fixed NPE in `prefer_asserts_in_initializer_lists`.
+* Fixed range error in `unnecessary_string_escapes`.
+* `unsafe_html` updated to support unique error codes.
+* Updates to `diagnostic_describe_all_properties` to check for `Diagnosticable`s (not `DiagnosticableMixin`s).
+* New lint: `use_late`.
+* Fixed `unnecessary_lambdas` to respect deferred imports.
+* Updated `public_member_api_docs` to check mixins.
+* Updated `unnecessary_statements` to skip `as` expressions.
+* Fixed `prefer_relative_imports` to work with path dependencies.
+
+## 2.9.0 - 2020-08-05
 
 ### Language
 
@@ -116,19 +147,27 @@
 ### Pub
 * `pub run` and `pub global run` accepts a `--enable-experiment` flag enabling
   experiments in the Dart VM (and language).
+* Warn when publishing the first null-safe version of a package.
+* `pub outdated`:
+  * Introduce `--mode=null-safety` flag that will report which of your
+    dependencies you can upgrade to fully support null safety.
+  * If the current version of a dependency is a prerelease
+    version, use prereleases for latest if there is no newer stable.
+  * Don't require a `pubspec.lock` file. When the lockfile is missing, the
+    **Current** column is empty.
+* `pub upgrade`: Show summary count of outdated packages after running.
+  It will also only show newer packages if they are not prereleases or
+  the package is already a prerelease.
 * Publishing Flutter plugins using the old plugin format is no longer allowed.
   Plugins using the old plugin format can still be consumed.
-* Introduce `pub outdated --mode=null-safety` that will report which of your
-  dependencies you can upgrade to fully support null safety.
-* Fix `pub run` precompilation with relative `PUB_CACHE` paths (#2486)
-* Warn at publishing first time a package version opts in to null-safety.
-* Preserve Windows line endings in pubspec.lock if they are already there (#2489)
+* `pub run`: Fix precompilation with relative `PUB_CACHE` paths
+  ([#2486](https://github.com/dart-lang/pub/pull/2486)).
+* Preserve Windows line endings in `pubspec.lock` if they are already there
+  ([#2489](https://github.com/dart-lang/pub/pull/2489)).
 * Better terminal color-detection. Use colors in terminals on Windows.
-* `pub outdated`: If the current version of a dependency is a prerelease
-  version, use prereleases for latest if no newer stable.
-* `pub outdated` now works without a lockfile. In that case the 'Current'
-  column will be empty.
-* `pub upgrade`: Show summary count of outdated packages after running.
+* Fix git folder names in cache, allowing for ssh-style git
+  dependencies.
+* Fix: Avoid precompilation of dependencies of global packages.
 
 ## 2.8.4 - 2020-06-04
 
diff --git a/DEPS b/DEPS
index 4110d3e..e03a4be 100644
--- a/DEPS
+++ b/DEPS
@@ -39,25 +39,25 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.9.0-18.0.dev",
+  "sdk_tag": "version:2.10.0-3.0.dev",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "4035c66f0cacb70064395473cb54d810c046c225",
-  "co19_2_rev": "620c1148c8b7a3d7f74afacf348c46f109eb64f2",
+  "co19_rev": "74eec903ea06fa09dc8799b0552d55b581a82996",
+  "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
-  "benchmarks_internal_rev": "88af52754f272e7a4c5737b7e003c2ed9e8a754f",
+  "benchmarks_internal_rev": "991d4cb32af0e914763ebbdeced91395bed874d8",
   "checkout_benchmarks_internal": False,
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
   # The list of revisions for these tools comes from Fuchsia, here:
-  # https://fuchsia.googlesource.com/buildtools/+/master/fuchsia.ensure
+  # https://fuchsia.googlesource.com/integration/+/HEAD/prebuilts
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
   "clang_revision": "7e9747b50bcb1be28d4a3236571e8050835497a6",
-  "gn_revision": "239533d2d91a04b3317ca9101cf7189f4e651e4d",
+  "gn_revision": "1e3fd10c5df6b704fc764ee388149e4f32862823",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -66,20 +66,20 @@
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "1.6.0",
-  "async_rev": "e0c41e0c1fb70ba606dc81335c981af7c00987c6",
+  "async_rev": "128c461a97dbdbd9336ba000ba5a5c02e79b8651",
   "bazel_worker_rev": "26680d5e249b249c7216ab2fed0ac8ed4ee285c5",
-  "benchmark_harness_rev": "81641290dea44c34138a109a37e215482f405f81",
-  "boolean_selector_rev": "1309eabed510cc3b7536fd4367d39b97ebee3d69",
+  "benchmark_harness_rev": "ec6b646f5443faa871e126ac1ba248c94ca06257",
+  "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
   "boringssl_gen_rev": "429ccb1877f7987a6f3988228bc2440e61293499",
   "boringssl_rev" : "4dfd5af70191b068aebe567b8e29ce108cee85ce",
   "browser-compat-data_tag": "v1.0.22",
-  "charcode_rev": "9085e6b6127f084d66c0a94810a808121459012a",
+  "charcode_rev": "af1e2d59a9c383da94f99ea51dac4b93fb0626c4",
   "chrome_rev" : "19997",
-  "cli_util_tag" : "0.1.4",
-  "collection_rev": "80f5b6de8a8d8d584732a71bb59912da3e44883b",
-  "convert_rev": "49bde5b371eb5c2c8e721557cf762f17c75e49fc",
+  "cli_util_tag" : "0.2.0",
+  "collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
+  "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
   "crypto_rev": "7422fb2f6584fe1839eb30bc4ca56e9f9760b801",
-  "csslib_rev": "bf372d4fdc6dfa232ad93f77a0a3de0891edd04c",
+  "csslib_rev": "451448a9ac03f87a8d0377fc0b411d8c388a6cb4",
   "dart2js_info_tag" : "0.6.0",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
@@ -96,38 +96,39 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_tag": "1.3.6",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.32.1",
+  "chromedriver_tag": "83.0.4103.39",
+  "dartdoc_rev" : "6d5396c2b4bc415ab9cb3d8212b87ecffd90a272",
   "ffi_rev": "454ab0f9ea6bd06942a983238d8a6818b1357edb",
-  "fixnum_rev": "9b38f49f6679654d66a363e69e48173cca07e882",
+  "fixnum_rev": "300c3f025e94a72b7b6770e15f76a4de15f77668",
   "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
   "html_rev": "083a36cd801a4b787ba156b7c6e4c8b2e2daed4a",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev" : "ea269f79321d659208402088f3297e8920a88ee6",
   "http_parser_rev": "6e63a97b5aaa2b4d1215fe01683e51fb73258e54",
   "http_retry_tag": "0.1.1",
-  "http_rev": "a131e563c09349f624d5421237183a06fb10552d",
+  "http_rev": "7b55a2c62a5f6fb680ad7a4607bab7281a235563",
   "http_throttle_tag" : "1.0.2",
   "icu_rev" : "79326efe26e5440f530963704c3c0ff965b3a4ac",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
   "intl_tag": "0.16.1",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "d589e635d8ccb7cda6a804bd571f88abbabab146",
-  "linter_tag": "0.1.117",
+  "linter_tag": "0.1.118",
   "logging_rev": "9561ba016ae607747ae69b846c0e10958ca58ed4",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_rev": "dd150bb64c5f3b41d31f20f399ae2a855f7f8c00",
-  "matcher_rev": "af4fe7daf8e94a46981e4f072872be550a6969e9",
+  "markdown_rev": "acaddfe74217f62498b5cf0cf5429efa6a700be3",
+  "matcher_rev": "9cae8faa7868bf3a88a7ba45eb0bd128e66ac515",
   "mime_rev": "179b5e6a88f4b63f36dc1b8fcbc1e83e5e0cd3a7",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
   "mustache_rev": "664737ecad027e6b96d0d1e627257efa0e46fcb1",
   "oauth2_tag": "1.6.0",
   "package_config_rev": "9c586d04bd26fef01215fd10e7ab96a3050cfa64",
-  "path_rev": "4f3bb71843fe5493ba490828a1721821d7b33746",
-  "pedantic_tag": "v1.9.0",
+  "path_rev": "62ecd5a78ffe5734d14ed0df76d20309084cd04a",
+  "pedantic_rev": "24b38df72430d7e21cb4257828580becb9a39c72",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
-  "pool_rev": "86fbb2cde9bbc66c8d159909d2f65a5981ea5b50",
+  "pool_rev": "eedbd5fde84f9a1a8da643b475305a81841da599",
   "protobuf_rev": "3746c8fd3f2b0147623a8e3db89c3ff4330de760",
-  "pub_rev": "85bdb898aeb2ac7cea76489ba0bf4e52ff7a79bf",
+  "pub_rev": "04b054b62cc437cf23451785fdc50e49cd9de139",
   "pub_semver_tag": "v1.4.4",
   "quiver-dart_tag": "246e754fe45cecb6aa5f3f13b4ed61037ff0d784",
   "resource_rev": "f8e37558a1c4f54550aa463b88a6a831e3e33cd6",
@@ -138,23 +139,27 @@
   "shelf_proxy_tag": "0.1.0+7",
   "shelf_tag": "0.7.3+3",
   "shelf_web_socket_tag": "0.2.2+3",
-  "source_map_stack_trace_tag": "2.0.0",
+  "source_map_stack_trace_rev": "1c3026f69d9771acf2f8c176a1ab750463309cce",
   "source_maps-0.9.4_rev": "38524",
-  "source_maps_rev": "87b4fd9027378bbd51b02e9d7df794eee8a82b7a",
-  "source_span_tag": "1.7.0",
-  "stack_trace_tag": "56811dbb2530d823b764fe167ec335879a4adb32",
+  "source_maps_rev": "53eb92ccfe6e64924054f83038a534b959b12b3e",
+  "source_span_rev": "94833d6cbf4552ebe5d2aa6714acecd93834e53a",
+  "sse_tag": "e5cf68975e8e87171a3dc297577aa073454a91dc",
+  "stack_trace_tag": "d3813ca0a77348e0faf0d6af0cc17913e36afa39",
   "stagehand_tag": "v3.3.9",
-  "stream_channel_tag": "70433d577be02c48cb16d72d65654f3b4d82c6ed",
-  "string_scanner_rev": "a918e7371af6b6e73bfd534ff9da6084741c1f99",
+  "stream_channel_tag": "c446774fd077c9bdbd6235a7aadc661ef60a9727",
+  "string_scanner_rev": "1b63e6e5db5933d7be0a45da6e1129fe00262734",
+  "sync_http_rev": "a85d7ec764ea485cbbc49f3f3e7f1b43f87a1c74",
   "test_descriptor_tag": "1.1.1",
   "test_process_tag": "1.0.3",
-  "term_glyph_rev": "b3da31e9684a99cfe5f192b89914492018b44da7",
+  "term_glyph_rev": "6a0f9b6fb645ba75e7a00a4e20072678327a0347",
   "test_reflective_loader_tag": "0.1.9",
-  "test_rev": "718fe6f93c4655208460f28e89d887c5ef4144c5",
+  "test_rev": "c6b3fe63eda87da1687580071cad1eefd575f851",
   "tflite_native_rev": "3c777c40608a2a9f1427bfe0028ab48e7116b4c1",
-  "typed_data_tag": "0c369b73a9b7ebf042c06512951bfe5b52b84a5f",
+  "typed_data_tag": "f94fc57b8e8c0e4fe4ff6cfd8290b94af52d3719",
   "usage_tag": "3.4.0",
+  "vector_math_rev": "0c9f5d68c047813a6dcdeb88ba7a42daddf25025",
   "watcher_rev": "fc3c9aae5d31d707b3013b42634dde8d8a1161b4",
+  "webdriver_rev": "5a8d6805d9cf8a3cbb4fcd64849b538b7491e50e",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_rev": "490061ef0e22d3c8460ad2802f9948219365ad6b",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
@@ -167,7 +172,7 @@
   # Pinned browser versions used by the testing infrastructure. These are not
   # meant to be downloaded by users for local testing.
   "download_chrome": False,
-  "chrome_tag": "81",
+  "chrome_tag": "84",
   "download_firefox": False,
   "firefox_tag": "67",
 
@@ -321,7 +326,7 @@
   Var("dart_root") + "/third_party/pkg/dart2js_info":
       Var("dart_git") + "dart2js_info.git" + "@" + Var("dart2js_info_tag"),
   Var("dart_root") + "/third_party/pkg/dartdoc":
-      Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_tag"),
+      Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_rev"),
   Var("dart_root") + "/third_party/pkg/ffi":
       Var("dart_git") + "ffi.git" + "@" + Var("ffi_rev"),
   Var("dart_root") + "/third_party/pkg/fixnum":
@@ -373,7 +378,7 @@
   Var("dart_root") + "/third_party/pkg/path":
       Var("dart_git") + "path.git" + "@" + Var("path_rev"),
   Var("dart_root") + "/third_party/pkg/pedantic":
-      Var("dart_git") + "pedantic.git" + "@" + Var("pedantic_tag"),
+      Var("dart_git") + "pedantic.git" + "@" + Var("pedantic_rev"),
   Var("dart_root") + "/third_party/pkg/pool":
       Var("dart_git") + "pool.git" + "@" + Var("pool_rev"),
   Var("dart_root") + "/third_party/pkg/protobuf":
@@ -403,10 +408,12 @@
   Var("dart_root") + "/third_party/pkg/source_maps":
       Var("dart_git") + "source_maps.git" + "@" + Var("source_maps_rev"),
   Var("dart_root") + "/third_party/pkg/source_span":
-      Var("dart_git") + "source_span.git" + "@" + Var("source_span_tag"),
+      Var("dart_git") + "source_span.git" + "@" + Var("source_span_rev"),
   Var("dart_root") + "/third_party/pkg/source_map_stack_trace":
       Var("dart_git") + "source_map_stack_trace.git" +
-      "@" + Var("source_map_stack_trace_tag"),
+      "@" + Var("source_map_stack_trace_rev"),
+  Var("dart_root") + "/third_party/pkg/sse":
+      Var("dart_git") + "sse.git" + "@" + Var("sse_tag"),
   Var("dart_root") + "/third_party/pkg/stack_trace":
       Var("dart_git") + "stack_trace.git" + "@" + Var("stack_trace_tag"),
   Var("dart_root") + "/third_party/pkg/stagehand":
@@ -417,6 +424,8 @@
   Var("dart_root") + "/third_party/pkg/string_scanner":
       Var("dart_git") + "string_scanner.git" +
       "@" + Var("string_scanner_rev"),
+  Var("dart_root") + "/third_party/pkg/sync_http":
+      Var("dart_git") + "sync_http.git" + "@" + Var("sync_http_rev"),
   Var("dart_root") + "/third_party/pkg/term_glyph":
       Var("dart_git") + "term_glyph.git" + "@" + Var("term_glyph_rev"),
   Var("dart_root") + "/third_party/pkg/test":
@@ -434,11 +443,18 @@
       Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
   Var("dart_root") + "/third_party/pkg/usage":
       Var("dart_git") + "usage.git" + "@" + Var("usage_tag"),
+  Var("dart_root") + "/third_party/pkg/vector_math":
+      Var("dart_git") + "external/github.com/google/vector_math.dart.git" +
+      "@" + Var("vector_math_rev"),
   Var("dart_root") + "/third_party/pkg/watcher":
       Var("dart_git") + "watcher.git" + "@" + Var("watcher_rev"),
   Var("dart_root") + "/third_party/pkg/web_components":
       Var("dart_git") + "web-components.git" +
       "@" + Var("web_components_rev"),
+  Var("dart_root") + "/third_party/pkg/webdriver":
+      Var("dart_git") + "external/github.com/google/webdriver.dart.git" +
+      "@" + Var("webdriver_rev"),
+
   Var("dart_root") + "/third_party/pkg/web_socket_channel":
       Var("dart_git") + "web_socket_channel.git" +
       "@" + Var("web_socket_channel_rev"),
@@ -456,6 +472,17 @@
       "dep_type": "cipd",
   },
 
+  Var("dart_root") + "/third_party/webdriver/chrome": {
+    "packages": [
+      {
+        "package": "dart/third_party/chromedriver/${{platform}}",
+        "version": "version:" + Var("chromedriver_tag"),
+      }
+    ],
+    "condition": "host_cpu == 'x64'",
+    "dep_type": "cipd",
+  },
+
   Var("dart_root") + "/pkg/analysis_server/language_model": {
     "packages": [
       {
@@ -512,7 +539,7 @@
     "packages": [
       {
         "package": "dart/cfe/dart2js_dills",
-        "version": "binary_version:43_2",
+        "version": "binary_version:44_2",
       }
     ],
     "dep_type": "cipd",
@@ -650,12 +677,6 @@
     'pattern': '.',
     'action': ['python', 'sdk/build/vs_toolchain.py', 'update'],
   },
-  {
-    # Download dill files for all supported ABI versions, if necessary.
-    'name': 'abiversions',
-    'pattern': '.',
-    'action': ['python', 'sdk/tools/download_abi_dills.py'],
-  },
 ]
 
 hooks_os = {
diff --git a/benchmarks/IsolateSpawn/dart/helloworld.dart b/benchmarks/IsolateSpawn/dart/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawn/dart/helloworld.dart
+++ b/benchmarks/IsolateSpawn/dart/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawn/dart2/helloworld.dart b/benchmarks/IsolateSpawn/dart2/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawn/dart2/helloworld.dart
+++ b/benchmarks/IsolateSpawn/dart2/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
+++ b/benchmarks/IsolateSpawnMemory/dart/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
index 8977e0f..01af7fa 100644
--- a/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
+++ b/benchmarks/IsolateSpawnMemory/dart2/helloworld.dart
@@ -1,3 +1,3 @@
-main() {
+void main() {
   print('Hello, world!');
 }
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 10a97c7..336445e 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -258,6 +258,12 @@
         [ "//build/config/gcc:symbol_visibility_hidden" ]
   }
 }
+if (is_fuchsia) {
+  _native_compiler_configs += [
+    "//third_party/fuchsia/sdk/linux/build/config:compiler",
+    "//third_party/fuchsia/sdk/linux/build/config:runtime_library",
+  ]
+}
 
 if (is_linux) {
   _native_compiler_configs += [ "//build/config/linux:sdk" ]
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 2db2871..3e06c16 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -377,7 +377,7 @@
 #   configs -= [ "//build/config/compiler:clang_stackrealign" ]
 # See https://crbug.com/556393 for details of where it must be avoided.
 config("clang_stackrealign") {
-  if (is_clang && current_cpu == "x86" && !is_nacl) {
+  if (is_clang && current_cpu == "x86" && !is_nacl && !is_win) {
     cflags = [
       # Align the stack on 16-byte boundaries, http://crbug.com/418554.
       "-mstack-alignment=16",
@@ -516,14 +516,14 @@
 
   if (is_clang) {
     default_warning_flags += [
-      "-Wno-deprecated-declarations", # crashpad
-      "-Wno-ignored-pragma-optimize", # icu, double-conversion
-      "-Wno-implicit-int-float-conversion", # icu
+      "-Wno-deprecated-declarations",  # crashpad
+      "-Wno-ignored-pragma-optimize",  # icu, double-conversion
+      "-Wno-implicit-int-float-conversion",  # icu
       "-Wno-macro-redefined",
       "-Wno-microsoft-cast",
       "-Wno-microsoft-unqualified-friend",
-      "-Wno-unknown-argument", # icu
-      "-Wno-unused-value", # crashpad
+      "-Wno-unknown-argument",  # icu
+      "-Wno-unused-value",  # crashpad
     ]
   } else {
     default_warning_flags += [
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
index 2058f033..c357aad 100644
--- a/build/dart/dart_action.gni
+++ b/build/dart/dart_action.gni
@@ -288,6 +288,10 @@
 #  script:
 #    The un-rebased path to the Dart script.
 #
+#  dfe (optional):
+#    Sets the DFE file used by Dart. If not set the VM will attempt to load it
+#    from a snapshot, or fall back on its built-in kernel.
+#
 #  vm_args (optional):
 #    Arguments to pass to the Dart VM.
 #
@@ -323,6 +327,17 @@
                                "visibility",
                                "vm_args",
                              ])
+
+      # Dart has an implicit dependency on the kernel service so unless DFE is
+      # passed, we need to add this dep.
+      if (defined(invoker.dfe)) {
+        vm_args += [ "--dfe=" + rebase_path(invoker.dfe) ]
+      } else {
+        if (!defined(invoker.deps)) {
+          deps = []
+        }
+        deps += [ "$_dart_root/utils/kernel-service:kernel-service" ]
+      }
     }
   } else {
     prebuilt_dart_action(target_name) {
diff --git a/build/fuchsia/config/clang/BUILD.gn b/build/fuchsia/config/clang/BUILD.gn
new file mode 100644
index 0000000..be74d08
--- /dev/null
+++ b/build/fuchsia/config/clang/BUILD.gn
@@ -0,0 +1,31 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/fuchsia/config/clang/clang.gni")
+
+# This adds the runtime deps for C++ for usage when cross compiling.
+group("c++-runtime-deps") {
+  data_deps = [
+    ":clang-runtime-libs",
+  ]
+}
+
+copy("clang-runtime-libs") {
+  if (target_cpu == "arm64") {
+    arch = "aarch64"
+  } else if (target_cpu == "x64") {
+    arch = "x86_64"
+  }
+  vendor = "unknown"
+
+  sys = target_os
+  sources = [
+    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/c++/libc++.so.2.0",
+    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/c++/libc++abi.so.1.0",
+    "${clang_base_path}/lib/${arch}-${vendor}-${sys}/c++/libunwind.so.1.0",
+  ]
+  outputs = [
+    "${root_out_dir}/lib/{{source_name_part}}",
+  ]
+}
diff --git a/build/fuchsia/config/clang/clang.gni b/build/fuchsia/config/clang/clang.gni
new file mode 100644
index 0000000..8617aa5
--- /dev/null
+++ b/build/fuchsia/config/clang/clang.gni
@@ -0,0 +1,7 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+declare_args() {
+  clang_base_path = "//buildtools/linux-x64/clang"
+}
diff --git a/build/fuchsia/dart.cmx b/build/fuchsia/dart.cmx
new file mode 100644
index 0000000..f8f5750
--- /dev/null
+++ b/build/fuchsia/dart.cmx
@@ -0,0 +1,28 @@
+{
+  "program": {
+    "binary": "exe.stripped/dart"
+  },
+  "sandbox": {
+    "features": [
+      "config-data",
+      "deprecated-ambient-replace-as-executable",
+      "root-ssl-certificates",
+      "isolated-cache-storage",
+      "isolated-persistent-storage",
+      "isolated-temp"
+    ],
+    "services": [
+      "fuchsia.deprecatedtimezone.Timezone",
+      "fuchsia.device.NameProvider",
+      "fuchsia.feedback.CrashReporter",
+      "fuchsia.intl.PropertyProvider",
+      "fuchsia.logger.LogSink",
+      "fuchsia.net.NameLookup",
+      "fuchsia.netstack.Netstack",
+      "fuchsia.posix.socket.Provider",
+      "fuchsia.sysmem.Allocator",
+      "fuchsia.timezone.Timezone",
+      "fuchsia.tracing.provider.Registry"
+    ]
+  }
+}
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index 2c1839f..c6f28d3 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -130,7 +130,7 @@
       temporary_tocname = dylib + ".tmp"
 
       does_reexport_command = "[ ! -e $dylib -o ! -e $tocname ] || otool -l $dylib | grep -q LC_REEXPORT_DYLIB"
-      link_command = "$ld -shared $sysroot_flags $toolchain_flags {{ldflags}} -o $dylib -Wl,-filelist,$rspfile {{solibs}} {{libs}}"
+      link_command = "$ld -shared $sysroot_flags $toolchain_flags {{ldflags}} -o $dylib -Wl,-filelist,$rspfile {{solibs}} {{libs}} {{frameworks}}"
       replace_command = "if ! cmp -s $temporary_tocname $tocname; then mv $temporary_tocname $tocname"
       extract_toc_command = "{ otool -l $dylib | grep LC_ID_DYLIB -A 5; nm -gP $dylib | cut -f1-2 -d' ' | grep -v U\$\$; true; }"
 
@@ -171,7 +171,7 @@
         stripped_outfile = "{{root_out_dir}}/exe.stripped/$exename"
       }
 
-      command = "$ld $sysroot_flags $toolchain_flags {{ldflags}} -Xlinker -rpath -Xlinker @executable_path/Frameworks -o $outfile -Wl,-filelist,$rspfile {{solibs}} {{libs}}"
+      command = "$ld $sysroot_flags $toolchain_flags {{ldflags}} -Xlinker -rpath -Xlinker @executable_path/Frameworks -o $outfile -Wl,-filelist,$rspfile {{solibs}} {{libs}} {{frameworks}}"
       if (defined(invoker.strip)) {
         strip = invoker.strip
         strip_command = "${strip} -x -o $stripped_outfile $outfile"
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index 6893a79..82c40dc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -576,9 +576,6 @@
 
   /// Retrieves the type that the [variable] is promoted to, if the [variable]
   /// is currently promoted.  Otherwise returns `null`.
-  ///
-  /// For testing only.  Please use [variableRead] instead.
-  @visibleForTesting
   Type promotedType(Variable variable);
 
   /// Call this method just before visiting one of the cases in the body of a
@@ -1512,24 +1509,32 @@
     }
 
     List<Type> newPromotedTypes = info.promotedTypes;
+    bool newReachable = reachable;
     if (promotedType != null) {
       newPromotedTypes =
           VariableModel._addToPromotedTypes(info.promotedTypes, promotedType);
+      if (typeOperations.isNever(promotedType)) {
+        newReachable = false;
+      }
     }
 
     return identical(newTested, info.tested) &&
-            identical(newPromotedTypes, info.promotedTypes)
+            identical(newPromotedTypes, info.promotedTypes) &&
+            newReachable == reachable
         ? this
         : _updateVariableInfo(
             variable,
             new VariableModel<Variable, Type>(newPromotedTypes, newTested,
-                info.assigned, info.unassigned, info.writeCaptured));
+                info.assigned, info.unassigned, info.writeCaptured),
+            reachable: newReachable);
   }
 
   /// Returns a new [FlowModel] where the information for [variable] is replaced
   /// with [model].
   FlowModel<Variable, Type> _updateVariableInfo(
-      Variable variable, VariableModel<Variable, Type> model) {
+      Variable variable, VariableModel<Variable, Type> model,
+      {bool reachable}) {
+    reachable ??= this.reachable;
     Map<Variable, VariableModel<Variable, Type>> newVariableInfo =
         new Map<Variable, VariableModel<Variable, Type>>.from(variableInfo);
     newVariableInfo[variable] = model;
@@ -1667,6 +1672,14 @@
   /// initializer).
   bool isLocalVariableWithoutDeclaredType(Variable variable);
 
+  /// Determines whether the given [type] is equivalent to the `Never` type.
+  ///
+  /// A type is equivalent to `Never` if it:
+  /// (a) is the `Never` type itself.
+  /// (b) is a type variable that extends `Never`, OR
+  /// (c) is a type variable that has been promoted to `Never`
+  bool isNever(Type type);
+
   /// Returns `true` if [type1] and [type2] are the same type.
   bool isSameType(Type type1, Type type2);
 
@@ -1804,7 +1817,10 @@
     bool newUnassigned = unassigned && otherModel.unassigned;
     bool newWriteCaptured = writeCaptured || otherModel.writeCaptured;
     List<Type> newPromotedTypes;
-    if (unsafe) {
+    if (newWriteCaptured) {
+      // Write-captured variables can't be promoted
+      newPromotedTypes = null;
+    } else if (unsafe) {
       // There was an assignment to the variable in the "this" path, so none of
       // the promotions from the "other" path can be used.
       newPromotedTypes = thisPromotedTypes;
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 309004e..7ee3d3f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -46,6 +46,53 @@
         r"""Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAbstractExtensionField = messageAbstractExtensionField;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAbstractExtensionField = const MessageCode(
+    "AbstractExtensionField",
+    message: r"""Extension fields can't be declared 'abstract'.""",
+    tip: r"""Try removing the 'abstract' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAbstractExternalField = messageAbstractExternalField;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAbstractExternalField = const MessageCode(
+    "AbstractExternalField",
+    message: r"""Fields can't be declared both 'abstract' and 'external'.""",
+    tip: r"""Try removing the 'abstract' or 'external' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAbstractFieldConstructorInitializer =
+    messageAbstractFieldConstructorInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAbstractFieldConstructorInitializer = const MessageCode(
+    "AbstractFieldConstructorInitializer",
+    message: r"""Abstract fields cannot have initializers.""",
+    tip:
+        r"""Try removing the field initializer or the 'abstract' keyword from the field declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAbstractFieldInitializer = messageAbstractFieldInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAbstractFieldInitializer = const MessageCode(
+    "AbstractFieldInitializer",
+    message: r"""Abstract fields cannot have initializers.""",
+    tip: r"""Try removing the initializer or the 'abstract' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAbstractLateField = messageAbstractLateField;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAbstractLateField = const MessageCode(
+    "AbstractLateField",
+    message: r"""Abstract fields cannot be late.""",
+    tip: r"""Try removing the 'abstract' or 'late' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAbstractNotSync = messageAbstractNotSync;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -82,6 +129,15 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeAbstractStaticField = messageAbstractStaticField;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageAbstractStaticField = const MessageCode(
+    "AbstractStaticField",
+    message: r"""Static fields can't be declared 'abstract'.""",
+    tip: r"""Try removing the 'abstract' or 'static' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateAccessError =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Access error: '#name'.""",
@@ -1253,6 +1309,14 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalNonNull = messageConstEvalNonNull;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalNonNull = const MessageCode(
+    "ConstEvalNonNull",
+    message: r"""Constant expression must be non-null.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstEvalNotListOrSetInSpread =
     messageConstEvalNotListOrSetInSpread;
 
@@ -2244,95 +2308,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedLibraryExport =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""A library with name '#name' is exported more than once.""",
-        withArguments: _withArgumentsDuplicatedLibraryExport);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryExport =
-    const Code<Message Function(String name)>(
-        "DuplicatedLibraryExport", templateDuplicatedLibraryExport,
-        analyzerCodes: <String>["EXPORT_DUPLICATED_LIBRARY_NAMED"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryExport(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryExport,
-      message: """A library with name '${name}' is exported more than once.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateDuplicatedLibraryExportContext =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is also exported here.""",
-        withArguments: _withArgumentsDuplicatedLibraryExportContext);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryExportContext =
-    const Code<Message Function(String name)>("DuplicatedLibraryExportContext",
-        templateDuplicatedLibraryExportContext,
-        severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryExportContext(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryExportContext,
-      message: """'${name}' is also exported here.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedLibraryImport =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""A library with name '#name' is imported more than once.""",
-        withArguments: _withArgumentsDuplicatedLibraryImport);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryImport =
-    const Code<Message Function(String name)>(
-        "DuplicatedLibraryImport", templateDuplicatedLibraryImport,
-        analyzerCodes: <String>["IMPORT_DUPLICATED_LIBRARY_NAMED"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryImport(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryImport,
-      message: """A library with name '${name}' is imported more than once.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateDuplicatedLibraryImportContext =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is also imported here.""",
-        withArguments: _withArgumentsDuplicatedLibraryImportContext);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryImportContext =
-    const Code<Message Function(String name)>("DuplicatedLibraryImportContext",
-        templateDuplicatedLibraryImportContext,
-        severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryImportContext(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDuplicatedLibraryImportContext,
-      message: """'${name}' is also imported here.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""The modifier '#lexeme' was already specified.""",
@@ -3271,6 +3246,35 @@
         r"""Try removing the keyword 'external', or replacing the field by an external getter and/or setter.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExternalFieldConstructorInitializer =
+    messageExternalFieldConstructorInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExternalFieldConstructorInitializer = const MessageCode(
+    "ExternalFieldConstructorInitializer",
+    message: r"""External fields cannot have initializers.""",
+    tip:
+        r"""Try removing the field initializer or the 'external' keyword from the field declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExternalFieldInitializer = messageExternalFieldInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExternalFieldInitializer = const MessageCode(
+    "ExternalFieldInitializer",
+    message: r"""External fields cannot have initializers.""",
+    tip: r"""Try removing the initializer or the 'external' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExternalLateField = messageExternalLateField;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExternalLateField = const MessageCode(
+    "ExternalLateField",
+    message: r"""External fields cannot be late.""",
+    tip: r"""Try removing the 'external' or 'late' keyword.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalMethodWithBody = messageExternalMethodWithBody;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5406,6 +5410,38 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropAnonymousFactoryPositionalParameters =
+    messageJsInteropAnonymousFactoryPositionalParameters;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropAnonymousFactoryPositionalParameters =
+    const MessageCode("JsInteropAnonymousFactoryPositionalParameters",
+        message:
+            r"""Factory constructors for @anonymous JS interop classes should not contain any positional parameters.""",
+        tip: r"""Try replacing them with named parameters instead.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropEnclosingClassJSAnnotation =
+    messageJsInteropEnclosingClassJSAnnotation;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropEnclosingClassJSAnnotation = const MessageCode(
+    "JsInteropEnclosingClassJSAnnotation",
+    message:
+        r"""Member has a JS interop annotation but the enclosing class does not.""",
+    tip: r"""Try adding the annotation to the enclosing class.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropEnclosingClassJSAnnotationContext =
+    messageJsInteropEnclosingClassJSAnnotationContext;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropEnclosingClassJSAnnotationContext =
+    const MessageCode("JsInteropEnclosingClassJSAnnotationContext",
+        severity: Severity.context,
+        message: r"""This is the enclosing class.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropIndexNotSupported =
     messageJsInteropIndexNotSupported;
 
@@ -5417,6 +5453,16 @@
     tip: r"""Try replacing with a normal method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeJsInteropNamedParameters = messageJsInteropNamedParameters;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageJsInteropNamedParameters = const MessageCode(
+    "JsInteropNamedParameters",
+    message:
+        r"""Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.""",
+    tip: r"""Try replacing them with normal or optional parameters.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropNonExternalConstructor =
     messageJsInteropNonExternalConstructor;
 
@@ -6277,14 +6323,6 @@
     message: r"""Can only use type variables in instance methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeNonNullAwareSpreadIsNull = messageNonNullAwareSpreadIsNull;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageNonNullAwareSpreadIsNull = const MessageCode(
-    "NonNullAwareSpreadIsNull",
-    message: r"""Can't spread a value with static type Null.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateNonNullableLateDefinitelyAssignedError =
     const Template<Message Function(String name)>(
@@ -7873,6 +7911,46 @@
         r"""A library can't opt out of null safety by default, when using sound null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        List<String>
+            _names)> templateStrongModeNNBDPackageOptOut = const Template<
+        Message Function(List<String> _names)>(
+    messageTemplate:
+        r"""Cannot run with sound null safety as one or more dependencies do not
+support null safety:
+
+#names
+
+Run 'pub outdated --mode=null-safety' to determine if versions of your
+dependencies supporting null safety are available.""",
+    withArguments: _withArgumentsStrongModeNNBDPackageOptOut);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(List<String> _names)>
+    codeStrongModeNNBDPackageOptOut =
+    const Code<Message Function(List<String> _names)>(
+  "StrongModeNNBDPackageOptOut",
+  templateStrongModeNNBDPackageOptOut,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsStrongModeNNBDPackageOptOut(List<String> _names) {
+  if (_names.isEmpty) throw 'No names provided';
+  String names = itemizeNames(_names);
+  return new Message(codeStrongModeNNBDPackageOptOut,
+      message:
+          """Cannot run with sound null safety as one or more dependencies do not
+support null safety:
+
+${names}
+
+Run 'pub outdated --mode=null-safety' to determine if versions of your
+dependencies supporting null safety are available.""",
+      arguments: {'names': _names});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSuperAsExpression = messageSuperAsExpression;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
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 c738205..2a728d5 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -535,6 +535,7 @@
 
   @override
   void endClassFields(
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -543,8 +544,16 @@
       int count,
       Token beginToken,
       Token endToken) {
-    listener?.endClassFields(externalToken, staticToken, covariantToken,
-        lateToken, varFinalOrConst, count, beginToken, endToken);
+    listener?.endClassFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
   }
 
   @override
@@ -648,6 +657,7 @@
 
   @override
   void endExtensionFields(
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -656,8 +666,16 @@
       int count,
       Token beginToken,
       Token endToken) {
-    listener?.endExtensionFields(externalToken, staticToken, covariantToken,
-        lateToken, varFinalOrConst, count, beginToken, endToken);
+    listener?.endExtensionFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
   }
 
   @override
@@ -875,6 +893,7 @@
 
   @override
   void endMixinFields(
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -883,8 +902,16 @@
       int count,
       Token beginToken,
       Token endToken) {
-    listener?.endMixinFields(externalToken, staticToken, covariantToken,
-        lateToken, varFinalOrConst, count, beginToken, endToken);
+    listener?.endMixinFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 479289a..53906bc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -367,6 +367,7 @@
   ///
   /// Doesn't have a corresponding begin event, use [beginMember] instead.
   void endClassFields(
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -386,6 +387,7 @@
   ///
   /// Doesn't have a corresponding begin event, use [beginMember] instead.
   void endMixinFields(
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -395,8 +397,8 @@
       Token beginToken,
       Token endToken) {
     // TODO(danrubel): push implementation into subclasses
-    endClassFields(externalToken, staticToken, covariantToken, lateToken,
-        varFinalOrConst, count, beginToken, endToken);
+    endClassFields(abstractToken, externalToken, staticToken, covariantToken,
+        lateToken, varFinalOrConst, count, beginToken, endToken);
   }
 
   /// Handle the end of a extension field declaration.  Substructures:
@@ -407,6 +409,7 @@
   ///
   /// Doesn't have a corresponding begin event, use [beginMember] instead.
   void endExtensionFields(
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -416,8 +419,8 @@
       Token beginToken,
       Token endToken) {
     // TODO(danrubel): push implementation into subclasses
-    endClassFields(externalToken, staticToken, covariantToken, lateToken,
-        varFinalOrConst, count, beginToken, endToken);
+    endClassFields(abstractToken, externalToken, staticToken, covariantToken,
+        lateToken, varFinalOrConst, count, beginToken, endToken);
   }
 
   /// Marks that the grammar term `forInitializerStatement` has been parsed and
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart b/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
index 1ab8699..904871b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/modifier_context.dart
@@ -97,10 +97,6 @@
   /// Parse modifiers for class methods and fields.
   Token parseClassMemberModifiers(Token token) {
     token = parseModifiers(token);
-    if (abstractToken != null) {
-      parser.reportRecoverableError(
-          abstractToken, codes.messageAbstractClassMember);
-    }
     reportExtraneousModifier(requiredToken);
     return token;
   }
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 e994086..53e40dd 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -2464,6 +2464,7 @@
     }
     return parseFields(
         beforeStart,
+        /* abstractToken = */ null,
         externalToken,
         /* staticToken = */ null,
         /* covariantToken = */ null,
@@ -2479,6 +2480,7 @@
 
   Token parseFields(
       Token beforeStart,
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -2509,6 +2511,9 @@
         reportRecoverableError(varFinalOrConst, codes.messageTypeAfterVar);
       }
     }
+    if (abstractToken != null && externalToken != null) {
+      reportRecoverableError(abstractToken, codes.messageAbstractExternalField);
+    }
 
     Token token = typeInfo.parseType(beforeType, this);
     assert(token.next == name || token.next.isEof);
@@ -2532,12 +2537,12 @@
     }
 
     int fieldCount = 1;
-    token = parseFieldInitializerOpt(name, name, lateToken, externalToken,
-        varFinalOrConst, kind, enclosingDeclarationName);
+    token = parseFieldInitializerOpt(name, name, lateToken, abstractToken,
+        externalToken, varFinalOrConst, kind, enclosingDeclarationName);
     while (optional(',', token.next)) {
       name = ensureIdentifier(token.next, context);
-      token = parseFieldInitializerOpt(name, name, lateToken, externalToken,
-          varFinalOrConst, kind, enclosingDeclarationName);
+      token = parseFieldInitializerOpt(name, name, lateToken, abstractToken,
+          externalToken, varFinalOrConst, kind, enclosingDeclarationName);
       ++fieldCount;
     }
     Token semicolon = token.next;
@@ -2563,24 +2568,53 @@
     }
     switch (kind) {
       case DeclarationKind.TopLevel:
+        assert(abstractToken == null);
         listener.endTopLevelFields(externalToken, staticToken, covariantToken,
             lateToken, varFinalOrConst, fieldCount, beforeStart.next, token);
         break;
       case DeclarationKind.Class:
-        listener.endClassFields(externalToken, staticToken, covariantToken,
-            lateToken, varFinalOrConst, fieldCount, beforeStart.next, token);
+        listener.endClassFields(
+            abstractToken,
+            externalToken,
+            staticToken,
+            covariantToken,
+            lateToken,
+            varFinalOrConst,
+            fieldCount,
+            beforeStart.next,
+            token);
         break;
       case DeclarationKind.Mixin:
-        listener.endMixinFields(externalToken, staticToken, covariantToken,
-            lateToken, varFinalOrConst, fieldCount, beforeStart.next, token);
+        listener.endMixinFields(
+            abstractToken,
+            externalToken,
+            staticToken,
+            covariantToken,
+            lateToken,
+            varFinalOrConst,
+            fieldCount,
+            beforeStart.next,
+            token);
         break;
       case DeclarationKind.Extension:
+        if (abstractToken != null) {
+          reportRecoverableError(
+              firstName, codes.messageAbstractExtensionField);
+        }
         if (staticToken == null && externalToken == null) {
           reportRecoverableError(
               firstName, codes.messageExtensionDeclaresInstanceField);
         }
-        listener.endExtensionFields(externalToken, staticToken, covariantToken,
-            lateToken, varFinalOrConst, fieldCount, beforeStart.next, token);
+        listener.endExtensionFields(
+            abstractToken,
+            externalToken,
+            staticToken,
+            covariantToken,
+            lateToken,
+            varFinalOrConst,
+            fieldCount,
+            beforeStart.next,
+            token);
         break;
     }
     return token;
@@ -2655,6 +2689,7 @@
       Token token,
       Token name,
       Token lateToken,
+      Token abstractToken,
       Token externalToken,
       Token varFinalOrConst,
       DeclarationKind kind,
@@ -2678,6 +2713,7 @@
         } else if (kind == DeclarationKind.TopLevel &&
             optional("final", varFinalOrConst) &&
             lateToken == null &&
+            abstractToken == null &&
             externalToken == null) {
           reportRecoverableError(
               name,
@@ -2697,7 +2733,7 @@
       token = parseExpression(assignment);
       listener.endVariableInitializer(assignment);
     } else {
-      listener.handleNoVariableInitializer(token.next);
+      listener.handleNoVariableInitializer(token);
     }
     return token;
   }
@@ -3193,6 +3229,7 @@
     Token beforeStart = token = parseMetadataStar(token);
 
     Token covariantToken;
+    Token abstractToken;
     Token externalToken;
     Token lateToken;
     Token staticToken;
@@ -3203,6 +3240,9 @@
       if (optional('external', next)) {
         externalToken = token = next;
         next = token.next;
+      } else if (optional('abstract', next)) {
+        abstractToken = token = next;
+        next = token.next;
       }
       if (isModifier(next)) {
         if (optional('static', next)) {
@@ -3236,7 +3276,8 @@
               ..externalToken = externalToken
               ..lateToken = lateToken
               ..staticToken = staticToken
-              ..varFinalOrConst = varFinalOrConst;
+              ..varFinalOrConst = varFinalOrConst
+              ..abstractToken = abstractToken;
 
             token = context.parseClassMemberModifiers(token);
             next = token.next;
@@ -3246,6 +3287,7 @@
             lateToken = context.lateToken;
             staticToken = context.staticToken;
             varFinalOrConst = context.varFinalOrConst;
+            abstractToken = context.abstractToken;
 
             context = null;
           }
@@ -3285,6 +3327,10 @@
           if (beforeType != token) {
             reportRecoverableError(token, codes.messageTypeBeforeFactory);
           }
+          if (abstractToken != null) {
+            reportRecoverableError(
+                abstractToken, codes.messageAbstractClassMember);
+          }
           token = parseFactoryMethod(token, kind, beforeStart, externalToken,
               staticToken ?? covariantToken, varFinalOrConst);
           listener.endMember();
@@ -3299,6 +3345,7 @@
         if (next2.isUserDefinableOperator && typeParam == noTypeParamOrArg) {
           token = parseMethod(
               beforeStart,
+              abstractToken,
               externalToken,
               staticToken,
               covariantToken,
@@ -3321,6 +3368,7 @@
           // Recovery: Invalid operator
           return parseInvalidOperatorDeclaration(
               beforeStart,
+              abstractToken,
               externalToken,
               staticToken,
               covariantToken,
@@ -3333,6 +3381,7 @@
           // Recovery
           token = parseMethod(
               beforeStart,
+              abstractToken,
               externalToken,
               staticToken,
               covariantToken,
@@ -3353,10 +3402,15 @@
           (identical(value, 'typedef') &&
               token == beforeStart &&
               next.next.isIdentifier)) {
+        if (abstractToken != null) {
+          reportRecoverableError(
+              abstractToken, codes.messageAbstractClassMember);
+        }
         // Recovery
         return recoverFromInvalidMember(
             token,
             beforeStart,
+            abstractToken,
             externalToken,
             staticToken,
             covariantToken,
@@ -3378,6 +3432,7 @@
           // Recovery: Missing `operator` keyword
           return parseInvalidOperatorDeclaration(
               beforeStart,
+              abstractToken,
               externalToken,
               staticToken,
               covariantToken,
@@ -3411,6 +3466,7 @@
         identical(value, '=>')) {
       token = parseMethod(
           beforeStart,
+          abstractToken,
           externalToken,
           staticToken,
           covariantToken,
@@ -3430,6 +3486,7 @@
       }
       token = parseFields(
           beforeStart,
+          abstractToken,
           externalToken,
           staticToken,
           covariantToken,
@@ -3448,6 +3505,7 @@
 
   Token parseMethod(
       Token beforeStart,
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -3460,6 +3518,9 @@
       DeclarationKind kind,
       String enclosingDeclarationName,
       bool nameIsRecovered) {
+    if (abstractToken != null) {
+      reportRecoverableError(abstractToken, codes.messageAbstractClassMember);
+    }
     if (lateToken != null) {
       reportRecoverableErrorWithToken(
           lateToken, codes.templateExtraneousModifier);
@@ -5655,7 +5716,7 @@
     if (typeInfo.isNullable) {
       Token next = typeInfo.skipType(token).next;
       if (!isOneOfOrEof(
-          next, const [')', '?', '??', ',', ';', ':', 'is', 'as'])) {
+          next, const [')', '?', '??', ',', ';', ':', 'is', 'as', '..'])) {
         // TODO(danrubel): investigate other situations
         // where `?` should be considered part of the type info
         // rather than the start of a conditional expression.
@@ -6898,6 +6959,7 @@
   /// (and events have already been generated).
   Token parseInvalidOperatorDeclaration(
       Token beforeStart,
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -6945,6 +7007,7 @@
 
     Token token = parseMethod(
         beforeStart,
+        abstractToken,
         externalToken,
         staticToken,
         covariantToken,
@@ -6967,6 +7030,7 @@
   Token recoverFromInvalidMember(
       Token token,
       Token beforeStart,
+      Token abstractToken,
       Token externalToken,
       Token staticToken,
       Token covariantToken,
@@ -6989,6 +7053,7 @@
     } else if (next.isOperator && next.endGroup == null) {
       return parseInvalidOperatorDeclaration(
           beforeStart,
+          abstractToken,
           externalToken,
           staticToken,
           covariantToken,
@@ -7005,6 +7070,7 @@
         identical(value, '{')) {
       token = parseMethod(
           beforeStart,
+          abstractToken,
           externalToken,
           staticToken,
           covariantToken,
@@ -7028,6 +7094,7 @@
     } else {
       token = parseFields(
           beforeStart,
+          abstractToken,
           externalToken,
           staticToken,
           covariantToken,
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
index ec8e355..d05ecbc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
@@ -486,10 +486,10 @@
 
     final List<Token> typeVariableEndGroups = <Token>[];
     for (Link<Token> t = typeVariableStarters; t.isNotEmpty; t = t.tail) {
+      parser.listener.beginFunctionType(start);
       typeVariableEndGroups.add(
           computeTypeParamOrArg(t.head, /* inDeclaration = */ true)
               .parseVariables(t.head, parser));
-      parser.listener.beginFunctionType(start);
     }
 
     if (gftHasReturnType == false) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
index 79879cc..04ae6f3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
@@ -643,6 +643,20 @@
     Map<String, List<String>> skipMap,
     Uri nullUri});
 
+/// Compute the file: URI of the file located at `path`, where `path` is
+/// relative to the root of the SDK repository.
+///
+/// We find the root of the SDK repository by looking for the parent of the
+/// directory named `pkg`.
+Uri _fileUriFromSdkRoot(String path) {
+  Uri uri = Platform.script;
+  List<String> pathSegments = uri.pathSegments;
+  return uri.replace(pathSegments: [
+    ...pathSegments.sublist(0, pathSegments.lastIndexOf('pkg')),
+    ...path.split('/')
+  ]);
+}
+
 class MarkerOptions {
   final Map<String, Uri> markers;
 
@@ -669,7 +683,7 @@
       }
       String marker = line.substring(0, eqPos);
       String tester = line.substring(eqPos + 1);
-      File testerFile = new File(tester);
+      File testerFile = new File.fromUri(_fileUriFromSdkRoot(tester));
       if (!testerFile.existsSync()) {
         throw new ArgumentError(
             "Tester '$tester' does not exist for marker '$marker' in "
@@ -712,6 +726,14 @@
   }
 }
 
+String getTestName(FileSystemEntity entity) {
+  if (entity is Directory) {
+    return entity.uri.pathSegments[entity.uri.pathSegments.length - 2];
+  } else {
+    return entity.uri.pathSegments.last;
+  }
+}
+
 /// Check code for all tests in [dataDir] using [runTest].
 Future<void> runTests<T>(Directory dataDir,
     {List<String> args: const <String>[],
@@ -752,16 +774,14 @@
           !entity.path.endsWith('~') && !entity.path.endsWith('marker.options'))
       .toList();
   if (shards > 1) {
+    entities.sort((a, b) => getTestName(a).compareTo(getTestName(b)));
     int start = entities.length * shardIndex ~/ shards;
     int end = entities.length * (shardIndex + 1) ~/ shards;
     entities = entities.sublist(start, end);
   }
   int testCount = 0;
   for (FileSystemEntity entity in entities) {
-    String name = entity.uri.pathSegments.last;
-    if (entity is Directory) {
-      name = entity.uri.pathSegments[entity.uri.pathSegments.length - 2];
-    }
+    String name = getTestName(entity);
     if (args.isNotEmpty && !args.contains(name) && !continued) continue;
     if (shouldContinue) continued = true;
     testCount++;
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index ac83ab7..f7c4d16 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 5.0.0
+version: 6.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/function.dart b/pkg/_fe_analyzer_shared/test/constants/data/function.dart
index 7cc9119..296f250 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/function.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/function.dart
@@ -16,16 +16,16 @@
 main() {
   print(
       /*cfe|dart2js.Function(method1)*/
-      /*analyzer.Function(method1,type=T Function<T>(T))*/
+      /*analyzer.Function(method1,type=T* Function<T>(T*)*)*/
       function0);
   print(
       /*cfe.Instantiation(method1<int>)*/
       /*dart2js.Instantiation(method1<int*>)*/
-      /*analyzer.Function(method1,type=int Function(int))*/
+      /*analyzer.Function(method1,type=int* Function(int*)*)*/
       instantiation0);
   print(
       /*cfe.Instantiation(method2<String,int>)*/
       /*dart2js.Instantiation(method2<String*,int*>)*/
-      /*analyzer.Function(method2,type=Map<String, int> Function(String, int))*/
+      /*analyzer.Function(method2,type=Map<String*, int*>* Function(String*, int*)*)*/
       instantiation1);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/list.dart b/pkg/_fe_analyzer_shared/test/constants/data/list.dart
index 50f3caa..b31cfb5 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/list.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/list.dart
@@ -15,13 +15,13 @@
 const list4 = /*cfe.List<int>(Int(42),Int(87))*/ [42, 87];
 
 main() {
-  print(/*List<dynamic>()*/ list0);
+  print(/*analyzer.List<dynamic>*()*/ /*cfe|dart2js.List<dynamic>()*/ list0);
   print(
-      /*cfe|analyzer.List<int>()*/ /*dart2js.List<int*>()*/ list1);
+      /*analyzer.List<int*>*()*/ /*cfe.List<int>()*/ /*dart2js.List<int*>()*/ list1);
   print(
-      /*cfe|analyzer.List<int>()*/ /*dart2js.List<int*>()*/ list2);
+      /*analyzer.List<int*>*()*/ /*cfe.List<int>()*/ /*dart2js.List<int*>()*/ list2);
   print(
-      /*cfe|analyzer.List<int>(Int(42))*/ /*dart2js.List<int*>(Int(42))*/ list3);
+      /*analyzer.List<int*>*(Int(42))*/ /*cfe.List<int>(Int(42))*/ /*dart2js.List<int*>(Int(42))*/ list3);
   print(
-      /*cfe|analyzer.List<int>(Int(42),Int(87))*/ /*dart2js.List<int*>(Int(42),Int(87))*/ list4);
+      /*analyzer.List<int*>*(Int(42),Int(87))*/ /*cfe.List<int>(Int(42),Int(87))*/ /*dart2js.List<int*>(Int(42),Int(87))*/ list4);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/map.dart b/pkg/_fe_analyzer_shared/test/constants/data/map.dart
index 1f96470..c9aafc63 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/map.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/map.dart
@@ -16,13 +16,14 @@
     {'foo': 42, 'bar': 87};
 
 main() {
-  print(/*Map<dynamic,dynamic>()*/ map0);
   print(
-      /*cfe|analyzer.Map<String,int>()*/ /*dart2js.Map<String*,int*>()*/ map1);
+      /*analyzer.Map<dynamic, dynamic>*()*/ /*cfe|dart2js.Map<dynamic,dynamic>()*/ map0);
   print(
-      /*cfe|analyzer.Map<String,int>()*/ /*dart2js.Map<String*,int*>()*/ map2);
+      /*analyzer.Map<String*, int*>*()*/ /*cfe.Map<String,int>()*/ /*dart2js.Map<String*,int*>()*/ map1);
   print(
-      /*cfe|analyzer.Map<String,int>(String(foo):Int(42))*/ /*dart2js.Map<String*,int*>(String(foo):Int(42))*/ map3);
+      /*analyzer.Map<String*, int*>*()*/ /*cfe.Map<String,int>()*/ /*dart2js.Map<String*,int*>()*/ map2);
   print(
-      /*cfe|analyzer.Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/ /*dart2js.Map<String*,int*>(String(foo):Int(42),String(bar):Int(87))*/ map4);
+      /*analyzer.Map<String*, int*>*(String(foo):Int(42))*/ /*cfe.Map<String,int>(String(foo):Int(42))*/ /*dart2js.Map<String*,int*>(String(foo):Int(42))*/ map3);
+  print(
+      /*analyzer.Map<String*, int*>*(String(foo):Int(42),String(bar):Int(87))*/ /*cfe.Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/ /*dart2js.Map<String*,int*>(String(foo):Int(42),String(bar):Int(87))*/ map4);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/set.dart b/pkg/_fe_analyzer_shared/test/constants/data/set.dart
index e512e8a..5b4a84d 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/set.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/set.dart
@@ -20,13 +20,13 @@
 const set4 = /*cfe.Set<int>(Int(42),Int(87))*/ {42, 87};
 
 main() {
-  print(/*Set<dynamic>()*/ set0);
+  print(/*analyzer.Set<dynamic>*()*/ /*cfe|dart2js.Set<dynamic>()*/ set0);
   print(
-      /*cfe|analyzer.Set<int>()*/ /*dart2js.Set<int*>()*/ set1);
+      /*analyzer.Set<int*>*()*/ /*cfe.Set<int>()*/ /*dart2js.Set<int*>()*/ set1);
   print(
-      /*cfe|analyzer.Set<int>()*/ /*dart2js.Set<int*>()*/ set2);
+      /*analyzer.Set<int*>*()*/ /*cfe.Set<int>()*/ /*dart2js.Set<int*>()*/ set2);
   print(
-      /*cfe|analyzer.Set<int>(Int(42))*/ /*dart2js.Set<int*>(Int(42))*/ set3);
+      /*analyzer.Set<int*>*(Int(42))*/ /*cfe.Set<int>(Int(42))*/ /*dart2js.Set<int*>(Int(42))*/ set3);
   print(
-      /*cfe|analyzer.Set<int>(Int(42),Int(87))*/ /*dart2js.Set<int*>(Int(42),Int(87))*/ set4);
+      /*analyzer.Set<int*>*(Int(42),Int(87))*/ /*cfe.Set<int>(Int(42),Int(87))*/ /*dart2js.Set<int*>(Int(42),Int(87))*/ set4);
 }
diff --git a/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart b/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
index f729673..7d003ae 100644
--- a/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
+++ b/pkg/_fe_analyzer_shared/test/constants/data/type_literals.dart
@@ -21,31 +21,37 @@
 
 main() {
   print(
-      /*cfe|analyzer.TypeLiteral(dynamic Function())*/
+      /*analyzer.TypeLiteral(dynamic Function()*)*/
+      /*cfe.TypeLiteral(dynamic Function())*/
       /*dart2js.TypeLiteral(()->dynamic)*/
       typedef);
 
   print(
-      /*cfe|analyzer.TypeLiteral(void Function(dynamic))*/
+      /*analyzer.TypeLiteral(void Function(dynamic)*)*/
+      /*cfe.TypeLiteral(void Function(dynamic))*/
       /*dart2js.TypeLiteral((dynamic)->void)*/
       genericTypedef);
 
   print(
-      /*cfe|analyzer.TypeLiteral(void Function<T>(T))*/
+      /*analyzer.TypeLiteral(void Function<T>(T*)*)*/
+      /*cfe.TypeLiteral(void Function<T>(T))*/
       /*dart2js.TypeLiteral((0)->void)*/
       genericFunctionTypedef);
 
   print(
-      /*cfe|analyzer.TypeLiteral(void Function<T>(FutureOr<T>))*/
+      /*analyzer.TypeLiteral(void Function<T>(FutureOr<T*>*)*)*/
+      /*cfe.TypeLiteral(void Function<T>(FutureOr<T>))*/
       /*dart2js.TypeLiteral((FutureOr<0>)->void)*/
       typedefWithFutureOr);
 
   print(
-      /*cfe|analyzer.TypeLiteral(FutureOr<dynamic>)*/
+      /*analyzer.TypeLiteral(FutureOr<dynamic>*)*/
+      /*cfe.TypeLiteral(FutureOr<dynamic>)*/
       /*dart2js.TypeLiteral(dynamic)*/
       futureOr);
 
   print(
-      /*TypeLiteral(Null)*/
+      /*analyzer.TypeLiteral(Null*)*/
+      /*cfe|dart2js.TypeLiteral(Null)*/
       null_);
 }
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index 9a6e31b..a3c666f 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -1735,6 +1735,7 @@
     var intVar = _Var('x', _Type('int'));
     var intQVar = _Var('x', _Type('int?'));
     var objectQVar = _Var('x', _Type('Object?'));
+    var nullVar = _Var('x', _Type('Null'));
     group('setReachable', () {
       var unreachable = FlowModel<_Var, _Type>(false);
       var reachable = FlowModel<_Var, _Type>(true);
@@ -2368,6 +2369,15 @@
               _matchVariableModel(chain: ['int?', 'int'], ofInterest: ['int?'])
         });
       });
+
+      test('promote to Never', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true);
+        var s2 = s1.tryMarkNonNullable(h, nullVar).ifTrue;
+        expect(s2.reachable, false);
+        expect(s2.infoFor(nullVar),
+            _matchVariableModel(chain: ['Never'], ofInterest: []));
+      });
     });
 
     group('joinUnassigned', () {
@@ -3160,6 +3170,7 @@
     'List <: Object': true,
     'Never <: int': true,
     'Never <: int?': true,
+    'Never <: Null': true,
     'Never? <: int': false,
     'Never? <: int?': true,
     'Never? <: num?': true,
@@ -3334,6 +3345,11 @@
     return variable.isLocalVariableWithoutDeclaredType;
   }
 
+  @override
+  bool isNever(_Type type) {
+    return type.type == 'Never';
+  }
+
   /// Creates a [LazyExpression] representing an `is!` check, checking whether
   /// [subExpression] has the given [type].
   LazyExpression isNotType(LazyExpression subExpression, String type) {
@@ -3428,6 +3444,8 @@
   _Type promoteToNonNull(_Type type) {
     if (type.type.endsWith('?')) {
       return _Type(type.type.substring(0, type.type.length - 1));
+    } else if (type.type == 'Null') {
+      return _Type('Never');
     } else {
       return type;
     }
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/nullability/data/null_aware_access.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/nullability/data/null_aware_access.dart
index 586dcd2..cd4bc48 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/nullability/data/null_aware_access.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/nullability/data/null_aware_access.dart
@@ -35,68 +35,68 @@
 }
 
 void indexGetterCall(C? c) {
-  c?.[/*nonNullable*/ c];
+  c?[/*nonNullable*/ c];
 }
 
 void indexSetterCall(C? c) {
-  c?.[/*nonNullable*/ c] = /*nonNullable*/ c;
+  c?[/*nonNullable*/ c] = /*nonNullable*/ c;
 }
 
 void indexCompoundAssign(C? c) {
-  c?.[/*nonNullable*/ c] += /*nonNullable*/ c;
+  c?[/*nonNullable*/ c] += /*nonNullable*/ c;
 }
 
 void indexNullAwareAssign(C? c) {
-  c?.[/*nonNullable*/ c] ??= /*nonNullable*/ c;
+  c?[/*nonNullable*/ c] ??= /*nonNullable*/ c;
 }
 
 void setterCall_nullShorting(C? c, D? d) {
   c?.getterReturningC.setter = /*nonNullable*/ c;
   c?.getterReturningNullableC?.setter = /*nonNullable*/ c;
-  c?.[0].setter = /*nonNullable*/ c;
-  d?.[0]?.setter = /*nonNullable*/ d;
+  c?[0].setter = /*nonNullable*/ c;
+  d?[0]?.setter = /*nonNullable*/ d;
 }
 
 void compoundAssign_nullShorting(C? c, D? d) {
   c?.getterReturningC.getterSetter += /*nonNullable*/ c;
   c?.getterReturningNullableC?.getterSetter += /*nonNullable*/ c;
-  c?.[0].getterSetter += /*nonNullable*/ c;
-  d?.[0]?.getterSetter += /*nonNullable*/ d;
+  c?[0].getterSetter += /*nonNullable*/ c;
+  d?[0]?.getterSetter += /*nonNullable*/ d;
 }
 
 void nullAwareAssign_nullShorting(C? c, D? d) {
   c?.getterReturningC.getterSetter ??= /*nonNullable*/ c;
   c?.getterReturningNullableC?.getterSetter ??= /*nonNullable*/ c;
-  c?.[0].getterSetter ??= /*nonNullable*/ c;
-  d?.[0]?.getterSetter ??= /*nonNullable*/ d;
+  c?[0].getterSetter ??= /*nonNullable*/ c;
+  d?[0]?.getterSetter ??= /*nonNullable*/ d;
 }
 
 void indexGetterCall_nullShorting(C? c, D? d) {
   c?.getterReturningC[/*nonNullable*/ c];
-  c?.getterReturningNullableC?.[/*nonNullable*/ c];
-  c?.[0][/*nonNullable*/ c];
-  d?.[0]?.[/*nonNullable*/ d];
+  c?.getterReturningNullableC?[/*nonNullable*/ c];
+  c?[0][/*nonNullable*/ c];
+  d?[0]?[/*nonNullable*/ d];
 }
 
 void indexSetterCall_nullShorting(C? c, D? d) {
   c?.getterReturningC[/*nonNullable*/ c] = /*nonNullable*/ c;
-  c?.getterReturningNullableC?.[/*nonNullable*/ c] = /*nonNullable*/ c;
-  c?.[0][/*nonNullable*/ c] = /*nonNullable*/ c;
-  d?.[0]?.[/*nonNullable*/ d] = /*nonNullable*/ d;
+  c?.getterReturningNullableC?[/*nonNullable*/ c] = /*nonNullable*/ c;
+  c?[0][/*nonNullable*/ c] = /*nonNullable*/ c;
+  d?[0]?[/*nonNullable*/ d] = /*nonNullable*/ d;
 }
 
 void indexCompoundAssign_nullShorting(C? c, D? d) {
   c?.getterReturningC[/*nonNullable*/ c] += /*nonNullable*/ c;
-  c?.getterReturningNullableC?.[/*nonNullable*/ c] += /*nonNullable*/ c;
-  c?.[0][/*nonNullable*/ c] += /*nonNullable*/ c;
-  d?.[0]?.[/*nonNullable*/ d] += /*nonNullable*/ d;
+  c?.getterReturningNullableC?[/*nonNullable*/ c] += /*nonNullable*/ c;
+  c?[0][/*nonNullable*/ c] += /*nonNullable*/ c;
+  d?[0]?[/*nonNullable*/ d] += /*nonNullable*/ d;
 }
 
 void indexNullAwareAssign_nullShorting(C? c, D? d) {
   c?.getterReturningC[/*nonNullable*/ c] ??= /*nonNullable*/ c;
-  c?.getterReturningNullableC?.[/*nonNullable*/ c] ??= /*nonNullable*/ c;
-  c?.[0][/*nonNullable*/ c] ??= /*nonNullable*/ c;
-  d?.[0]?.[/*nonNullable*/ d] ??= /*nonNullable*/ d;
+  c?.getterReturningNullableC?[/*nonNullable*/ c] ??= /*nonNullable*/ c;
+  c?[0][/*nonNullable*/ c] ??= /*nonNullable*/ c;
+  d?[0]?[/*nonNullable*/ d] ??= /*nonNullable*/ d;
 }
 
 void null_aware_cascades_do_not_promote_target(C? c) {
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/issue41981.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/issue41981.dart
new file mode 100644
index 0000000..f7ce9d2
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/issue41981.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, 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.
+
+void testNotNull(Null n) {
+  0;
+  if (n != null)
+    /*stmt: unreachable*/ 1;
+  2;
+}
+
+void testIsNullableNever(Object? n) {
+  0;
+  if (n is Never?) 1;
+  2;
+}
+
+void testIsNever(Object? n) {
+  0;
+  if (n is Never)
+    /*stmt: unreachable*/ 1;
+  2;
+}
+
+void testIsNullableNeverTypeVariable<T extends Never?>(Object? n) {
+  0;
+  if (n is T) 1;
+  2;
+}
+
+void testIsNeverTypeVariable<T extends Never>(Object? n) {
+  0;
+  if (n is T)
+    /*stmt: unreachable*/ 1;
+  2;
+}
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/bug42066.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/bug42066.dart
new file mode 100644
index 0000000..25956d5
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/bug42066.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.
+
+f() {
+  num par2;
+  par2 = 0;
+  if (par2 is! int) return;
+  try {} catch (exception) {
+    throw 'x';
+    () {
+      par2 = 1;
+    };
+  } finally {}
+}
diff --git a/pkg/_js_interop_checks/LICENSE b/pkg/_js_interop_checks/LICENSE
new file mode 100644
index 0000000..18daf2b
--- /dev/null
+++ b/pkg/_js_interop_checks/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2020, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index ef93efe..2355b50 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -8,7 +8,11 @@
     show
         Message,
         LocatedMessage,
+        messageJsInteropAnonymousFactoryPositionalParameters,
+        messageJsInteropEnclosingClassJSAnnotation,
+        messageJsInteropEnclosingClassJSAnnotationContext,
         messageJsInteropIndexNotSupported,
+        messageJsInteropNamedParameters,
         messageJsInteropNonExternalConstructor;
 
 import 'src/js_interop.dart';
@@ -19,25 +23,52 @@
   JsInteropChecks(this._diagnosticsReporter);
 
   @override
-  void visitClass(Class c) {
-    if (!hasJSInteropAnnotation(c)) return;
-    super.visitClass(c);
+  void defaultMember(Member member) {
+    _checkMemberJSInteropAnnotation(member);
+    super.defaultMember(member);
   }
 
   @override
   void visitProcedure(Procedure procedure) {
-    if (procedure.isStatic) return;
-    if (procedure.name.name == '[]=' || procedure.name.name == '[]') {
+    _checkMemberJSInteropAnnotation(procedure);
+
+    if (!procedure.isExternal || !isJSInteropMember(procedure)) return;
+
+    if (!procedure.isStatic &&
+        (procedure.name.name == '[]=' || procedure.name.name == '[]')) {
       _diagnosticsReporter.report(
           messageJsInteropIndexNotSupported,
           procedure.fileOffset,
           procedure.name.name.length,
           procedure.location.file);
     }
+
+    var isAnonymousFactory =
+        isAnonymousClassMember(procedure) && procedure.isFactory;
+
+    if (isAnonymousFactory) {
+      if (procedure.function != null &&
+          !procedure.function.positionalParameters.isEmpty) {
+        var firstPositionalParam = procedure.function.positionalParameters[0];
+        _diagnosticsReporter.report(
+            messageJsInteropAnonymousFactoryPositionalParameters,
+            firstPositionalParam.fileOffset,
+            firstPositionalParam.name.length,
+            firstPositionalParam.location.file);
+      }
+    } else {
+      // Only factory constructors for anonymous classes are allowed to have
+      // named parameters.
+      _checkNoNamedParameters(procedure.function);
+    }
   }
 
   @override
   void visitConstructor(Constructor constructor) {
+    _checkMemberJSInteropAnnotation(constructor);
+
+    if (!isJSInteropMember(constructor)) return;
+
     if (!constructor.isExternal && !constructor.isSynthetic) {
       _diagnosticsReporter.report(
           messageJsInteropNonExternalConstructor,
@@ -45,5 +76,36 @@
           constructor.name.name.length,
           constructor.location.file);
     }
+
+    _checkNoNamedParameters(constructor.function);
+  }
+
+  /// Reports an error if [functionNode] has named parameters.
+  void _checkNoNamedParameters(FunctionNode functionNode) {
+    if (functionNode != null && !functionNode.namedParameters.isEmpty) {
+      var firstNamedParam = functionNode.namedParameters[0];
+      _diagnosticsReporter.report(
+          messageJsInteropNamedParameters,
+          firstNamedParam.fileOffset,
+          firstNamedParam.name.length,
+          firstNamedParam.location.file);
+    }
+  }
+
+  /// Reports an error if [m] has a JS interop annotation and is part of a class
+  /// that does not.
+  void _checkMemberJSInteropAnnotation(Member m) {
+    if (!hasJSInteropAnnotation(m)) return;
+    var enclosingClass = m.enclosingClass;
+    if (enclosingClass != null && !hasJSInteropAnnotation(enclosingClass)) {
+      _diagnosticsReporter.report(messageJsInteropEnclosingClassJSAnnotation,
+          m.fileOffset, m.name.name.length, m.location.file,
+          context: <LocatedMessage>[
+            messageJsInteropEnclosingClassJSAnnotationContext.withLocation(
+                enclosingClass.location.file,
+                enclosingClass.fileOffset,
+                enclosingClass.name.length)
+          ]);
+    }
   }
 }
diff --git a/pkg/_js_interop_checks/lib/src/js_interop.dart b/pkg/_js_interop_checks/lib/src/js_interop.dart
index 24ceac4..f8ea46f 100644
--- a/pkg/_js_interop_checks/lib/src/js_interop.dart
+++ b/pkg/_js_interop_checks/lib/src/js_interop.dart
@@ -4,15 +4,34 @@
 
 import 'package:kernel/kernel.dart';
 
-/// Returns true iff the class has an `@JS(...)` annotation from `package:js`
-/// or from the internal `dart:_js_annotations`.
-bool hasJSInteropAnnotation(Class c) =>
-    c.annotations.any(_isPublicJSAnnotation);
+/// Returns true iff the node has an `@JS(...)` annotation from `package:js` or
+/// from the internal `dart:_js_annotations`.
+bool hasJSInteropAnnotation(Annotatable a) =>
+    a.annotations.any(_isPublicJSAnnotation);
+
+/// Returns true if [m] belongs to a JS interop context. Checks if either the
+/// member or the surrounding context has a JS interop annotation.
+bool isJSInteropMember(Member m) {
+  if (hasJSInteropAnnotation(m)) return true;
+  var enclosingClass = m.enclosingClass;
+  if (enclosingClass != null) return hasJSInteropAnnotation(enclosingClass);
+  var enclosingLibrary = m.enclosingLibrary;
+  if (enclosingLibrary != null) return hasJSInteropAnnotation(enclosingLibrary);
+  return false;
+}
+
+/// Returns true if [m] belongs to an anonymous class.
+bool isAnonymousClassMember(Member m) {
+  var enclosingClass = m.enclosingClass;
+  if (enclosingClass == null) return false;
+  return enclosingClass.annotations.any(_isAnonymousAnnotation);
+}
 
 final _packageJs = Uri.parse('package:js/js.dart');
 final _internalJs = Uri.parse('dart:_js_annotations');
 
-/// Returns [true] if [e] is the `JS` annotation from `package:js`.
+/// Returns true if [value] is the `JS` annotation from `package:js` or from
+/// `dart:_js_annotations`.
 bool _isPublicJSAnnotation(Expression value) {
   var c = _annotationClass(value);
   return c != null &&
@@ -21,6 +40,16 @@
           c.enclosingLibrary.importUri == _internalJs);
 }
 
+/// Returns true if [value] is the `anyonymous` annotation from `package:js` or
+/// from `dart:_js_annotations`.
+bool _isAnonymousAnnotation(Expression value) {
+  var c = _annotationClass(value);
+  return c != null &&
+      c.name == '_Anonymous' &&
+      (c.enclosingLibrary.importUri == _packageJs ||
+          c.enclosingLibrary.importUri == _internalJs);
+}
+
 /// Returns the class of the instance referred to by metadata annotation [node].
 ///
 /// For example:
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index 788ab0f..f43c4e6 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -224,8 +224,6 @@
         benchmarks.firstWhere((b) => b.id == benchmarkId, orElse: () {
       print("Benchmark '$benchmarkId' not found.");
       exit(1);
-      // Never reached.
-      return null;
     });
 
     var actualIterations = repeatCount;
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 3f5c00c..7e5dc01 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -2083,6 +2083,7 @@
   
   
   
+  
 <h3>Requests</h3><dl><dt class="request"><a name="request_edit.format">edit.format</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "edit.format"
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 b8f7eb1..8842cc5 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -22,6 +22,7 @@
 import 'package:analysis_server/src/protocol/protocol_internal.dart'
     show listEqual, mapEqual;
 import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:meta/meta.dart';
 
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
@@ -29,14 +30,14 @@
   static const jsonHandler = LspJsonHandler(
       AnalyzerStatusParams.canParse, AnalyzerStatusParams.fromJson);
 
-  AnalyzerStatusParams(this.isAnalyzing) {
+  AnalyzerStatusParams({@required this.isAnalyzing}) {
     if (isAnalyzing == null) {
       throw 'isAnalyzing is required but was not provided';
     }
   }
   static AnalyzerStatusParams fromJson(Map<String, dynamic> json) {
     final isAnalyzing = json['isAnalyzing'];
-    return AnalyzerStatusParams(isAnalyzing);
+    return AnalyzerStatusParams(isAnalyzing: isAnalyzing);
   }
 
   final bool isAnalyzing;
@@ -98,7 +99,7 @@
   static const jsonHandler =
       LspJsonHandler(ClosingLabel.canParse, ClosingLabel.fromJson);
 
-  ClosingLabel(this.range, this.label) {
+  ClosingLabel({@required this.range, @required this.label}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -109,7 +110,7 @@
   static ClosingLabel fromJson(Map<String, dynamic> json) {
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final label = json['label'];
-    return ClosingLabel(range, label);
+    return ClosingLabel(range: range, label: label);
   }
 
   final String label;
@@ -190,8 +191,13 @@
       CompletionItemResolutionInfo.canParse,
       CompletionItemResolutionInfo.fromJson);
 
-  CompletionItemResolutionInfo(this.file, this.offset, this.libId,
-      this.displayUri, this.rOffset, this.rLength) {
+  CompletionItemResolutionInfo(
+      {@required this.file,
+      @required this.offset,
+      @required this.libId,
+      @required this.displayUri,
+      @required this.rOffset,
+      @required this.rLength}) {
     if (file == null) {
       throw 'file is required but was not provided';
     }
@@ -219,7 +225,12 @@
     final rOffset = json['rOffset'];
     final rLength = json['rLength'];
     return CompletionItemResolutionInfo(
-        file, offset, libId, displayUri, rOffset, rLength);
+        file: file,
+        offset: offset,
+        libId: libId,
+        displayUri: displayUri,
+        rOffset: rOffset,
+        rLength: rLength);
   }
 
   final String displayUri;
@@ -389,14 +400,14 @@
   static const jsonHandler = LspJsonHandler(
       DartDiagnosticServer.canParse, DartDiagnosticServer.fromJson);
 
-  DartDiagnosticServer(this.port) {
+  DartDiagnosticServer({@required this.port}) {
     if (port == null) {
       throw 'port is required but was not provided';
     }
   }
   static DartDiagnosticServer fromJson(Map<String, dynamic> json) {
     final port = json['port'];
-    return DartDiagnosticServer(port);
+    return DartDiagnosticServer(port: port);
   }
 
   final num port;
@@ -456,8 +467,13 @@
 class Element implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Element.canParse, Element.fromJson);
 
-  Element(this.range, this.name, this.kind, this.parameters,
-      this.typeParameters, this.returnType) {
+  Element(
+      {this.range,
+      @required this.name,
+      @required this.kind,
+      this.parameters,
+      this.typeParameters,
+      this.returnType}) {
     if (name == null) {
       throw 'name is required but was not provided';
     }
@@ -472,7 +488,13 @@
     final parameters = json['parameters'];
     final typeParameters = json['typeParameters'];
     final returnType = json['returnType'];
-    return Element(range, name, kind, parameters, typeParameters, returnType);
+    return Element(
+        range: range,
+        name: name,
+        kind: kind,
+        parameters: parameters,
+        typeParameters: typeParameters,
+        returnType: returnType);
   }
 
   final String kind;
@@ -616,15 +638,15 @@
       LspJsonHandler(FlutterOutline.canParse, FlutterOutline.fromJson);
 
   FlutterOutline(
-      this.kind,
+      {@required this.kind,
       this.label,
       this.className,
       this.variableName,
       this.attributes,
       this.dartElement,
-      this.range,
-      this.codeRange,
-      this.children) {
+      @required this.range,
+      @required this.codeRange,
+      this.children}) {
     if (kind == null) {
       throw 'kind is required but was not provided';
     }
@@ -655,8 +677,16 @@
         ?.map((item) => item != null ? FlutterOutline.fromJson(item) : null)
         ?.cast<FlutterOutline>()
         ?.toList();
-    return FlutterOutline(kind, label, className, variableName, attributes,
-        dartElement, range, codeRange, children);
+    return FlutterOutline(
+        kind: kind,
+        label: label,
+        className: className,
+        variableName: variableName,
+        attributes: attributes,
+        dartElement: dartElement,
+        range: range,
+        codeRange: codeRange,
+        children: children);
   }
 
   final List<FlutterOutlineAttribute> attributes;
@@ -862,7 +892,8 @@
   static const jsonHandler = LspJsonHandler(
       FlutterOutlineAttribute.canParse, FlutterOutlineAttribute.fromJson);
 
-  FlutterOutlineAttribute(this.name, this.label, this.valueRange) {
+  FlutterOutlineAttribute(
+      {@required this.name, @required this.label, this.valueRange}) {
     if (name == null) {
       throw 'name is required but was not provided';
     }
@@ -875,7 +906,8 @@
     final label = json['label'];
     final valueRange =
         json['valueRange'] != null ? Range.fromJson(json['valueRange']) : null;
-    return FlutterOutlineAttribute(name, label, valueRange);
+    return FlutterOutlineAttribute(
+        name: name, label: label, valueRange: valueRange);
   }
 
   final String label;
@@ -973,7 +1005,11 @@
 class Outline implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Outline.canParse, Outline.fromJson);
 
-  Outline(this.element, this.range, this.codeRange, this.children) {
+  Outline(
+      {@required this.element,
+      @required this.range,
+      @required this.codeRange,
+      this.children}) {
     if (element == null) {
       throw 'element is required but was not provided';
     }
@@ -994,7 +1030,11 @@
         ?.map((item) => item != null ? Outline.fromJson(item) : null)
         ?.cast<Outline>()
         ?.toList();
-    return Outline(element, range, codeRange, children);
+    return Outline(
+        element: element,
+        range: range,
+        codeRange: codeRange,
+        children: children);
   }
 
   final List<Outline> children;
@@ -1118,7 +1158,7 @@
   static const jsonHandler = LspJsonHandler(
       PublishClosingLabelsParams.canParse, PublishClosingLabelsParams.fromJson);
 
-  PublishClosingLabelsParams(this.uri, this.labels) {
+  PublishClosingLabelsParams({@required this.uri, @required this.labels}) {
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
@@ -1132,7 +1172,7 @@
         ?.map((item) => item != null ? ClosingLabel.fromJson(item) : null)
         ?.cast<ClosingLabel>()
         ?.toList();
-    return PublishClosingLabelsParams(uri, labels);
+    return PublishClosingLabelsParams(uri: uri, labels: labels);
   }
 
   final List<ClosingLabel> labels;
@@ -1219,7 +1259,7 @@
       PublishFlutterOutlineParams.canParse,
       PublishFlutterOutlineParams.fromJson);
 
-  PublishFlutterOutlineParams(this.uri, this.outline) {
+  PublishFlutterOutlineParams({@required this.uri, @required this.outline}) {
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
@@ -1232,7 +1272,7 @@
     final outline = json['outline'] != null
         ? FlutterOutline.fromJson(json['outline'])
         : null;
-    return PublishFlutterOutlineParams(uri, outline);
+    return PublishFlutterOutlineParams(uri: uri, outline: outline);
   }
 
   final FlutterOutline outline;
@@ -1314,7 +1354,7 @@
   static const jsonHandler = LspJsonHandler(
       PublishOutlineParams.canParse, PublishOutlineParams.fromJson);
 
-  PublishOutlineParams(this.uri, this.outline) {
+  PublishOutlineParams({@required this.uri, @required this.outline}) {
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
@@ -1326,7 +1366,7 @@
     final uri = json['uri'];
     final outline =
         json['outline'] != null ? Outline.fromJson(json['outline']) : null;
-    return PublishOutlineParams(uri, outline);
+    return PublishOutlineParams(uri: uri, outline: outline);
   }
 
   final Outline outline;
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index 39e2e89..1a6a820 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -22,6 +22,7 @@
 import 'package:analysis_server/src/protocol/protocol_internal.dart'
     show listEqual, mapEqual;
 import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:meta/meta.dart';
 
 const jsonEncoder = JsonEncoder.withIndent('    ');
 
@@ -29,7 +30,7 @@
   static const jsonHandler = LspJsonHandler(
       ApplyWorkspaceEditParams.canParse, ApplyWorkspaceEditParams.fromJson);
 
-  ApplyWorkspaceEditParams(this.label, this.edit) {
+  ApplyWorkspaceEditParams({this.label, @required this.edit}) {
     if (edit == null) {
       throw 'edit is required but was not provided';
     }
@@ -38,7 +39,7 @@
     final label = json['label'];
     final edit =
         json['edit'] != null ? WorkspaceEdit.fromJson(json['edit']) : null;
-    return ApplyWorkspaceEditParams(label, edit);
+    return ApplyWorkspaceEditParams(label: label, edit: edit);
   }
 
   /// The edits to apply.
@@ -117,7 +118,7 @@
   static const jsonHandler = LspJsonHandler(
       ApplyWorkspaceEditResponse.canParse, ApplyWorkspaceEditResponse.fromJson);
 
-  ApplyWorkspaceEditResponse(this.applied, this.failureReason) {
+  ApplyWorkspaceEditResponse({@required this.applied, this.failureReason}) {
     if (applied == null) {
       throw 'applied is required but was not provided';
     }
@@ -125,7 +126,8 @@
   static ApplyWorkspaceEditResponse fromJson(Map<String, dynamic> json) {
     final applied = json['applied'];
     final failureReason = json['failureReason'];
-    return ApplyWorkspaceEditResponse(applied, failureReason);
+    return ApplyWorkspaceEditResponse(
+        applied: applied, failureReason: failureReason);
   }
 
   /// Indicates whether the edit was applied or not.
@@ -208,7 +210,7 @@
   static const jsonHandler =
       LspJsonHandler(CancelParams.canParse, CancelParams.fromJson);
 
-  CancelParams(this.id) {
+  CancelParams({@required this.id}) {
     if (id == null) {
       throw 'id is required but was not provided';
     }
@@ -219,7 +221,7 @@
         : (json['id'] is String
             ? Either2<num, String>.t2(json['id'])
             : (throw '''${json['id']} was not one of (num, String)'''));
-    return CancelParams(id);
+    return CancelParams(id: id);
   }
 
   /// The request id to cancel.
@@ -280,16 +282,24 @@
   static const jsonHandler =
       LspJsonHandler(ClientCapabilities.canParse, ClientCapabilities.fromJson);
 
-  ClientCapabilities(this.workspace, this.textDocument, this.experimental);
+  ClientCapabilities(
+      {this.workspace, this.textDocument, this.window, this.experimental});
   static ClientCapabilities fromJson(Map<String, dynamic> json) {
     final workspace = json['workspace'] != null
-        ? WorkspaceClientCapabilities.fromJson(json['workspace'])
+        ? ClientCapabilitiesWorkspace.fromJson(json['workspace'])
         : null;
     final textDocument = json['textDocument'] != null
         ? TextDocumentClientCapabilities.fromJson(json['textDocument'])
         : null;
+    final window = json['window'] != null
+        ? ClientCapabilitiesWindow.fromJson(json['window'])
+        : null;
     final experimental = json['experimental'];
-    return ClientCapabilities(workspace, textDocument, experimental);
+    return ClientCapabilities(
+        workspace: workspace,
+        textDocument: textDocument,
+        window: window,
+        experimental: experimental);
   }
 
   /// Experimental client capabilities.
@@ -298,8 +308,11 @@
   /// Text document specific client capabilities.
   final TextDocumentClientCapabilities textDocument;
 
+  /// Window specific client capabilities.
+  final ClientCapabilitiesWindow window;
+
   /// Workspace specific client capabilities.
-  final WorkspaceClientCapabilities workspace;
+  final ClientCapabilitiesWorkspace workspace;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
@@ -309,6 +322,9 @@
     if (textDocument != null) {
       __result['textDocument'] = textDocument;
     }
+    if (window != null) {
+      __result['window'] = window;
+    }
     if (experimental != null) {
       __result['experimental'] = experimental;
     }
@@ -320,9 +336,9 @@
       reporter.push('workspace');
       try {
         if (obj['workspace'] != null &&
-            !(WorkspaceClientCapabilities.canParse(
+            !(ClientCapabilitiesWorkspace.canParse(
                 obj['workspace'], reporter))) {
-          reporter.reportError('must be of type WorkspaceClientCapabilities');
+          reporter.reportError('must be of type ClientCapabilitiesWorkspace');
           return false;
         }
       } finally {
@@ -340,6 +356,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('window');
+      try {
+        if (obj['window'] != null &&
+            !(ClientCapabilitiesWindow.canParse(obj['window'], reporter))) {
+          reporter.reportError('must be of type ClientCapabilitiesWindow');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('experimental');
       try {
         if (obj['experimental'] != null && !(true)) {
@@ -362,6 +388,7 @@
         other.runtimeType == ClientCapabilities) {
       return workspace == other.workspace &&
           textDocument == other.textDocument &&
+          window == other.window &&
           experimental == other.experimental &&
           true;
     }
@@ -373,6 +400,7 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, workspace.hashCode);
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, window.hashCode);
     hash = JenkinsSmiHash.combine(hash, experimental.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
@@ -381,6 +409,308 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class ClientCapabilitiesWindow implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ClientCapabilitiesWindow.canParse, ClientCapabilitiesWindow.fromJson);
+
+  ClientCapabilitiesWindow({this.workDoneProgress});
+  static ClientCapabilitiesWindow fromJson(Map<String, dynamic> json) {
+    final workDoneProgress = json['workDoneProgress'];
+    return ClientCapabilitiesWindow(workDoneProgress: workDoneProgress);
+  }
+
+  /// Whether client supports handling progress notifications. If set servers
+  /// are allowed to report in `workDoneProgress` property in the request
+  /// specific server capabilities.
+  ///
+  /// Since 3.15.0
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          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 && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @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});
+  static ClientCapabilitiesWorkspace fromJson(Map<String, dynamic> json) {
+    final applyEdit = json['applyEdit'];
+    final workspaceEdit = json['workspaceEdit'] != null
+        ? WorkspaceEditClientCapabilities.fromJson(json['workspaceEdit'])
+        : null;
+    final didChangeConfiguration = json['didChangeConfiguration'] != null
+        ? DidChangeConfigurationClientCapabilities.fromJson(
+            json['didChangeConfiguration'])
+        : null;
+    final didChangeWatchedFiles = json['didChangeWatchedFiles'] != null
+        ? DidChangeWatchedFilesClientCapabilities.fromJson(
+            json['didChangeWatchedFiles'])
+        : null;
+    final symbol = json['symbol'] != null
+        ? WorkspaceSymbolClientCapabilities.fromJson(json['symbol'])
+        : null;
+    final executeCommand = json['executeCommand'] != null
+        ? ExecuteCommandClientCapabilities.fromJson(json['executeCommand'])
+        : null;
+    final workspaceFolders = json['workspaceFolders'];
+    final configuration = json['configuration'];
+    return ClientCapabilitiesWorkspace(
+        applyEdit: applyEdit,
+        workspaceEdit: workspaceEdit,
+        didChangeConfiguration: didChangeConfiguration,
+        didChangeWatchedFiles: didChangeWatchedFiles,
+        symbol: symbol,
+        executeCommand: executeCommand,
+        workspaceFolders: workspaceFolders,
+        configuration: configuration);
+  }
+
+  /// The client supports applying batch edits to the workspace by supporting
+  /// the request 'workspace/applyEdit'
+  final bool applyEdit;
+
+  /// The client supports `workspace/configuration` requests.
+  ///
+  /// Since 3.6.0
+  final bool configuration;
+
+  /// 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;
+
+  /// 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, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (applyEdit != null) {
+      __result['applyEdit'] = applyEdit;
+    }
+    if (workspaceEdit != null) {
+      __result['workspaceEdit'] = workspaceEdit;
+    }
+    if (didChangeConfiguration != null) {
+      __result['didChangeConfiguration'] = didChangeConfiguration;
+    }
+    if (didChangeWatchedFiles != null) {
+      __result['didChangeWatchedFiles'] = didChangeWatchedFiles;
+    }
+    if (symbol != null) {
+      __result['symbol'] = symbol;
+    }
+    if (executeCommand != null) {
+      __result['executeCommand'] = executeCommand;
+    }
+    if (workspaceFolders != null) {
+      __result['workspaceFolders'] = workspaceFolders;
+    }
+    if (configuration != null) {
+      __result['configuration'] = configuration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('applyEdit');
+      try {
+        if (obj['applyEdit'] != null && !(obj['applyEdit'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspaceEdit');
+      try {
+        if (obj['workspaceEdit'] != null &&
+            !(WorkspaceEditClientCapabilities.canParse(
+                obj['workspaceEdit'], reporter))) {
+          reporter
+              .reportError('must be of type WorkspaceEditClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didChangeConfiguration');
+      try {
+        if (obj['didChangeConfiguration'] != null &&
+            !(DidChangeConfigurationClientCapabilities.canParse(
+                obj['didChangeConfiguration'], reporter))) {
+          reporter.reportError(
+              'must be of type DidChangeConfigurationClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('didChangeWatchedFiles');
+      try {
+        if (obj['didChangeWatchedFiles'] != null &&
+            !(DidChangeWatchedFilesClientCapabilities.canParse(
+                obj['didChangeWatchedFiles'], reporter))) {
+          reporter.reportError(
+              'must be of type DidChangeWatchedFilesClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('symbol');
+      try {
+        if (obj['symbol'] != null &&
+            !(WorkspaceSymbolClientCapabilities.canParse(
+                obj['symbol'], reporter))) {
+          reporter
+              .reportError('must be of type WorkspaceSymbolClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('executeCommand');
+      try {
+        if (obj['executeCommand'] != null &&
+            !(ExecuteCommandClientCapabilities.canParse(
+                obj['executeCommand'], reporter))) {
+          reporter
+              .reportError('must be of type ExecuteCommandClientCapabilities');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workspaceFolders');
+      try {
+        if (obj['workspaceFolders'] != null &&
+            !(obj['workspaceFolders'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('configuration');
+      try {
+        if (obj['configuration'] != null && !(obj['configuration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          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 &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, applyEdit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspaceEdit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, didChangeConfiguration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, didChangeWatchedFiles.hashCode);
+    hash = JenkinsSmiHash.combine(hash, symbol.hashCode);
+    hash = JenkinsSmiHash.combine(hash, executeCommand.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspaceFolders.hashCode);
+    hash = JenkinsSmiHash.combine(hash, configuration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @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.
 ///
@@ -390,7 +720,13 @@
   static const jsonHandler =
       LspJsonHandler(CodeAction.canParse, CodeAction.fromJson);
 
-  CodeAction(this.title, this.kind, this.diagnostics, this.edit, this.command) {
+  CodeAction(
+      {@required this.title,
+      this.kind,
+      this.diagnostics,
+      this.isPreferred,
+      this.edit,
+      this.command}) {
     if (title == null) {
       throw 'title is required but was not provided';
     }
@@ -403,11 +739,18 @@
         ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
+    final isPreferred = json['isPreferred'];
     final edit =
         json['edit'] != null ? WorkspaceEdit.fromJson(json['edit']) : null;
     final command =
         json['command'] != null ? Command.fromJson(json['command']) : null;
-    return CodeAction(title, kind, diagnostics, edit, command);
+    return CodeAction(
+        title: title,
+        kind: kind,
+        diagnostics: diagnostics,
+        isPreferred: isPreferred,
+        edit: edit,
+        command: command);
   }
 
   /// A command this code action executes. If a code action provides an edit and
@@ -420,6 +763,15 @@
   /// The workspace edit this code action performs.
   final WorkspaceEdit edit;
 
+  /// Marks this as a preferred action. Preferred actions are used by the `auto
+  /// fix` command and can be targeted by keybindings.
+  ///
+  /// A quick fix should be marked preferred if it properly addresses the
+  /// underlying error. A refactoring should be marked preferred if it is the
+  /// most reasonable choice of actions to take.
+  ///  @since 3.15.0
+  final bool isPreferred;
+
   /// The kind of the code action.
   ///
   /// Used to filter code actions.
@@ -437,6 +789,9 @@
     if (diagnostics != null) {
       __result['diagnostics'] = diagnostics;
     }
+    if (isPreferred != null) {
+      __result['isPreferred'] = isPreferred;
+    }
     if (edit != null) {
       __result['edit'] = edit;
     }
@@ -487,6 +842,15 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('isPreferred');
+      try {
+        if (obj['isPreferred'] != null && !(obj['isPreferred'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('edit');
       try {
         if (obj['edit'] != null &&
@@ -521,6 +885,7 @@
           kind == other.kind &&
           listEqual(diagnostics, other.diagnostics,
               (Diagnostic a, Diagnostic b) => a == b) &&
+          isPreferred == other.isPreferred &&
           edit == other.edit &&
           command == other.command &&
           true;
@@ -534,6 +899,7 @@
     hash = JenkinsSmiHash.combine(hash, title.hashCode);
     hash = JenkinsSmiHash.combine(hash, kind.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(diagnostics));
+    hash = JenkinsSmiHash.combine(hash, isPreferred.hashCode);
     hash = JenkinsSmiHash.combine(hash, edit.hashCode);
     hash = JenkinsSmiHash.combine(hash, command.hashCode);
     return JenkinsSmiHash.finish(hash);
@@ -543,13 +909,291 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CodeActionClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CodeActionClientCapabilities.canParse,
+      CodeActionClientCapabilities.fromJson);
+
+  CodeActionClientCapabilities(
+      {this.dynamicRegistration,
+      this.codeActionLiteralSupport,
+      this.isPreferredSupport});
+  static CodeActionClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final codeActionLiteralSupport = json['codeActionLiteralSupport'] != null
+        ? CodeActionClientCapabilitiesCodeActionLiteralSupport.fromJson(
+            json['codeActionLiteralSupport'])
+        : null;
+    final isPreferredSupport = json['isPreferredSupport'];
+    return CodeActionClientCapabilities(
+        dynamicRegistration: dynamicRegistration,
+        codeActionLiteralSupport: codeActionLiteralSupport,
+        isPreferredSupport: isPreferredSupport);
+  }
+
+  /// The client supports code action literals as a valid response of the
+  /// `textDocument/codeAction` request.
+  ///  @since 3.8.0
+  final CodeActionClientCapabilitiesCodeActionLiteralSupport
+      codeActionLiteralSupport;
+
+  /// Whether code action supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// Whether code action supports the `isPreferred` property. @since 3.15.0
+  final bool isPreferredSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (codeActionLiteralSupport != null) {
+      __result['codeActionLiteralSupport'] = codeActionLiteralSupport;
+    }
+    if (isPreferredSupport != null) {
+      __result['isPreferredSupport'] = isPreferredSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('codeActionLiteralSupport');
+      try {
+        if (obj['codeActionLiteralSupport'] != null &&
+            !(CodeActionClientCapabilitiesCodeActionLiteralSupport.canParse(
+                obj['codeActionLiteralSupport'], reporter))) {
+          reporter.reportError(
+              'must be of type CodeActionClientCapabilitiesCodeActionLiteralSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('isPreferredSupport');
+      try {
+        if (obj['isPreferredSupport'] != null &&
+            !(obj['isPreferredSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CodeActionClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CodeActionClientCapabilities &&
+        other.runtimeType == CodeActionClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          codeActionLiteralSupport == other.codeActionLiteralSupport &&
+          isPreferredSupport == other.isPreferredSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeActionLiteralSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, isPreferredSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CodeActionClientCapabilitiesCodeActionKind implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CodeActionClientCapabilitiesCodeActionKind.canParse,
+      CodeActionClientCapabilitiesCodeActionKind.fromJson);
+
+  CodeActionClientCapabilitiesCodeActionKind({@required this.valueSet}) {
+    if (valueSet == null) {
+      throw 'valueSet is required but was not provided';
+    }
+  }
+  static CodeActionClientCapabilitiesCodeActionKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
+        ?.cast<CodeActionKind>()
+        ?.toList();
+    return CodeActionClientCapabilitiesCodeActionKind(valueSet: valueSet);
+  }
+
+  /// The code action kind values the client supports. When this property exists
+  /// the client also guarantees that it will handle values outside its set
+  /// gracefully and falls back to a default value when unknown.
+  final List<CodeActionKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['valueSet'] =
+        valueSet ?? (throw 'valueSet is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('valueSet');
+      try {
+        if (!obj.containsKey('valueSet')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['valueSet'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((obj['valueSet'] is List &&
+            (obj['valueSet']
+                .every((item) => CodeActionKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CodeActionKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type CodeActionClientCapabilitiesCodeActionKind');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CodeActionClientCapabilitiesCodeActionKind &&
+        other.runtimeType == CodeActionClientCapabilitiesCodeActionKind) {
+      return listEqual(valueSet, other.valueSet,
+              (CodeActionKind a, CodeActionKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CodeActionClientCapabilitiesCodeActionLiteralSupport
+    implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CodeActionClientCapabilitiesCodeActionLiteralSupport.canParse,
+      CodeActionClientCapabilitiesCodeActionLiteralSupport.fromJson);
+
+  CodeActionClientCapabilitiesCodeActionLiteralSupport(
+      {@required this.codeActionKind}) {
+    if (codeActionKind == null) {
+      throw 'codeActionKind is required but was not provided';
+    }
+  }
+  static CodeActionClientCapabilitiesCodeActionLiteralSupport fromJson(
+      Map<String, dynamic> json) {
+    final codeActionKind = json['codeActionKind'] != null
+        ? CodeActionClientCapabilitiesCodeActionKind.fromJson(
+            json['codeActionKind'])
+        : null;
+    return CodeActionClientCapabilitiesCodeActionLiteralSupport(
+        codeActionKind: codeActionKind);
+  }
+
+  /// The code action kind is supported with the following value set.
+  final CodeActionClientCapabilitiesCodeActionKind codeActionKind;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['codeActionKind'] =
+        codeActionKind ?? (throw 'codeActionKind is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('codeActionKind');
+      try {
+        if (!obj.containsKey('codeActionKind')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['codeActionKind'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(CodeActionClientCapabilitiesCodeActionKind.canParse(
+            obj['codeActionKind'], reporter))) {
+          reporter.reportError(
+              'must be of type CodeActionClientCapabilitiesCodeActionKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type CodeActionClientCapabilitiesCodeActionLiteralSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CodeActionClientCapabilitiesCodeActionLiteralSupport &&
+        other.runtimeType ==
+            CodeActionClientCapabilitiesCodeActionLiteralSupport) {
+      return codeActionKind == other.codeActionKind && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, codeActionKind.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Contains additional diagnostic information about the context in which a code
 /// action is run.
 class CodeActionContext implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CodeActionContext.canParse, CodeActionContext.fromJson);
 
-  CodeActionContext(this.diagnostics, this.only) {
+  CodeActionContext({@required this.diagnostics, this.only}) {
     if (diagnostics == null) {
       throw 'diagnostics is required but was not provided';
     }
@@ -563,10 +1207,15 @@
         ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
         ?.cast<CodeActionKind>()
         ?.toList();
-    return CodeActionContext(diagnostics, only);
+    return CodeActionContext(diagnostics: diagnostics, only: only);
   }
 
-  /// An array of diagnostics.
+  /// An array of diagnostics known on the client side overlapping the range
+  /// provided to the `textDocument/codeAction` request. They are provided so
+  /// that the server knows which errors are currently presented to the user for
+  /// the given range. There is no guarantee that these accurately reflect the
+  /// error state of the resource. The primary parameter to compute code actions
+  /// is the provided range.
   final List<Diagnostic> diagnostics;
 
   /// Requested kind of actions to return.
@@ -649,7 +1298,7 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// A set of predefined code action kinds
+/// A set of predefined code action kinds.
 class CodeActionKind {
   const CodeActionKind(this._value);
   const CodeActionKind.fromJson(this._value);
@@ -663,13 +1312,13 @@
   /// Empty kind.
   static const Empty = CodeActionKind('');
 
-  /// Base kind for quickfix actions: 'quickfix'
+  /// Base kind for quickfix actions: 'quickfix'.
   static const QuickFix = CodeActionKind('quickfix');
 
-  /// Base kind for refactoring actions: 'refactor'
+  /// Base kind for refactoring actions: 'refactor'.
   static const Refactor = CodeActionKind('refactor');
 
-  /// Base kind for refactoring extraction actions: 'refactor.extract'
+  /// Base kind for refactoring extraction actions: 'refactor.extract'.
   ///
   /// Example extract actions:
   ///
@@ -680,7 +1329,7 @@
   /// - ...
   static const RefactorExtract = CodeActionKind('refactor.extract');
 
-  /// Base kind for refactoring inline actions: 'refactor.inline'
+  /// Base kind for refactoring inline actions: 'refactor.inline'.
   ///
   /// Example inline actions:
   ///
@@ -690,7 +1339,7 @@
   /// - ...
   static const RefactorInline = CodeActionKind('refactor.inline');
 
-  /// Base kind for refactoring rewrite actions: 'refactor.rewrite'
+  /// Base kind for refactoring rewrite actions: 'refactor.rewrite'.
   ///
   /// Example rewrite actions:
   ///
@@ -702,12 +1351,12 @@
   /// - ...
   static const RefactorRewrite = CodeActionKind('refactor.rewrite');
 
-  /// Base kind for source actions: `source`
+  /// Base kind for source actions: `source`.
   ///
   /// Source code actions apply to the entire file.
   static const Source = CodeActionKind('source');
 
-  /// Base kind for an organize imports source action: `source.organizeImports`
+  /// Base kind for an organize imports source action: `source.organizeImports`.
   static const SourceOrganizeImports = CodeActionKind('source.organizeImports');
 
   Object toJson() => _value;
@@ -721,12 +1370,11 @@
   bool operator ==(Object o) => o is CodeActionKind && o._value == _value;
 }
 
-/// Code Action options.
-class CodeActionOptions implements ToJsonable {
+class CodeActionOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CodeActionOptions.canParse, CodeActionOptions.fromJson);
 
-  CodeActionOptions(this.codeActionKinds);
+  CodeActionOptions({this.codeActionKinds, this.workDoneProgress});
   static CodeActionOptions fromJson(Map<String, dynamic> json) {
     if (CodeActionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
       return CodeActionRegistrationOptions.fromJson(json);
@@ -735,7 +1383,9 @@
         ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
         ?.cast<CodeActionKind>()
         ?.toList();
-    return CodeActionOptions(codeActionKinds);
+    final workDoneProgress = json['workDoneProgress'];
+    return CodeActionOptions(
+        codeActionKinds: codeActionKinds, workDoneProgress: workDoneProgress);
   }
 
   /// CodeActionKinds that this server may return.
@@ -743,12 +1393,16 @@
   /// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or
   /// the server may list out every specific kind they provide.
   final List<CodeActionKind> codeActionKinds;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     if (codeActionKinds != null) {
       __result['codeActionKinds'] = codeActionKinds;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -766,6 +1420,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeActionOptions');
@@ -778,6 +1442,7 @@
     if (other is CodeActionOptions && other.runtimeType == CodeActionOptions) {
       return listEqual(codeActionKinds, other.codeActionKinds,
               (CodeActionKind a, CodeActionKind b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -787,6 +1452,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, lspHashCode(codeActionKinds));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -795,11 +1461,17 @@
 }
 
 /// Params for the CodeActionRequest
-class CodeActionParams implements ToJsonable {
+class CodeActionParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CodeActionParams.canParse, CodeActionParams.fromJson);
 
-  CodeActionParams(this.textDocument, this.range, this.context) {
+  CodeActionParams(
+      {@required this.textDocument,
+      @required this.range,
+      @required this.context,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -818,18 +1490,44 @@
     final context = json['context'] != null
         ? CodeActionContext.fromJson(json['context'])
         : null;
-    return CodeActionParams(textDocument, range, context);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return CodeActionParams(
+        textDocument: textDocument,
+        range: range,
+        context: context,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
   /// Context carrying additional information.
   final CodeActionContext context;
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The range for which the command was invoked.
   final Range range;
 
   /// The document in which the command was invoked.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
@@ -837,6 +1535,12 @@
     __result['range'] = range ?? (throw 'range is required but was not set');
     __result['context'] =
         context ?? (throw 'context is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -893,6 +1597,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeActionParams');
@@ -906,6 +1632,8 @@
       return textDocument == other.textDocument &&
           range == other.range &&
           context == other.context &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -917,6 +1645,8 @@
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, range.hashCode);
     hash = JenkinsSmiHash.combine(hash, context.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -930,7 +1660,8 @@
       CodeActionRegistrationOptions.canParse,
       CodeActionRegistrationOptions.fromJson);
 
-  CodeActionRegistrationOptions(this.documentSelector, this.codeActionKinds);
+  CodeActionRegistrationOptions(
+      {this.documentSelector, this.codeActionKinds, this.workDoneProgress});
   static CodeActionRegistrationOptions fromJson(Map<String, dynamic> json) {
     final documentSelector = json['documentSelector']
         ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
@@ -940,7 +1671,11 @@
         ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
         ?.cast<CodeActionKind>()
         ?.toList();
-    return CodeActionRegistrationOptions(documentSelector, codeActionKinds);
+    final workDoneProgress = json['workDoneProgress'];
+    return CodeActionRegistrationOptions(
+        documentSelector: documentSelector,
+        codeActionKinds: codeActionKinds,
+        workDoneProgress: workDoneProgress);
   }
 
   /// CodeActionKinds that this server may return.
@@ -952,6 +1687,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 bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
@@ -959,6 +1695,9 @@
     if (codeActionKinds != null) {
       __result['codeActionKinds'] = codeActionKinds;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -992,6 +1731,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeActionRegistrationOptions');
@@ -1007,6 +1756,7 @@
               (DocumentFilter a, DocumentFilter b) => a == b) &&
           listEqual(codeActionKinds, other.codeActionKinds,
               (CodeActionKind a, CodeActionKind b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -1017,6 +1767,7 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
     hash = JenkinsSmiHash.combine(hash, lspHashCode(codeActionKinds));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -1034,7 +1785,7 @@
   static const jsonHandler =
       LspJsonHandler(CodeLens.canParse, CodeLens.fromJson);
 
-  CodeLens(this.range, this.command, this.data) {
+  CodeLens({@required this.range, this.command, this.data}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -1044,7 +1795,7 @@
     final command =
         json['command'] != null ? Command.fromJson(json['command']) : null;
     final data = json['data'];
-    return CodeLens(range, command, data);
+    return CodeLens(range: range, command: command, data: data);
   }
 
   /// The command this code lens represents.
@@ -1139,25 +1890,93 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Code Lens options.
-class CodeLensOptions implements ToJsonable {
+class CodeLensClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CodeLensClientCapabilities.canParse, CodeLensClientCapabilities.fromJson);
+
+  CodeLensClientCapabilities({this.dynamicRegistration});
+  static CodeLensClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return CodeLensClientCapabilities(dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether code lens supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CodeLensClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CodeLensClientCapabilities &&
+        other.runtimeType == CodeLensClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CodeLensOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CodeLensOptions.canParse, CodeLensOptions.fromJson);
 
-  CodeLensOptions(this.resolveProvider);
+  CodeLensOptions({this.resolveProvider, this.workDoneProgress});
   static CodeLensOptions fromJson(Map<String, dynamic> json) {
+    if (CodeLensRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return CodeLensRegistrationOptions.fromJson(json);
+    }
     final resolveProvider = json['resolveProvider'];
-    return CodeLensOptions(resolveProvider);
+    final workDoneProgress = json['workDoneProgress'];
+    return CodeLensOptions(
+        resolveProvider: resolveProvider, workDoneProgress: workDoneProgress);
   }
 
   /// Code lens has a resolve provider as well.
   final bool resolveProvider;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -1173,6 +1992,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeLensOptions');
@@ -1183,7 +2012,9 @@
   @override
   bool operator ==(Object other) {
     if (other is CodeLensOptions && other.runtimeType == CodeLensOptions) {
-      return resolveProvider == other.resolveProvider && true;
+      return resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
     }
     return false;
   }
@@ -1192,6 +2023,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -1199,11 +2031,15 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class CodeLensParams implements ToJsonable {
+class CodeLensParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CodeLensParams.canParse, CodeLensParams.fromJson);
 
-  CodeLensParams(this.textDocument) {
+  CodeLensParams(
+      {@required this.textDocument,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -1212,16 +2048,46 @@
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    return CodeLensParams(textDocument);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return CodeLensParams(
+        textDocument: textDocument,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The document to request code lens for.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -1244,6 +2110,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeLensParams');
@@ -1254,7 +2142,10 @@
   @override
   bool operator ==(Object other) {
     if (other is CodeLensParams && other.runtimeType == CodeLensParams) {
-      return textDocument == other.textDocument && true;
+      return textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
     }
     return false;
   }
@@ -1263,6 +2154,8 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -1271,19 +2164,24 @@
 }
 
 class CodeLensRegistrationOptions
-    implements TextDocumentRegistrationOptions, ToJsonable {
+    implements TextDocumentRegistrationOptions, CodeLensOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       CodeLensRegistrationOptions.canParse,
       CodeLensRegistrationOptions.fromJson);
 
-  CodeLensRegistrationOptions(this.resolveProvider, this.documentSelector);
+  CodeLensRegistrationOptions(
+      {this.documentSelector, this.resolveProvider, this.workDoneProgress});
   static CodeLensRegistrationOptions fromJson(Map<String, dynamic> json) {
-    final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
         ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
-    return CodeLensRegistrationOptions(resolveProvider, documentSelector);
+    final resolveProvider = json['resolveProvider'];
+    final workDoneProgress = json['workDoneProgress'];
+    return CodeLensRegistrationOptions(
+        documentSelector: documentSelector,
+        resolveProvider: resolveProvider,
+        workDoneProgress: workDoneProgress);
   }
 
   /// A document selector to identify the scope of the registration. If set to
@@ -1292,28 +2190,22 @@
 
   /// Code lens has a resolve provider as well.
   final bool resolveProvider;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
-    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
-      reporter.push('resolveProvider');
-      try {
-        if (obj['resolveProvider'] != null &&
-            !(obj['resolveProvider'] is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -1330,6 +2222,26 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('resolveProvider');
+      try {
+        if (obj['resolveProvider'] != null &&
+            !(obj['resolveProvider'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CodeLensRegistrationOptions');
@@ -1341,9 +2253,10 @@
   bool operator ==(Object other) {
     if (other is CodeLensRegistrationOptions &&
         other.runtimeType == CodeLensRegistrationOptions) {
-      return resolveProvider == other.resolveProvider &&
-          listEqual(documentSelector, other.documentSelector,
+      return listEqual(documentSelector, other.documentSelector,
               (DocumentFilter a, DocumentFilter b) => a == b) &&
+          resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -1352,8 +2265,9 @@
   @override
   int get hashCode {
     var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -1365,7 +2279,11 @@
 class Color implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Color.canParse, Color.fromJson);
 
-  Color(this.red, this.green, this.blue, this.alpha) {
+  Color(
+      {@required this.red,
+      @required this.green,
+      @required this.blue,
+      @required this.alpha}) {
     if (red == null) {
       throw 'red is required but was not provided';
     }
@@ -1384,7 +2302,7 @@
     final green = json['green'];
     final blue = json['blue'];
     final alpha = json['alpha'];
-    return Color(red, green, blue, alpha);
+    return Color(red: red, green: green, blue: blue, alpha: alpha);
   }
 
   /// The alpha component of this color in the range [0-1].
@@ -1515,7 +2433,7 @@
   static const jsonHandler =
       LspJsonHandler(ColorInformation.canParse, ColorInformation.fromJson);
 
-  ColorInformation(this.range, this.color) {
+  ColorInformation({@required this.range, @required this.color}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -1526,7 +2444,7 @@
   static ColorInformation fromJson(Map<String, dynamic> json) {
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final color = json['color'] != null ? Color.fromJson(json['color']) : null;
-    return ColorInformation(range, color);
+    return ColorInformation(range: range, color: color);
   }
 
   /// The actual color value for this color range.
@@ -1609,7 +2527,8 @@
   static const jsonHandler =
       LspJsonHandler(ColorPresentation.canParse, ColorPresentation.fromJson);
 
-  ColorPresentation(this.label, this.textEdit, this.additionalTextEdits) {
+  ColorPresentation(
+      {@required this.label, this.textEdit, this.additionalTextEdits}) {
     if (label == null) {
       throw 'label is required but was not provided';
     }
@@ -1622,7 +2541,10 @@
         ?.map((item) => item != null ? TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
-    return ColorPresentation(label, textEdit, additionalTextEdits);
+    return ColorPresentation(
+        label: label,
+        textEdit: textEdit,
+        additionalTextEdits: additionalTextEdits);
   }
 
   /// An optional array of additional text edits ([TextEdit]) that are applied
@@ -1725,11 +2647,17 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ColorPresentationParams implements ToJsonable {
+class ColorPresentationParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       ColorPresentationParams.canParse, ColorPresentationParams.fromJson);
 
-  ColorPresentationParams(this.textDocument, this.color, this.range) {
+  ColorPresentationParams(
+      {@required this.textDocument,
+      @required this.color,
+      @required this.range,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -1746,24 +2674,56 @@
         : null;
     final color = json['color'] != null ? Color.fromJson(json['color']) : null;
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
-    return ColorPresentationParams(textDocument, color, range);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return ColorPresentationParams(
+        textDocument: textDocument,
+        color: color,
+        range: range,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
   /// The color information to request presentations for.
   final Color color;
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The range where the color would be inserted. Serves as a context.
   final Range range;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
     __result['color'] = color ?? (throw 'color is required but was not set');
     __result['range'] = range ?? (throw 'range is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -1820,6 +2780,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ColorPresentationParams');
@@ -1834,6 +2816,8 @@
       return textDocument == other.textDocument &&
           color == other.color &&
           range == other.range &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -1845,48 +2829,8 @@
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, color.hashCode);
     hash = JenkinsSmiHash.combine(hash, range.hashCode);
-    return JenkinsSmiHash.finish(hash);
-  }
-
-  @override
-  String toString() => jsonEncoder.convert(toJson());
-}
-
-/// Color provider options.
-class ColorProviderOptions implements ToJsonable {
-  static const jsonHandler = LspJsonHandler(
-      ColorProviderOptions.canParse, ColorProviderOptions.fromJson);
-
-  static ColorProviderOptions fromJson(Map<String, dynamic> json) {
-    return ColorProviderOptions();
-  }
-
-  Map<String, dynamic> toJson() {
-    var __result = <String, dynamic>{};
-    return __result;
-  }
-
-  static bool canParse(Object obj, LspJsonReporter reporter) {
-    if (obj is Map<String, dynamic>) {
-      return true;
-    } else {
-      reporter.reportError('must be of type ColorProviderOptions');
-      return false;
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (other is ColorProviderOptions &&
-        other.runtimeType == ColorProviderOptions) {
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  int get hashCode {
-    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -1897,7 +2841,7 @@
 class Command implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Command.canParse, Command.fromJson);
 
-  Command(this.title, this.command, this.arguments) {
+  Command({@required this.title, @required this.command, this.arguments}) {
     if (title == null) {
       throw 'title is required but was not provided';
     }
@@ -1910,7 +2854,7 @@
     final command = json['command'];
     final arguments =
         json['arguments']?.map((item) => item)?.cast<dynamic>()?.toList();
-    return Command(title, command, arguments);
+    return Command(title: title, command: command, arguments: arguments);
   }
 
   /// Arguments that the command handler should be invoked with.
@@ -2012,13 +2956,494 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class CompletionClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CompletionClientCapabilities.canParse,
+      CompletionClientCapabilities.fromJson);
+
+  CompletionClientCapabilities(
+      {this.dynamicRegistration,
+      this.completionItem,
+      this.completionItemKind,
+      this.contextSupport});
+  static CompletionClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final completionItem = json['completionItem'] != null
+        ? CompletionClientCapabilitiesCompletionItem.fromJson(
+            json['completionItem'])
+        : null;
+    final completionItemKind = json['completionItemKind'] != null
+        ? CompletionClientCapabilitiesCompletionItemKind.fromJson(
+            json['completionItemKind'])
+        : null;
+    final contextSupport = json['contextSupport'];
+    return CompletionClientCapabilities(
+        dynamicRegistration: dynamicRegistration,
+        completionItem: completionItem,
+        completionItemKind: completionItemKind,
+        contextSupport: contextSupport);
+  }
+
+  /// The client supports the following `CompletionItem` specific capabilities.
+  final CompletionClientCapabilitiesCompletionItem completionItem;
+  final CompletionClientCapabilitiesCompletionItemKind completionItemKind;
+
+  /// The client supports to send additional context information for a
+  /// `textDocument/completion` request.
+  final bool contextSupport;
+
+  /// Whether completion supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (completionItem != null) {
+      __result['completionItem'] = completionItem;
+    }
+    if (completionItemKind != null) {
+      __result['completionItemKind'] = completionItemKind;
+    }
+    if (contextSupport != null) {
+      __result['contextSupport'] = contextSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('completionItem');
+      try {
+        if (obj['completionItem'] != null &&
+            !(CompletionClientCapabilitiesCompletionItem.canParse(
+                obj['completionItem'], reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesCompletionItem');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('completionItemKind');
+      try {
+        if (obj['completionItemKind'] != null &&
+            !(CompletionClientCapabilitiesCompletionItemKind.canParse(
+                obj['completionItemKind'], reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesCompletionItemKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('contextSupport');
+      try {
+        if (obj['contextSupport'] != null && !(obj['contextSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type CompletionClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionClientCapabilities &&
+        other.runtimeType == CompletionClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          completionItem == other.completionItem &&
+          completionItemKind == other.completionItemKind &&
+          contextSupport == other.contextSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, completionItem.hashCode);
+    hash = JenkinsSmiHash.combine(hash, completionItemKind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, contextSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CompletionClientCapabilitiesCompletionItem implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CompletionClientCapabilitiesCompletionItem.canParse,
+      CompletionClientCapabilitiesCompletionItem.fromJson);
+
+  CompletionClientCapabilitiesCompletionItem(
+      {this.snippetSupport,
+      this.commitCharactersSupport,
+      this.documentationFormat,
+      this.deprecatedSupport,
+      this.preselectSupport,
+      this.tagSupport});
+  static CompletionClientCapabilitiesCompletionItem fromJson(
+      Map<String, dynamic> json) {
+    final snippetSupport = json['snippetSupport'];
+    final commitCharactersSupport = json['commitCharactersSupport'];
+    final documentationFormat = json['documentationFormat']
+        ?.map((item) => item != null ? MarkupKind.fromJson(item) : null)
+        ?.cast<MarkupKind>()
+        ?.toList();
+    final deprecatedSupport = json['deprecatedSupport'];
+    final preselectSupport = json['preselectSupport'];
+    final tagSupport = json['tagSupport'] != null
+        ? CompletionClientCapabilitiesTagSupport.fromJson(json['tagSupport'])
+        : null;
+    return CompletionClientCapabilitiesCompletionItem(
+        snippetSupport: snippetSupport,
+        commitCharactersSupport: commitCharactersSupport,
+        documentationFormat: documentationFormat,
+        deprecatedSupport: deprecatedSupport,
+        preselectSupport: preselectSupport,
+        tagSupport: tagSupport);
+  }
+
+  /// Client supports commit characters on a completion item.
+  final bool commitCharactersSupport;
+
+  /// Client supports the deprecated property on a completion item.
+  final bool deprecatedSupport;
+
+  /// Client supports the follow content formats for the documentation property.
+  /// The order describes the preferred format of the client.
+  final List<MarkupKind> documentationFormat;
+
+  /// Client supports the preselect property on a completion item.
+  final bool preselectSupport;
+
+  /// Client supports snippets as insert text.
+  ///
+  /// A snippet can define tab stops and placeholders with `$1`, `$2` and
+  /// `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of the
+  /// snippet. Placeholders with equal identifiers are linked, that is typing in
+  /// one will update others too.
+  final bool snippetSupport;
+
+  /// Client supports the tag property on a completion item. Clients supporting
+  /// tags have to handle unknown tags gracefully. Clients especially need to
+  /// preserve unknown tags when sending a completion item back to the server in
+  /// a resolve call.
+  ///  @since 3.15.0
+  final CompletionClientCapabilitiesTagSupport tagSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (snippetSupport != null) {
+      __result['snippetSupport'] = snippetSupport;
+    }
+    if (commitCharactersSupport != null) {
+      __result['commitCharactersSupport'] = commitCharactersSupport;
+    }
+    if (documentationFormat != null) {
+      __result['documentationFormat'] = documentationFormat;
+    }
+    if (deprecatedSupport != null) {
+      __result['deprecatedSupport'] = deprecatedSupport;
+    }
+    if (preselectSupport != null) {
+      __result['preselectSupport'] = preselectSupport;
+    }
+    if (tagSupport != null) {
+      __result['tagSupport'] = tagSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('snippetSupport');
+      try {
+        if (obj['snippetSupport'] != null && !(obj['snippetSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('commitCharactersSupport');
+      try {
+        if (obj['commitCharactersSupport'] != null &&
+            !(obj['commitCharactersSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentationFormat');
+      try {
+        if (obj['documentationFormat'] != null &&
+            !((obj['documentationFormat'] is List &&
+                (obj['documentationFormat']
+                    .every((item) => MarkupKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<MarkupKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('deprecatedSupport');
+      try {
+        if (obj['deprecatedSupport'] != null &&
+            !(obj['deprecatedSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('preselectSupport');
+      try {
+        if (obj['preselectSupport'] != null &&
+            !(obj['preselectSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tagSupport');
+      try {
+        if (obj['tagSupport'] != null &&
+            !(CompletionClientCapabilitiesTagSupport.canParse(
+                obj['tagSupport'], reporter))) {
+          reporter.reportError(
+              'must be of type CompletionClientCapabilitiesTagSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type CompletionClientCapabilitiesCompletionItem');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionClientCapabilitiesCompletionItem &&
+        other.runtimeType == CompletionClientCapabilitiesCompletionItem) {
+      return snippetSupport == other.snippetSupport &&
+          commitCharactersSupport == other.commitCharactersSupport &&
+          listEqual(documentationFormat, other.documentationFormat,
+              (MarkupKind a, MarkupKind b) => a == b) &&
+          deprecatedSupport == other.deprecatedSupport &&
+          preselectSupport == other.preselectSupport &&
+          tagSupport == other.tagSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, snippetSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, commitCharactersSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentationFormat));
+    hash = JenkinsSmiHash.combine(hash, deprecatedSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, preselectSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, tagSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CompletionClientCapabilitiesCompletionItemKind implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CompletionClientCapabilitiesCompletionItemKind.canParse,
+      CompletionClientCapabilitiesCompletionItemKind.fromJson);
+
+  CompletionClientCapabilitiesCompletionItemKind({this.valueSet});
+  static CompletionClientCapabilitiesCompletionItemKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? CompletionItemKind.fromJson(item) : null)
+        ?.cast<CompletionItemKind>()
+        ?.toList();
+    return CompletionClientCapabilitiesCompletionItemKind(valueSet: valueSet);
+  }
+
+  /// The completion item kind values the client supports. When this property
+  /// exists the client also guarantees that it will handle values outside its
+  /// set gracefully and falls back to a default value when unknown.
+  ///
+  /// If this property is not present the client only supports the completion
+  /// items kinds from `Text` to `Reference` as defined in the initial version
+  /// of the protocol.
+  final List<CompletionItemKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (valueSet != null) {
+      __result['valueSet'] = valueSet;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('valueSet');
+      try {
+        if (obj['valueSet'] != null &&
+            !((obj['valueSet'] is List &&
+                (obj['valueSet'].every(
+                    (item) => CompletionItemKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CompletionItemKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type CompletionClientCapabilitiesCompletionItemKind');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionClientCapabilitiesCompletionItemKind &&
+        other.runtimeType == CompletionClientCapabilitiesCompletionItemKind) {
+      return listEqual(valueSet, other.valueSet,
+              (CompletionItemKind a, CompletionItemKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class CompletionClientCapabilitiesTagSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      CompletionClientCapabilitiesTagSupport.canParse,
+      CompletionClientCapabilitiesTagSupport.fromJson);
+
+  CompletionClientCapabilitiesTagSupport({@required this.valueSet}) {
+    if (valueSet == null) {
+      throw 'valueSet is required but was not provided';
+    }
+  }
+  static CompletionClientCapabilitiesTagSupport fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? CompletionItemTag.fromJson(item) : null)
+        ?.cast<CompletionItemTag>()
+        ?.toList();
+    return CompletionClientCapabilitiesTagSupport(valueSet: valueSet);
+  }
+
+  /// The tags supported by the client.
+  final List<CompletionItemTag> valueSet;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['valueSet'] =
+        valueSet ?? (throw 'valueSet is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('valueSet');
+      try {
+        if (!obj.containsKey('valueSet')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['valueSet'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((obj['valueSet'] is List &&
+            (obj['valueSet'].every(
+                (item) => CompletionItemTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CompletionItemTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type CompletionClientCapabilitiesTagSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is CompletionClientCapabilitiesTagSupport &&
+        other.runtimeType == CompletionClientCapabilitiesTagSupport) {
+      return listEqual(valueSet, other.valueSet,
+              (CompletionItemTag a, CompletionItemTag b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Contains additional information about the context in which a completion
 /// request is triggered.
 class CompletionContext implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CompletionContext.canParse, CompletionContext.fromJson);
 
-  CompletionContext(this.triggerKind, this.triggerCharacter) {
+  CompletionContext({@required this.triggerKind, this.triggerCharacter}) {
     if (triggerKind == null) {
       throw 'triggerKind is required but was not provided';
     }
@@ -2028,7 +3453,8 @@
         ? CompletionTriggerKind.fromJson(json['triggerKind'])
         : null;
     final triggerCharacter = json['triggerCharacter'];
-    return CompletionContext(triggerKind, triggerCharacter);
+    return CompletionContext(
+        triggerKind: triggerKind, triggerCharacter: triggerCharacter);
   }
 
   /// The trigger character (a single character) that has trigger code complete.
@@ -2111,8 +3537,9 @@
       LspJsonHandler(CompletionItem.canParse, CompletionItem.fromJson);
 
   CompletionItem(
-      this.label,
+      {@required this.label,
       this.kind,
+      this.tags,
       this.detail,
       this.documentation,
       this.deprecated,
@@ -2125,7 +3552,7 @@
       this.additionalTextEdits,
       this.commitCharacters,
       this.command,
-      this.data) {
+      this.data}) {
     if (label == null) {
       throw 'label is required but was not provided';
     }
@@ -2134,6 +3561,10 @@
     final label = json['label'];
     final kind =
         json['kind'] != null ? CompletionItemKind.fromJson(json['kind']) : null;
+    final tags = json['tags']
+        ?.map((item) => item != null ? CompletionItemTag.fromJson(item) : null)
+        ?.cast<CompletionItemTag>()
+        ?.toList();
     final detail = json['detail'];
     final documentation = json['documentation'] is String
         ? Either2<String, MarkupContent>.t1(json['documentation'])
@@ -2166,21 +3597,22 @@
         ? CompletionItemResolutionInfo.fromJson(json['data'])
         : null;
     return CompletionItem(
-        label,
-        kind,
-        detail,
-        documentation,
-        deprecated,
-        preselect,
-        sortText,
-        filterText,
-        insertText,
-        insertTextFormat,
-        textEdit,
-        additionalTextEdits,
-        commitCharacters,
-        command,
-        data);
+        label: label,
+        kind: kind,
+        tags: tags,
+        detail: detail,
+        documentation: documentation,
+        deprecated: deprecated,
+        preselect: preselect,
+        sortText: sortText,
+        filterText: filterText,
+        insertText: insertText,
+        insertTextFormat: insertTextFormat,
+        textEdit: textEdit,
+        additionalTextEdits: additionalTextEdits,
+        commitCharacters: commitCharacters,
+        command: command,
+        data: data);
   }
 
   /// An optional array of additional text edits that are applied when selecting
@@ -2208,6 +3640,8 @@
   final CompletionItemResolutionInfo data;
 
   /// Indicates if this item is deprecated.
+  ///  @deprecated Use `tags` instead if supported.
+  @core.deprecated
   final bool deprecated;
 
   /// A human-readable string with additional information about this item, like
@@ -2233,7 +3667,7 @@
   final String insertText;
 
   /// The format of the insert text. The format applies to both the `insertText`
-  /// property and the `newText` property of a provided `textEdit`. If ommitted
+  /// property and the `newText` property of a provided `textEdit`. If omitted
   /// defaults to `InsertTextFormat.PlainText`.
   final InsertTextFormat insertTextFormat;
 
@@ -2257,6 +3691,10 @@
   /// When `falsy` the label is used.
   final String sortText;
 
+  /// Tags for this completion item.
+  ///  @since 3.15.0
+  final List<CompletionItemTag> tags;
+
   /// An edit which is applied to a document when selecting this completion.
   /// When an edit is provided the value of `insertText` is ignored.
   ///
@@ -2270,6 +3708,9 @@
     if (kind != null) {
       __result['kind'] = kind;
     }
+    if (tags != null) {
+      __result['tags'] = tags;
+    }
     if (detail != null) {
       __result['detail'] = detail;
     }
@@ -2341,6 +3782,18 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('tags');
+      try {
+        if (obj['tags'] != null &&
+            !((obj['tags'] is List &&
+                (obj['tags'].every(
+                    (item) => CompletionItemTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<CompletionItemTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('detail');
       try {
         if (obj['detail'] != null && !(obj['detail'] is String)) {
@@ -2482,6 +3935,8 @@
     if (other is CompletionItem && other.runtimeType == CompletionItem) {
       return label == other.label &&
           kind == other.kind &&
+          listEqual(tags, other.tags,
+              (CompletionItemTag a, CompletionItemTag b) => a == b) &&
           detail == other.detail &&
           documentation == other.documentation &&
           deprecated == other.deprecated &&
@@ -2507,6 +3962,7 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, label.hashCode);
     hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
     hash = JenkinsSmiHash.combine(hash, detail.hashCode);
     hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
     hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
@@ -2575,13 +4031,40 @@
   bool operator ==(Object o) => o is CompletionItemKind && o._value == _value;
 }
 
+/// Completion item tags are extra annotations that tweak the rendering of a
+/// completion item.
+///  @since 3.15.0
+class CompletionItemTag {
+  const CompletionItemTag(this._value);
+  const CompletionItemTag.fromJson(this._value);
+
+  final num _value;
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    return obj is num;
+  }
+
+  /// Render a completion as obsolete, usually using a strike-out.
+  static const Deprecated = CompletionItemTag(1);
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) => o is CompletionItemTag && o._value == _value;
+}
+
 /// Represents a collection of completion items ([CompletionItem]) to be
 /// presented in the editor.
 class CompletionList implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CompletionList.canParse, CompletionList.fromJson);
 
-  CompletionList(this.isIncomplete, this.items) {
+  CompletionList({@required this.isIncomplete, @required this.items}) {
     if (isIncomplete == null) {
       throw 'isIncomplete is required but was not provided';
     }
@@ -2595,7 +4078,7 @@
         ?.map((item) => item != null ? CompletionItem.fromJson(item) : null)
         ?.cast<CompletionItem>()
         ?.toList();
-    return CompletionList(isIncomplete, items);
+    return CompletionList(isIncomplete: isIncomplete, items: items);
   }
 
   /// This list it not complete. Further typing should result in recomputing
@@ -2682,40 +4165,105 @@
 }
 
 /// Completion options.
-class CompletionOptions implements ToJsonable {
+class CompletionOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CompletionOptions.canParse, CompletionOptions.fromJson);
 
-  CompletionOptions(this.resolveProvider, this.triggerCharacters);
+  CompletionOptions(
+      {this.triggerCharacters,
+      this.allCommitCharacters,
+      this.resolveProvider,
+      this.workDoneProgress});
   static CompletionOptions fromJson(Map<String, dynamic> json) {
-    final resolveProvider = json['resolveProvider'];
+    if (CompletionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return CompletionRegistrationOptions.fromJson(json);
+    }
     final triggerCharacters = json['triggerCharacters']
         ?.map((item) => item)
         ?.cast<String>()
         ?.toList();
-    return CompletionOptions(resolveProvider, triggerCharacters);
+    final allCommitCharacters = json['allCommitCharacters']
+        ?.map((item) => item)
+        ?.cast<String>()
+        ?.toList();
+    final resolveProvider = json['resolveProvider'];
+    final workDoneProgress = json['workDoneProgress'];
+    return CompletionOptions(
+        triggerCharacters: triggerCharacters,
+        allCommitCharacters: allCommitCharacters,
+        resolveProvider: resolveProvider,
+        workDoneProgress: workDoneProgress);
   }
 
+  /// The list of all possible characters that commit a completion. This field
+  /// can be used if clients don't support individual commit characters per
+  /// completion item. See
+  /// `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`.
+  ///
+  /// If a server provides both `allCommitCharacters` and commit characters on
+  /// an individual completion item the ones on the completion item win.
+  ///  @since 3.2.0
+  final List<String> allCommitCharacters;
+
   /// The server provides support to resolve additional information for a
   /// completion item.
   final bool resolveProvider;
 
-  /// The characters that trigger completion automatically.
+  /// Most tools trigger completion request automatically without explicitly
+  /// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they
+  /// do so when the user starts to type an identifier. For example if the user
+  /// types `c` in a JavaScript file code complete will automatically pop up
+  /// present `console` besides others as a completion item. Characters that
+  /// make up identifiers don't need to be listed here.
+  ///
+  /// If code complete should automatically be trigger on characters not being
+  /// valid inside an identifier (for example `.` in JavaScript) list them in
+  /// `triggerCharacters`.
   final List<String> triggerCharacters;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    if (triggerCharacters != null) {
+      __result['triggerCharacters'] = triggerCharacters;
+    }
+    if (allCommitCharacters != null) {
+      __result['allCommitCharacters'] = allCommitCharacters;
+    }
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
-    if (triggerCharacters != null) {
-      __result['triggerCharacters'] = triggerCharacters;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
     }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
+      reporter.push('triggerCharacters');
+      try {
+        if (obj['triggerCharacters'] != null &&
+            !((obj['triggerCharacters'] is List &&
+                (obj['triggerCharacters'].every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('allCommitCharacters');
+      try {
+        if (obj['allCommitCharacters'] != null &&
+            !((obj['allCommitCharacters'] is List &&
+                (obj['allCommitCharacters']
+                    .every((item) => item is String))))) {
+          reporter.reportError('must be of type List<String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('resolveProvider');
       try {
         if (obj['resolveProvider'] != null &&
@@ -2726,12 +4274,11 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('triggerCharacters');
+      reporter.push('workDoneProgress');
       try {
-        if (obj['triggerCharacters'] != null &&
-            !((obj['triggerCharacters'] is List &&
-                (obj['triggerCharacters'].every((item) => item is String))))) {
-          reporter.reportError('must be of type List<String>');
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -2747,9 +4294,12 @@
   @override
   bool operator ==(Object other) {
     if (other is CompletionOptions && other.runtimeType == CompletionOptions) {
-      return resolveProvider == other.resolveProvider &&
-          listEqual(triggerCharacters, other.triggerCharacters,
+      return listEqual(triggerCharacters, other.triggerCharacters,
               (String a, String b) => a == b) &&
+          listEqual(allCommitCharacters, other.allCommitCharacters,
+              (String a, String b) => a == b) &&
+          resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -2758,8 +4308,10 @@
   @override
   int get hashCode {
     var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(triggerCharacters));
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(allCommitCharacters));
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -2767,11 +4319,21 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class CompletionParams implements TextDocumentPositionParams, ToJsonable {
+class CompletionParams
+    implements
+        TextDocumentPositionParams,
+        WorkDoneProgressParams,
+        PartialResultParams,
+        ToJsonable {
   static const jsonHandler =
       LspJsonHandler(CompletionParams.canParse, CompletionParams.fromJson);
 
-  CompletionParams(this.context, this.textDocument, this.position) {
+  CompletionParams(
+      {this.context,
+      @required this.textDocument,
+      @required this.position,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -2788,7 +4350,26 @@
         : null;
     final position =
         json['position'] != null ? Position.fromJson(json['position']) : null;
-    return CompletionParams(context, textDocument, position);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return CompletionParams(
+        context: context,
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
   /// The completion context. This is only available if the client specifies to
@@ -2796,12 +4377,19 @@
   /// === true`
   final CompletionContext context;
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The position inside the text document.
   final Position position;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     if (context != null) {
@@ -2811,6 +4399,12 @@
         textDocument ?? (throw 'textDocument is required but was not set');
     __result['position'] =
         position ?? (throw 'position is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -2860,6 +4454,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type CompletionParams');
@@ -2873,6 +4489,8 @@
       return context == other.context &&
           textDocument == other.textDocument &&
           position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -2884,6 +4502,8 @@
     hash = JenkinsSmiHash.combine(hash, context.hashCode);
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -2892,14 +4512,22 @@
 }
 
 class CompletionRegistrationOptions
-    implements TextDocumentRegistrationOptions, ToJsonable {
+    implements TextDocumentRegistrationOptions, CompletionOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       CompletionRegistrationOptions.canParse,
       CompletionRegistrationOptions.fromJson);
 
-  CompletionRegistrationOptions(this.triggerCharacters,
-      this.allCommitCharacters, this.resolveProvider, this.documentSelector);
+  CompletionRegistrationOptions(
+      {this.documentSelector,
+      this.triggerCharacters,
+      this.allCommitCharacters,
+      this.resolveProvider,
+      this.workDoneProgress});
   static CompletionRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
     final triggerCharacters = json['triggerCharacters']
         ?.map((item) => item)
         ?.cast<String>()
@@ -2909,23 +4537,23 @@
         ?.cast<String>()
         ?.toList();
     final resolveProvider = json['resolveProvider'];
-    final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
-        ?.cast<DocumentFilter>()
-        ?.toList();
-    return CompletionRegistrationOptions(triggerCharacters, allCommitCharacters,
-        resolveProvider, documentSelector);
+    final workDoneProgress = json['workDoneProgress'];
+    return CompletionRegistrationOptions(
+        documentSelector: documentSelector,
+        triggerCharacters: triggerCharacters,
+        allCommitCharacters: allCommitCharacters,
+        resolveProvider: resolveProvider,
+        workDoneProgress: workDoneProgress);
   }
 
   /// The list of all possible characters that commit a completion. This field
-  /// can be used if clients don't support individual commmit characters per
+  /// can be used if clients don't support individual commit characters per
   /// completion item. See
   /// `ClientCapabilities.textDocument.completion.completionItem.commitCharactersSupport`.
   ///
   /// If a server provides both `allCommitCharacters` and commit characters on
   /// an individual completion item the ones on the completion item win.
-  ///
-  /// Since 3.2.0
+  ///  @since 3.2.0
   final List<String> allCommitCharacters;
 
   /// A document selector to identify the scope of the registration. If set to
@@ -2947,9 +4575,11 @@
   /// valid inside an identifier (for example `.` in JavaScript) list them in
   /// `triggerCharacters`.
   final List<String> triggerCharacters;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
     if (triggerCharacters != null) {
       __result['triggerCharacters'] = triggerCharacters;
     }
@@ -2959,12 +4589,30 @@
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
-    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('triggerCharacters');
       try {
         if (obj['triggerCharacters'] != null &&
@@ -2998,17 +4646,11 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentSelector');
+      reporter.push('workDoneProgress');
       try {
-        if (!obj.containsKey('documentSelector')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        if (obj['documentSelector'] != null &&
-            !((obj['documentSelector'] is List &&
-                (obj['documentSelector'].every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
           return false;
         }
       } finally {
@@ -3025,13 +4667,14 @@
   bool operator ==(Object other) {
     if (other is CompletionRegistrationOptions &&
         other.runtimeType == CompletionRegistrationOptions) {
-      return listEqual(triggerCharacters, other.triggerCharacters,
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          listEqual(triggerCharacters, other.triggerCharacters,
               (String a, String b) => a == b) &&
           listEqual(allCommitCharacters, other.allCommitCharacters,
               (String a, String b) => a == b) &&
           resolveProvider == other.resolveProvider &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -3040,10 +4683,11 @@
   @override
   int get hashCode {
     var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
     hash = JenkinsSmiHash.combine(hash, lspHashCode(triggerCharacters));
     hash = JenkinsSmiHash.combine(hash, lspHashCode(allCommitCharacters));
     hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -3095,11 +4739,11 @@
   static const jsonHandler =
       LspJsonHandler(ConfigurationItem.canParse, ConfigurationItem.fromJson);
 
-  ConfigurationItem(this.scopeUri, this.section);
+  ConfigurationItem({this.scopeUri, this.section});
   static ConfigurationItem fromJson(Map<String, dynamic> json) {
     final scopeUri = json['scopeUri'];
     final section = json['section'];
-    return ConfigurationItem(scopeUri, section);
+    return ConfigurationItem(scopeUri: scopeUri, section: section);
   }
 
   /// The scope to get the configuration section for.
@@ -3170,7 +4814,7 @@
   static const jsonHandler = LspJsonHandler(
       ConfigurationParams.canParse, ConfigurationParams.fromJson);
 
-  ConfigurationParams(this.items) {
+  ConfigurationParams({@required this.items}) {
     if (items == null) {
       throw 'items is required but was not provided';
     }
@@ -3180,7 +4824,7 @@
         ?.map((item) => item != null ? ConfigurationItem.fromJson(item) : null)
         ?.cast<ConfigurationItem>()
         ?.toList();
-    return ConfigurationParams(items);
+    return ConfigurationParams(items: items);
   }
 
   final List<ConfigurationItem> items;
@@ -3246,7 +4890,7 @@
   static const jsonHandler =
       LspJsonHandler(CreateFile.canParse, CreateFile.fromJson);
 
-  CreateFile(this.kind, this.uri, this.options) {
+  CreateFile({@required this.kind, @required this.uri, this.options}) {
     if (kind == null) {
       throw 'kind is required but was not provided';
     }
@@ -3260,7 +4904,7 @@
     final options = json['options'] != null
         ? CreateFileOptions.fromJson(json['options'])
         : null;
-    return CreateFile(kind, uri, options);
+    return CreateFile(kind: kind, uri: uri, options: options);
   }
 
   /// A create
@@ -3364,11 +5008,12 @@
   static const jsonHandler =
       LspJsonHandler(CreateFileOptions.canParse, CreateFileOptions.fromJson);
 
-  CreateFileOptions(this.overwrite, this.ignoreIfExists);
+  CreateFileOptions({this.overwrite, this.ignoreIfExists});
   static CreateFileOptions fromJson(Map<String, dynamic> json) {
     final overwrite = json['overwrite'];
     final ignoreIfExists = json['ignoreIfExists'];
-    return CreateFileOptions(overwrite, ignoreIfExists);
+    return CreateFileOptions(
+        overwrite: overwrite, ignoreIfExists: ignoreIfExists);
   }
 
   /// Ignore if exists.
@@ -3437,12 +5082,840 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class DeclarationClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DeclarationClientCapabilities.canParse,
+      DeclarationClientCapabilities.fromJson);
+
+  DeclarationClientCapabilities({this.dynamicRegistration, this.linkSupport});
+  static DeclarationClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return DeclarationClientCapabilities(
+        dynamicRegistration: dynamicRegistration, linkSupport: linkSupport);
+  }
+
+  /// Whether declaration supports dynamic registration. If this is set to
+  /// `true` the client supports the new `DeclarationRegistrationOptions` return
+  /// value for the corresponding server capability as well.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of declaration links.
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('linkSupport');
+      try {
+        if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DeclarationClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DeclarationClientCapabilities &&
+        other.runtimeType == DeclarationClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DeclarationOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(DeclarationOptions.canParse, DeclarationOptions.fromJson);
+
+  DeclarationOptions({this.workDoneProgress});
+  static DeclarationOptions fromJson(Map<String, dynamic> json) {
+    if (DeclarationRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DeclarationRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DeclarationOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DeclarationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DeclarationOptions &&
+        other.runtimeType == DeclarationOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DeclarationParams
+    implements
+        TextDocumentPositionParams,
+        WorkDoneProgressParams,
+        PartialResultParams,
+        ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(DeclarationParams.canParse, DeclarationParams.fromJson);
+
+  DeclarationParams(
+      {@required this.textDocument,
+      @required this.position,
+      this.workDoneToken,
+      this.partialResultToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
+  }
+  static DeclarationParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return DeclarationParams(
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['position'] =
+        position ?? (throw 'position is required but was not set');
+    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, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DeclarationParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DeclarationParams && other.runtimeType == DeclarationParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DeclarationRegistrationOptions
+    implements
+        DeclarationOptions,
+        TextDocumentRegistrationOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DeclarationRegistrationOptions.canParse,
+      DeclarationRegistrationOptions.fromJson);
+
+  DeclarationRegistrationOptions(
+      {this.workDoneProgress, this.documentSelector, this.id});
+  static DeclarationRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final workDoneProgress = json['workDoneProgress'];
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final id = json['id'];
+    return DeclarationRegistrationOptions(
+        workDoneProgress: workDoneProgress,
+        documentSelector: documentSelector,
+        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;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String id;
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    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, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        if (obj['id'] != null && !(obj['id'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DeclarationRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  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) &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DefinitionClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DefinitionClientCapabilities.canParse,
+      DefinitionClientCapabilities.fromJson);
+
+  DefinitionClientCapabilities({this.dynamicRegistration, this.linkSupport});
+  static DefinitionClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return DefinitionClientCapabilities(
+        dynamicRegistration: dynamicRegistration, linkSupport: linkSupport);
+  }
+
+  /// Whether definition supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of definition links.
+  ///  @since 3.14.0
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('linkSupport');
+      try {
+        if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DefinitionClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DefinitionClientCapabilities &&
+        other.runtimeType == DefinitionClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DefinitionOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(DefinitionOptions.canParse, DefinitionOptions.fromJson);
+
+  DefinitionOptions({this.workDoneProgress});
+  static DefinitionOptions fromJson(Map<String, dynamic> json) {
+    if (DefinitionRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DefinitionRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DefinitionOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DefinitionOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DefinitionOptions && other.runtimeType == DefinitionOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DefinitionParams
+    implements
+        TextDocumentPositionParams,
+        WorkDoneProgressParams,
+        PartialResultParams,
+        ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(DefinitionParams.canParse, DefinitionParams.fromJson);
+
+  DefinitionParams(
+      {@required this.textDocument,
+      @required this.position,
+      this.workDoneToken,
+      this.partialResultToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
+  }
+  static DefinitionParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return DefinitionParams(
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['position'] =
+        position ?? (throw 'position is required but was not set');
+    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, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DefinitionParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DefinitionParams && other.runtimeType == DefinitionParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DefinitionRegistrationOptions
+    implements TextDocumentRegistrationOptions, DefinitionOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DefinitionRegistrationOptions.canParse,
+      DefinitionRegistrationOptions.fromJson);
+
+  DefinitionRegistrationOptions({this.documentSelector, this.workDoneProgress});
+  static DefinitionRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return DefinitionRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DefinitionRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DefinitionRegistrationOptions &&
+        other.runtimeType == DefinitionRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Delete file operation
 class DeleteFile implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(DeleteFile.canParse, DeleteFile.fromJson);
 
-  DeleteFile(this.kind, this.uri, this.options) {
+  DeleteFile({@required this.kind, @required this.uri, this.options}) {
     if (kind == null) {
       throw 'kind is required but was not provided';
     }
@@ -3456,7 +5929,7 @@
     final options = json['options'] != null
         ? DeleteFileOptions.fromJson(json['options'])
         : null;
-    return DeleteFile(kind, uri, options);
+    return DeleteFile(kind: kind, uri: uri, options: options);
   }
 
   /// A delete
@@ -3560,11 +6033,12 @@
   static const jsonHandler =
       LspJsonHandler(DeleteFileOptions.canParse, DeleteFileOptions.fromJson);
 
-  DeleteFileOptions(this.recursive, this.ignoreIfNotExists);
+  DeleteFileOptions({this.recursive, this.ignoreIfNotExists});
   static DeleteFileOptions fromJson(Map<String, dynamic> json) {
     final recursive = json['recursive'];
     final ignoreIfNotExists = json['ignoreIfNotExists'];
-    return DeleteFileOptions(recursive, ignoreIfNotExists);
+    return DeleteFileOptions(
+        recursive: recursive, ignoreIfNotExists: ignoreIfNotExists);
   }
 
   /// Ignore the operation if the file doesn't exist.
@@ -3638,8 +6112,14 @@
   static const jsonHandler =
       LspJsonHandler(Diagnostic.canParse, Diagnostic.fromJson);
 
-  Diagnostic(this.range, this.severity, this.code, this.source, this.message,
-      this.relatedInformation) {
+  Diagnostic(
+      {@required this.range,
+      this.severity,
+      this.code,
+      this.source,
+      @required this.message,
+      this.tags,
+      this.relatedInformation}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -3655,13 +6135,23 @@
     final code = json['code'];
     final source = json['source'];
     final message = json['message'];
+    final tags = json['tags']
+        ?.map((item) => item != null ? DiagnosticTag.fromJson(item) : null)
+        ?.cast<DiagnosticTag>()
+        ?.toList();
     final relatedInformation = json['relatedInformation']
         ?.map((item) =>
             item != null ? DiagnosticRelatedInformation.fromJson(item) : null)
         ?.cast<DiagnosticRelatedInformation>()
         ?.toList();
     return Diagnostic(
-        range, severity, code, source, message, relatedInformation);
+        range: range,
+        severity: severity,
+        code: code,
+        source: source,
+        message: message,
+        tags: tags,
+        relatedInformation: relatedInformation);
   }
 
   /// The diagnostic's code, which might appear in the user interface.
@@ -3685,6 +6175,10 @@
   /// 'typescript' or 'super lint'.
   final String source;
 
+  /// Additional metadata about the diagnostic.
+  ///  @since 3.15.0
+  final List<DiagnosticTag> tags;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['range'] = range ?? (throw 'range is required but was not set');
@@ -3699,6 +6193,9 @@
     }
     __result['message'] =
         message ?? (throw 'message is required but was not set');
+    if (tags != null) {
+      __result['tags'] = tags;
+    }
     if (relatedInformation != null) {
       __result['relatedInformation'] = relatedInformation;
     }
@@ -3769,6 +6266,18 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('tags');
+      try {
+        if (obj['tags'] != null &&
+            !((obj['tags'] is List &&
+                (obj['tags'].every(
+                    (item) => DiagnosticTag.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DiagnosticTag>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('relatedInformation');
       try {
         if (obj['relatedInformation'] != null &&
@@ -3798,6 +6307,8 @@
           source == other.source &&
           message == other.message &&
           listEqual(
+              tags, other.tags, (DiagnosticTag a, DiagnosticTag b) => a == b) &&
+          listEqual(
               relatedInformation,
               other.relatedInformation,
               (DiagnosticRelatedInformation a,
@@ -3816,6 +6327,7 @@
     hash = JenkinsSmiHash.combine(hash, code.hashCode);
     hash = JenkinsSmiHash.combine(hash, source.hashCode);
     hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(tags));
     hash = JenkinsSmiHash.combine(hash, lspHashCode(relatedInformation));
     return JenkinsSmiHash.finish(hash);
   }
@@ -3825,14 +6337,15 @@
 }
 
 /// Represents a related message and source code location for a diagnostic. This
-/// should be used to point to code locations that cause or related to a
+/// should be used to point to code locations that cause or are related to a
 /// diagnostics, e.g when duplicating a symbol in a scope.
 class DiagnosticRelatedInformation implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DiagnosticRelatedInformation.canParse,
       DiagnosticRelatedInformation.fromJson);
 
-  DiagnosticRelatedInformation(this.location, this.message) {
+  DiagnosticRelatedInformation(
+      {@required this.location, @required this.message}) {
     if (location == null) {
       throw 'location is required but was not provided';
     }
@@ -3844,7 +6357,7 @@
     final location =
         json['location'] != null ? Location.fromJson(json['location']) : null;
     final message = json['message'];
-    return DiagnosticRelatedInformation(location, message);
+    return DiagnosticRelatedInformation(location: location, message: message);
   }
 
   /// The location of this related diagnostic information.
@@ -3959,15 +6472,113 @@
   bool operator ==(Object o) => o is DiagnosticSeverity && o._value == _value;
 }
 
+/// The diagnostic tags.
+///  @since 3.15.0
+class DiagnosticTag {
+  const DiagnosticTag(this._value);
+  const DiagnosticTag.fromJson(this._value);
+
+  final num _value;
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    return obj is num;
+  }
+
+  /// Unused or unnecessary code.
+  ///
+  /// Clients are allowed to render diagnostics with this tag faded out instead
+  /// of having an error squiggle.
+  static const Unnecessary = DiagnosticTag(1);
+
+  /// Deprecated or obsolete code.
+  ///
+  /// Clients are allowed to rendered diagnostics with this tag strike through.
+  static const Deprecated = DiagnosticTag(2);
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  int get hashCode => _value.hashCode;
+
+  bool operator ==(Object o) => o is DiagnosticTag && o._value == _value;
+}
+
+class DidChangeConfigurationClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DidChangeConfigurationClientCapabilities.canParse,
+      DidChangeConfigurationClientCapabilities.fromJson);
+
+  DidChangeConfigurationClientCapabilities({this.dynamicRegistration});
+  static DidChangeConfigurationClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DidChangeConfigurationClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Did change configuration notification supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type DidChangeConfigurationClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DidChangeConfigurationClientCapabilities &&
+        other.runtimeType == DidChangeConfigurationClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidChangeConfigurationParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DidChangeConfigurationParams.canParse,
       DidChangeConfigurationParams.fromJson);
 
-  DidChangeConfigurationParams(this.settings);
+  DidChangeConfigurationParams({this.settings});
   static DidChangeConfigurationParams fromJson(Map<String, dynamic> json) {
     final settings = json['settings'];
-    return DidChangeConfigurationParams(settings);
+    return DidChangeConfigurationParams(settings: settings);
   }
 
   /// The actual changed settings
@@ -4026,7 +6637,8 @@
       DidChangeTextDocumentParams.canParse,
       DidChangeTextDocumentParams.fromJson);
 
-  DidChangeTextDocumentParams(this.textDocument, this.contentChanges) {
+  DidChangeTextDocumentParams(
+      {@required this.textDocument, @required this.contentChanges}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -4039,17 +6651,42 @@
         ? VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final contentChanges = json['contentChanges']
-        ?.map((item) =>
-            item != null ? TextDocumentContentChangeEvent.fromJson(item) : null)
-        ?.cast<TextDocumentContentChangeEvent>()
+        ?.map((item) => TextDocumentContentChangeEvent1.canParse(
+                item, nullLspJsonReporter)
+            ? Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>.t1(
+                item != null
+                    ? TextDocumentContentChangeEvent1.fromJson(item)
+                    : null)
+            : (TextDocumentContentChangeEvent2.canParse(item, nullLspJsonReporter)
+                ? Either2<TextDocumentContentChangeEvent1,
+                        TextDocumentContentChangeEvent2>.t2(
+                    item != null
+                        ? TextDocumentContentChangeEvent2.fromJson(item)
+                        : null)
+                : (throw '''${item} was not one of (TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2)''')))
+        ?.cast<Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>>()
         ?.toList();
-    return DidChangeTextDocumentParams(textDocument, contentChanges);
+    return DidChangeTextDocumentParams(
+        textDocument: textDocument, contentChanges: contentChanges);
   }
 
   /// The actual content changes. The content changes describe single state
-  /// changes to the document. So if there are two content changes c1 and c2 for
-  /// a document in state S then c1 move the document to S' and c2 to S''.
-  final List<TextDocumentContentChangeEvent> contentChanges;
+  /// changes to the document. So if there are two content changes c1 (at array
+  /// index 0) and c2 (at array index 1) for a document in state S then c1 moves
+  /// the document from S to S' and c2 from S' to S''. So c1 is computed on the
+  /// state S and c2 is computed on the state S'.
+  ///
+  /// To mirror the content of a document using change events use the following
+  /// approach:
+  /// - start with the same initial content
+  /// - apply the 'textDocument/didChange' notifications in the order you
+  /// recevie them.
+  /// - apply the `TextDocumentContentChangeEvent`s in a single notification in
+  /// the order
+  ///   you receive them.
+  final List<
+      Either2<TextDocumentContentChangeEvent1,
+          TextDocumentContentChangeEvent2>> contentChanges;
 
   /// The document that did change. The version number points to the version
   /// after all provided content changes have been applied.
@@ -4097,9 +6734,11 @@
         }
         if (!((obj['contentChanges'] is List &&
             (obj['contentChanges'].every((item) =>
-                TextDocumentContentChangeEvent.canParse(item, reporter)))))) {
+                (TextDocumentContentChangeEvent1.canParse(item, reporter) ||
+                    TextDocumentContentChangeEvent2.canParse(
+                        item, reporter))))))) {
           reporter.reportError(
-              'must be of type List<TextDocumentContentChangeEvent>');
+              'must be of type List<Either2<TextDocumentContentChangeEvent1, TextDocumentContentChangeEvent2>>');
           return false;
         }
       } finally {
@@ -4120,8 +6759,12 @@
           listEqual(
               contentChanges,
               other.contentChanges,
-              (TextDocumentContentChangeEvent a,
-                      TextDocumentContentChangeEvent b) =>
+              (Either2<TextDocumentContentChangeEvent1,
+                              TextDocumentContentChangeEvent2>
+                          a,
+                      Either2<TextDocumentContentChangeEvent1,
+                              TextDocumentContentChangeEvent2>
+                          b) =>
                   a == b) &&
           true;
     }
@@ -4140,12 +6783,78 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class DidChangeWatchedFilesClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DidChangeWatchedFilesClientCapabilities.canParse,
+      DidChangeWatchedFilesClientCapabilities.fromJson);
+
+  DidChangeWatchedFilesClientCapabilities({this.dynamicRegistration});
+  static DidChangeWatchedFilesClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DidChangeWatchedFilesClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Did change watched files notification supports dynamic registration.
+  /// Please note that the current protocol doesn't support static configuration
+  /// for file changes from the server side.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type DidChangeWatchedFilesClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DidChangeWatchedFilesClientCapabilities &&
+        other.runtimeType == DidChangeWatchedFilesClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DidChangeWatchedFilesParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DidChangeWatchedFilesParams.canParse,
       DidChangeWatchedFilesParams.fromJson);
 
-  DidChangeWatchedFilesParams(this.changes) {
+  DidChangeWatchedFilesParams({@required this.changes}) {
     if (changes == null) {
       throw 'changes is required but was not provided';
     }
@@ -4155,7 +6864,7 @@
         ?.map((item) => item != null ? FileEvent.fromJson(item) : null)
         ?.cast<FileEvent>()
         ?.toList();
-    return DidChangeWatchedFilesParams(changes);
+    return DidChangeWatchedFilesParams(changes: changes);
   }
 
   /// The actual file events.
@@ -4224,7 +6933,7 @@
       DidChangeWatchedFilesRegistrationOptions.canParse,
       DidChangeWatchedFilesRegistrationOptions.fromJson);
 
-  DidChangeWatchedFilesRegistrationOptions(this.watchers) {
+  DidChangeWatchedFilesRegistrationOptions({@required this.watchers}) {
     if (watchers == null) {
       throw 'watchers is required but was not provided';
     }
@@ -4235,7 +6944,7 @@
         ?.map((item) => item != null ? FileSystemWatcher.fromJson(item) : null)
         ?.cast<FileSystemWatcher>()
         ?.toList();
-    return DidChangeWatchedFilesRegistrationOptions(watchers);
+    return DidChangeWatchedFilesRegistrationOptions(watchers: watchers);
   }
 
   /// The watchers to register.
@@ -4304,7 +7013,7 @@
       DidChangeWorkspaceFoldersParams.canParse,
       DidChangeWorkspaceFoldersParams.fromJson);
 
-  DidChangeWorkspaceFoldersParams(this.event) {
+  DidChangeWorkspaceFoldersParams({@required this.event}) {
     if (event == null) {
       throw 'event is required but was not provided';
     }
@@ -4313,7 +7022,7 @@
     final event = json['event'] != null
         ? WorkspaceFoldersChangeEvent.fromJson(json['event'])
         : null;
-    return DidChangeWorkspaceFoldersParams(event);
+    return DidChangeWorkspaceFoldersParams(event: event);
   }
 
   /// The actual workspace folder change event.
@@ -4375,7 +7084,7 @@
   static const jsonHandler = LspJsonHandler(
       DidCloseTextDocumentParams.canParse, DidCloseTextDocumentParams.fromJson);
 
-  DidCloseTextDocumentParams(this.textDocument) {
+  DidCloseTextDocumentParams({@required this.textDocument}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -4384,7 +7093,7 @@
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    return DidCloseTextDocumentParams(textDocument);
+    return DidCloseTextDocumentParams(textDocument: textDocument);
   }
 
   /// The document that was closed.
@@ -4447,7 +7156,7 @@
   static const jsonHandler = LspJsonHandler(
       DidOpenTextDocumentParams.canParse, DidOpenTextDocumentParams.fromJson);
 
-  DidOpenTextDocumentParams(this.textDocument) {
+  DidOpenTextDocumentParams({@required this.textDocument}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -4456,7 +7165,7 @@
     final textDocument = json['textDocument'] != null
         ? TextDocumentItem.fromJson(json['textDocument'])
         : null;
-    return DidOpenTextDocumentParams(textDocument);
+    return DidOpenTextDocumentParams(textDocument: textDocument);
   }
 
   /// The document that was opened.
@@ -4519,7 +7228,7 @@
   static const jsonHandler = LspJsonHandler(
       DidSaveTextDocumentParams.canParse, DidSaveTextDocumentParams.fromJson);
 
-  DidSaveTextDocumentParams(this.textDocument, this.text) {
+  DidSaveTextDocumentParams({@required this.textDocument, this.text}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -4529,7 +7238,7 @@
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final text = json['text'];
-    return DidSaveTextDocumentParams(textDocument, text);
+    return DidSaveTextDocumentParams(textDocument: textDocument, text: text);
   }
 
   /// Optional the content when saved. Depends on the includeText value when the
@@ -4605,16 +7314,389 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class DocumentColorClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentColorClientCapabilities.canParse,
+      DocumentColorClientCapabilities.fromJson);
+
+  DocumentColorClientCapabilities({this.dynamicRegistration});
+  static DocumentColorClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DocumentColorClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether document color supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentColorClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentColorClientCapabilities &&
+        other.runtimeType == DocumentColorClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentColorOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentColorOptions.canParse, DocumentColorOptions.fromJson);
+
+  DocumentColorOptions({this.workDoneProgress});
+  static DocumentColorOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentColorRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentColorRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentColorOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentColorOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentColorOptions &&
+        other.runtimeType == DocumentColorOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentColorParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentColorParams.canParse, DocumentColorParams.fromJson);
+
+  DocumentColorParams(
+      {@required this.textDocument,
+      this.workDoneToken,
+      this.partialResultToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+  }
+  static DocumentColorParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return DocumentColorParams(
+        textDocument: textDocument,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    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, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentColorParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentColorParams &&
+        other.runtimeType == DocumentColorParams) {
+      return textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentColorRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        StaticRegistrationOptions,
+        DocumentColorOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentColorRegistrationOptions.canParse,
+      DocumentColorRegistrationOptions.fromJson);
+
+  DocumentColorRegistrationOptions(
+      {this.documentSelector, this.id, this.workDoneProgress});
+  static DocumentColorRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final id = json['id'];
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentColorRegistrationOptions(
+        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;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String id;
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __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, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        if (obj['id'] != null && !(obj['id'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentColorRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentColorRegistrationOptions &&
+        other.runtimeType == DocumentColorRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          id == other.id &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DocumentFilter implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(DocumentFilter.canParse, DocumentFilter.fromJson);
 
-  DocumentFilter(this.language, this.scheme, this.pattern);
+  DocumentFilter({this.language, this.scheme, this.pattern});
   static DocumentFilter fromJson(Map<String, dynamic> json) {
     final language = json['language'];
     final scheme = json['scheme'];
     final pattern = json['pattern'];
-    return DocumentFilter(language, scheme, pattern);
+    return DocumentFilter(language: language, scheme: scheme, pattern: pattern);
   }
 
   /// A language id, like `typescript`.
@@ -4712,11 +7794,141 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentFormattingParams implements ToJsonable {
+class DocumentFormattingClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentFormattingClientCapabilities.canParse,
+      DocumentFormattingClientCapabilities.fromJson);
+
+  DocumentFormattingClientCapabilities({this.dynamicRegistration});
+  static DocumentFormattingClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DocumentFormattingClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether formatting supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type DocumentFormattingClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentFormattingClientCapabilities &&
+        other.runtimeType == DocumentFormattingClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentFormattingOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentFormattingOptions.canParse, DocumentFormattingOptions.fromJson);
+
+  DocumentFormattingOptions({this.workDoneProgress});
+  static DocumentFormattingOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentFormattingRegistrationOptions.canParse(
+        json, nullLspJsonReporter)) {
+      return DocumentFormattingRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentFormattingOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentFormattingOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentFormattingOptions &&
+        other.runtimeType == DocumentFormattingOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentFormattingParams implements WorkDoneProgressParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentFormattingParams.canParse, DocumentFormattingParams.fromJson);
 
-  DocumentFormattingParams(this.textDocument, this.options) {
+  DocumentFormattingParams(
+      {@required this.textDocument,
+      @required this.options,
+      this.workDoneToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -4731,7 +7943,17 @@
     final options = json['options'] != null
         ? FormattingOptions.fromJson(json['options'])
         : null;
-    return DocumentFormattingParams(textDocument, options);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    return DocumentFormattingParams(
+        textDocument: textDocument,
+        options: options,
+        workDoneToken: workDoneToken);
   }
 
   /// The format options.
@@ -4740,12 +7962,18 @@
   /// The document to format.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
     __result['options'] =
         options ?? (throw 'options is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -4785,6 +8013,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentFormattingParams');
@@ -4798,6 +8037,7 @@
         other.runtimeType == DocumentFormattingParams) {
       return textDocument == other.textDocument &&
           options == other.options &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -4808,6 +8048,103 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentFormattingRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        DocumentFormattingOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentFormattingRegistrationOptions.canParse,
+      DocumentFormattingRegistrationOptions.fromJson);
+
+  DocumentFormattingRegistrationOptions(
+      {this.documentSelector, this.workDoneProgress});
+  static DocumentFormattingRegistrationOptions fromJson(
+      Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentFormattingRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type DocumentFormattingRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentFormattingRegistrationOptions &&
+        other.runtimeType == DocumentFormattingRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -4822,7 +8159,7 @@
   static const jsonHandler =
       LspJsonHandler(DocumentHighlight.canParse, DocumentHighlight.fromJson);
 
-  DocumentHighlight(this.range, this.kind) {
+  DocumentHighlight({@required this.range, this.kind}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -4832,7 +8169,7 @@
     final kind = json['kind'] != null
         ? DocumentHighlightKind.fromJson(json['kind'])
         : null;
-    return DocumentHighlight(range, kind);
+    return DocumentHighlight(range: range, kind: kind);
   }
 
   /// The highlight kind, default is DocumentHighlightKind.Text.
@@ -4906,6 +8243,70 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class DocumentHighlightClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentHighlightClientCapabilities.canParse,
+      DocumentHighlightClientCapabilities.fromJson);
+
+  DocumentHighlightClientCapabilities({this.dynamicRegistration});
+  static DocumentHighlightClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DocumentHighlightClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether document highlight supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type DocumentHighlightClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentHighlightClientCapabilities &&
+        other.runtimeType == DocumentHighlightClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// A document highlight kind.
 class DocumentHighlightKind {
   const DocumentHighlightKind(this._value);
@@ -4938,13 +8339,340 @@
       o is DocumentHighlightKind && o._value == _value;
 }
 
+class DocumentHighlightOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentHighlightOptions.canParse, DocumentHighlightOptions.fromJson);
+
+  DocumentHighlightOptions({this.workDoneProgress});
+  static DocumentHighlightOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentHighlightRegistrationOptions.canParse(
+        json, nullLspJsonReporter)) {
+      return DocumentHighlightRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentHighlightOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentHighlightOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentHighlightOptions &&
+        other.runtimeType == DocumentHighlightOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentHighlightParams
+    implements
+        TextDocumentPositionParams,
+        WorkDoneProgressParams,
+        PartialResultParams,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentHighlightParams.canParse, DocumentHighlightParams.fromJson);
+
+  DocumentHighlightParams(
+      {@required this.textDocument,
+      @required this.position,
+      this.workDoneToken,
+      this.partialResultToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
+  }
+  static DocumentHighlightParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return DocumentHighlightParams(
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['position'] =
+        position ?? (throw 'position is required but was not set');
+    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, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentHighlightParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentHighlightParams &&
+        other.runtimeType == DocumentHighlightParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentHighlightRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        DocumentHighlightOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentHighlightRegistrationOptions.canParse,
+      DocumentHighlightRegistrationOptions.fromJson);
+
+  DocumentHighlightRegistrationOptions(
+      {this.documentSelector, this.workDoneProgress});
+  static DocumentHighlightRegistrationOptions fromJson(
+      Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentHighlightRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type DocumentHighlightRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentHighlightRegistrationOptions &&
+        other.runtimeType == DocumentHighlightRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// A document link is a range in a text document that links to an internal or
 /// external resource, like another text document or a web site.
 class DocumentLink implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(DocumentLink.canParse, DocumentLink.fromJson);
 
-  DocumentLink(this.range, this.target, this.data) {
+  DocumentLink({@required this.range, this.target, this.tooltip, this.data}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -4952,8 +8680,10 @@
   static DocumentLink fromJson(Map<String, dynamic> json) {
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final target = json['target'];
+    final tooltip = json['tooltip'];
     final data = json['data'];
-    return DocumentLink(range, target, data);
+    return DocumentLink(
+        range: range, target: target, tooltip: tooltip, data: data);
   }
 
   /// A data entry field that is preserved on a document link between a
@@ -4966,12 +8696,24 @@
   /// The uri this link points to. If missing a resolve request is sent later.
   final String target;
 
+  /// The tooltip text when you hover over this link.
+  ///
+  /// If a tooltip is provided, is will be displayed in a string that includes
+  /// instructions on how to trigger the link, such as `{0} (ctrl + click)`. The
+  /// specific instructions vary depending on OS, user settings, and
+  /// localization.
+  ///  @since 3.15.0
+  final String tooltip;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['range'] = range ?? (throw 'range is required but was not set');
     if (target != null) {
       __result['target'] = target;
     }
+    if (tooltip != null) {
+      __result['tooltip'] = tooltip;
+    }
     if (data != null) {
       __result['data'] = data;
     }
@@ -5006,6 +8748,15 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('tooltip');
+      try {
+        if (obj['tooltip'] != null && !(obj['tooltip'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('data');
       try {
         if (obj['data'] != null && !(true)) {
@@ -5027,6 +8778,7 @@
     if (other is DocumentLink && other.runtimeType == DocumentLink) {
       return range == other.range &&
           target == other.target &&
+          tooltip == other.tooltip &&
           data == other.data &&
           true;
     }
@@ -5038,6 +8790,7 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, range.hashCode);
     hash = JenkinsSmiHash.combine(hash, target.hashCode);
+    hash = JenkinsSmiHash.combine(hash, tooltip.hashCode);
     hash = JenkinsSmiHash.combine(hash, data.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
@@ -5046,25 +8799,117 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Document link options.
-class DocumentLinkOptions implements ToJsonable {
+class DocumentLinkClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentLinkClientCapabilities.canParse,
+      DocumentLinkClientCapabilities.fromJson);
+
+  DocumentLinkClientCapabilities(
+      {this.dynamicRegistration, this.tooltipSupport});
+  static DocumentLinkClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final tooltipSupport = json['tooltipSupport'];
+    return DocumentLinkClientCapabilities(
+        dynamicRegistration: dynamicRegistration,
+        tooltipSupport: tooltipSupport);
+  }
+
+  /// Whether document link supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// Whether the client supports the `tooltip` property on `DocumentLink`.
+  ///  @since 3.15.0
+  final bool tooltipSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (tooltipSupport != null) {
+      __result['tooltipSupport'] = tooltipSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tooltipSupport');
+      try {
+        if (obj['tooltipSupport'] != null && !(obj['tooltipSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentLinkClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentLinkClientCapabilities &&
+        other.runtimeType == DocumentLinkClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          tooltipSupport == other.tooltipSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, tooltipSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentLinkOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentLinkOptions.canParse, DocumentLinkOptions.fromJson);
 
-  DocumentLinkOptions(this.resolveProvider);
+  DocumentLinkOptions({this.resolveProvider, this.workDoneProgress});
   static DocumentLinkOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentLinkRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentLinkRegistrationOptions.fromJson(json);
+    }
     final resolveProvider = json['resolveProvider'];
-    return DocumentLinkOptions(resolveProvider);
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentLinkOptions(
+        resolveProvider: resolveProvider, workDoneProgress: workDoneProgress);
   }
 
   /// Document links have a resolve provider as well.
   final bool resolveProvider;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -5080,6 +8925,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentLinkOptions');
@@ -5091,7 +8946,9 @@
   bool operator ==(Object other) {
     if (other is DocumentLinkOptions &&
         other.runtimeType == DocumentLinkOptions) {
-      return resolveProvider == other.resolveProvider && true;
+      return resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
     }
     return false;
   }
@@ -5100,6 +8957,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -5107,11 +8965,15 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentLinkParams implements ToJsonable {
+class DocumentLinkParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(DocumentLinkParams.canParse, DocumentLinkParams.fromJson);
 
-  DocumentLinkParams(this.textDocument) {
+  DocumentLinkParams(
+      {@required this.textDocument,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -5120,16 +8982,46 @@
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    return DocumentLinkParams(textDocument);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return DocumentLinkParams(
+        textDocument: textDocument,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The document to provide document links for.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -5152,6 +9044,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentLinkParams');
@@ -5163,7 +9077,10 @@
   bool operator ==(Object other) {
     if (other is DocumentLinkParams &&
         other.runtimeType == DocumentLinkParams) {
-      return textDocument == other.textDocument && true;
+      return textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
     }
     return false;
   }
@@ -5172,6 +9089,8 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -5180,19 +9099,27 @@
 }
 
 class DocumentLinkRegistrationOptions
-    implements TextDocumentRegistrationOptions, ToJsonable {
+    implements
+        TextDocumentRegistrationOptions,
+        DocumentLinkOptions,
+        ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentLinkRegistrationOptions.canParse,
       DocumentLinkRegistrationOptions.fromJson);
 
-  DocumentLinkRegistrationOptions(this.resolveProvider, this.documentSelector);
+  DocumentLinkRegistrationOptions(
+      {this.documentSelector, this.resolveProvider, this.workDoneProgress});
   static DocumentLinkRegistrationOptions fromJson(Map<String, dynamic> json) {
-    final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
         ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
-    return DocumentLinkRegistrationOptions(resolveProvider, documentSelector);
+    final resolveProvider = json['resolveProvider'];
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentLinkRegistrationOptions(
+        documentSelector: documentSelector,
+        resolveProvider: resolveProvider,
+        workDoneProgress: workDoneProgress);
   }
 
   /// A document selector to identify the scope of the registration. If set to
@@ -5201,28 +9128,22 @@
 
   /// Document links have a resolve provider as well.
   final bool resolveProvider;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
     if (resolveProvider != null) {
       __result['resolveProvider'] = resolveProvider;
     }
-    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
-      reporter.push('resolveProvider');
-      try {
-        if (obj['resolveProvider'] != null &&
-            !(obj['resolveProvider'] is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -5239,6 +9160,26 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('resolveProvider');
+      try {
+        if (obj['resolveProvider'] != null &&
+            !(obj['resolveProvider'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentLinkRegistrationOptions');
@@ -5250,9 +9191,10 @@
   bool operator ==(Object other) {
     if (other is DocumentLinkRegistrationOptions &&
         other.runtimeType == DocumentLinkRegistrationOptions) {
-      return resolveProvider == other.resolveProvider &&
-          listEqual(documentSelector, other.documentSelector,
+      return listEqual(documentSelector, other.documentSelector,
               (DocumentFilter a, DocumentFilter b) => a == b) &&
+          resolveProvider == other.resolveProvider &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -5261,8 +9203,9 @@
   @override
   int get hashCode {
     var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -5270,26 +9213,94 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Format document on type options.
+class DocumentOnTypeFormattingClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentOnTypeFormattingClientCapabilities.canParse,
+      DocumentOnTypeFormattingClientCapabilities.fromJson);
+
+  DocumentOnTypeFormattingClientCapabilities({this.dynamicRegistration});
+  static DocumentOnTypeFormattingClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DocumentOnTypeFormattingClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether on type formatting supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type DocumentOnTypeFormattingClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentOnTypeFormattingClientCapabilities &&
+        other.runtimeType == DocumentOnTypeFormattingClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class DocumentOnTypeFormattingOptions implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentOnTypeFormattingOptions.canParse,
       DocumentOnTypeFormattingOptions.fromJson);
 
   DocumentOnTypeFormattingOptions(
-      this.firstTriggerCharacter, this.moreTriggerCharacter) {
+      {@required this.firstTriggerCharacter, this.moreTriggerCharacter}) {
     if (firstTriggerCharacter == null) {
       throw 'firstTriggerCharacter is required but was not provided';
     }
   }
   static DocumentOnTypeFormattingOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentOnTypeFormattingRegistrationOptions.canParse(
+        json, nullLspJsonReporter)) {
+      return DocumentOnTypeFormattingRegistrationOptions.fromJson(json);
+    }
     final firstTriggerCharacter = json['firstTriggerCharacter'];
     final moreTriggerCharacter = json['moreTriggerCharacter']
         ?.map((item) => item)
         ?.cast<String>()
         ?.toList();
     return DocumentOnTypeFormattingOptions(
-        firstTriggerCharacter, moreTriggerCharacter);
+        firstTriggerCharacter: firstTriggerCharacter,
+        moreTriggerCharacter: moreTriggerCharacter);
   }
 
   /// A character on which formatting should be triggered, like `}`.
@@ -5370,37 +9381,45 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentOnTypeFormattingParams implements ToJsonable {
+class DocumentOnTypeFormattingParams
+    implements TextDocumentPositionParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentOnTypeFormattingParams.canParse,
       DocumentOnTypeFormattingParams.fromJson);
 
   DocumentOnTypeFormattingParams(
-      this.textDocument, this.position, this.ch, this.options) {
-    if (textDocument == null) {
-      throw 'textDocument is required but was not provided';
-    }
-    if (position == null) {
-      throw 'position is required but was not provided';
-    }
+      {@required this.ch,
+      @required this.options,
+      @required this.textDocument,
+      @required this.position}) {
     if (ch == null) {
       throw 'ch is required but was not provided';
     }
     if (options == null) {
       throw 'options is required but was not provided';
     }
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
   }
   static DocumentOnTypeFormattingParams fromJson(Map<String, dynamic> json) {
+    final ch = json['ch'];
+    final options = json['options'] != null
+        ? FormattingOptions.fromJson(json['options'])
+        : null;
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final position =
         json['position'] != null ? Position.fromJson(json['position']) : null;
-    final ch = json['ch'];
-    final options = json['options'] != null
-        ? FormattingOptions.fromJson(json['options'])
-        : null;
-    return DocumentOnTypeFormattingParams(textDocument, position, ch, options);
+    return DocumentOnTypeFormattingParams(
+        ch: ch,
+        options: options,
+        textDocument: textDocument,
+        position: position);
   }
 
   /// The character that has been typed.
@@ -5409,60 +9428,26 @@
   /// The format options.
   final FormattingOptions options;
 
-  /// The position at which this request was sent.
+  /// The position inside the text document.
   final Position position;
 
-  /// The document to format.
+  /// The text document.
   final TextDocumentIdentifier textDocument;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['ch'] = ch ?? (throw 'ch is required but was not set');
+    __result['options'] =
+        options ?? (throw 'options is required but was not set');
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
     __result['position'] =
         position ?? (throw 'position is required but was not set');
-    __result['ch'] = ch ?? (throw 'ch is required but was not set');
-    __result['options'] =
-        options ?? (throw 'options is required but was not set');
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
-      reporter.push('textDocument');
-      try {
-        if (!obj.containsKey('textDocument')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        if (obj['textDocument'] == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(TextDocumentIdentifier.canParse(obj['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;
-        }
-        if (obj['position'] == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(Position.canParse(obj['position'], reporter))) {
-          reporter.reportError('must be of type Position');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('ch');
       try {
         if (!obj.containsKey('ch')) {
@@ -5497,6 +9482,40 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentOnTypeFormattingParams');
@@ -5508,10 +9527,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 &&
+          textDocument == other.textDocument &&
+          position == other.position &&
           true;
     }
     return false;
@@ -5520,10 +9539,10 @@
   @override
   int get hashCode {
     var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
-    hash = JenkinsSmiHash.combine(hash, position.hashCode);
     hash = JenkinsSmiHash.combine(hash, ch.hashCode);
     hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -5532,30 +9551,37 @@
 }
 
 class DocumentOnTypeFormattingRegistrationOptions
-    implements TextDocumentRegistrationOptions, ToJsonable {
+    implements
+        TextDocumentRegistrationOptions,
+        DocumentOnTypeFormattingOptions,
+        ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentOnTypeFormattingRegistrationOptions.canParse,
       DocumentOnTypeFormattingRegistrationOptions.fromJson);
 
-  DocumentOnTypeFormattingRegistrationOptions(this.firstTriggerCharacter,
-      this.moreTriggerCharacter, this.documentSelector) {
+  DocumentOnTypeFormattingRegistrationOptions(
+      {this.documentSelector,
+      @required this.firstTriggerCharacter,
+      this.moreTriggerCharacter}) {
     if (firstTriggerCharacter == null) {
       throw 'firstTriggerCharacter is required but was not provided';
     }
   }
   static DocumentOnTypeFormattingRegistrationOptions fromJson(
       Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
     final firstTriggerCharacter = json['firstTriggerCharacter'];
     final moreTriggerCharacter = json['moreTriggerCharacter']
         ?.map((item) => item)
         ?.cast<String>()
         ?.toList();
-    final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
-        ?.cast<DocumentFilter>()
-        ?.toList();
     return DocumentOnTypeFormattingRegistrationOptions(
-        firstTriggerCharacter, moreTriggerCharacter, documentSelector);
+        documentSelector: documentSelector,
+        firstTriggerCharacter: firstTriggerCharacter,
+        moreTriggerCharacter: moreTriggerCharacter);
   }
 
   /// A document selector to identify the scope of the registration. If set to
@@ -5570,17 +9596,33 @@
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
     __result['firstTriggerCharacter'] = firstTriggerCharacter ??
         (throw 'firstTriggerCharacter is required but was not set');
     if (moreTriggerCharacter != null) {
       __result['moreTriggerCharacter'] = moreTriggerCharacter;
     }
-    __result['documentSelector'] = documentSelector;
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('firstTriggerCharacter');
       try {
         if (!obj.containsKey('firstTriggerCharacter')) {
@@ -5610,22 +9652,6 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('documentSelector');
-      try {
-        if (!obj.containsKey('documentSelector')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        if (obj['documentSelector'] != null &&
-            !((obj['documentSelector'] is List &&
-                (obj['documentSelector'].every(
-                    (item) => DocumentFilter.canParse(item, reporter)))))) {
-          reporter.reportError('must be of type List<DocumentFilter>');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       return true;
     } else {
       reporter.reportError(
@@ -5638,11 +9664,11 @@
   bool operator ==(Object other) {
     if (other is DocumentOnTypeFormattingRegistrationOptions &&
         other.runtimeType == DocumentOnTypeFormattingRegistrationOptions) {
-      return firstTriggerCharacter == other.firstTriggerCharacter &&
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          firstTriggerCharacter == other.firstTriggerCharacter &&
           listEqual(moreTriggerCharacter, other.moreTriggerCharacter,
               (String a, String b) => a == b) &&
-          listEqual(documentSelector, other.documentSelector,
-              (DocumentFilter a, DocumentFilter b) => a == b) &&
           true;
     }
     return false;
@@ -5651,9 +9677,9 @@
   @override
   int get hashCode {
     var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
     hash = JenkinsSmiHash.combine(hash, firstTriggerCharacter.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(moreTriggerCharacter));
-    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -5661,12 +9687,146 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentRangeFormattingParams implements ToJsonable {
+class DocumentRangeFormattingClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentRangeFormattingClientCapabilities.canParse,
+      DocumentRangeFormattingClientCapabilities.fromJson);
+
+  DocumentRangeFormattingClientCapabilities({this.dynamicRegistration});
+  static DocumentRangeFormattingClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return DocumentRangeFormattingClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether formatting supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type DocumentRangeFormattingClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentRangeFormattingClientCapabilities &&
+        other.runtimeType == DocumentRangeFormattingClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentRangeFormattingOptions
+    implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentRangeFormattingOptions.canParse,
+      DocumentRangeFormattingOptions.fromJson);
+
+  DocumentRangeFormattingOptions({this.workDoneProgress});
+  static DocumentRangeFormattingOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentRangeFormattingRegistrationOptions.canParse(
+        json, nullLspJsonReporter)) {
+      return DocumentRangeFormattingRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentRangeFormattingOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentRangeFormattingOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentRangeFormattingOptions &&
+        other.runtimeType == DocumentRangeFormattingOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentRangeFormattingParams
+    implements WorkDoneProgressParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentRangeFormattingParams.canParse,
       DocumentRangeFormattingParams.fromJson);
 
-  DocumentRangeFormattingParams(this.textDocument, this.range, this.options) {
+  DocumentRangeFormattingParams(
+      {@required this.textDocument,
+      @required this.range,
+      @required this.options,
+      this.workDoneToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -5685,7 +9845,18 @@
     final options = json['options'] != null
         ? FormattingOptions.fromJson(json['options'])
         : null;
-    return DocumentRangeFormattingParams(textDocument, range, options);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    return DocumentRangeFormattingParams(
+        textDocument: textDocument,
+        range: range,
+        options: options,
+        workDoneToken: workDoneToken);
   }
 
   /// The format options
@@ -5697,6 +9868,9 @@
   /// The document to format.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
@@ -5704,6 +9878,9 @@
     __result['range'] = range ?? (throw 'range is required but was not set');
     __result['options'] =
         options ?? (throw 'options is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -5760,6 +9937,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentRangeFormattingParams');
@@ -5774,6 +9962,7 @@
       return textDocument == other.textDocument &&
           range == other.range &&
           options == other.options &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -5785,6 +9974,103 @@
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, range.hashCode);
     hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentRangeFormattingRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        DocumentRangeFormattingOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentRangeFormattingRegistrationOptions.canParse,
+      DocumentRangeFormattingRegistrationOptions.fromJson);
+
+  DocumentRangeFormattingRegistrationOptions(
+      {this.documentSelector, this.workDoneProgress});
+  static DocumentRangeFormattingRegistrationOptions fromJson(
+      Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentRangeFormattingRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type DocumentRangeFormattingRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentRangeFormattingRegistrationOptions &&
+        other.runtimeType == DocumentRangeFormattingRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -5800,8 +10086,14 @@
   static const jsonHandler =
       LspJsonHandler(DocumentSymbol.canParse, DocumentSymbol.fromJson);
 
-  DocumentSymbol(this.name, this.detail, this.kind, this.deprecated, this.range,
-      this.selectionRange, this.children) {
+  DocumentSymbol(
+      {@required this.name,
+      this.detail,
+      @required this.kind,
+      this.deprecated,
+      @required this.range,
+      @required this.selectionRange,
+      this.children}) {
     if (name == null) {
       throw 'name is required but was not provided';
     }
@@ -5830,7 +10122,13 @@
         ?.cast<DocumentSymbol>()
         ?.toList();
     return DocumentSymbol(
-        name, detail, kind, deprecated, range, selectionRange, children);
+        name: name,
+        detail: detail,
+        kind: kind,
+        deprecated: deprecated,
+        range: range,
+        selectionRange: selectionRange,
+        children: children);
   }
 
   /// Children of this symbol, e.g. properties of a class.
@@ -6019,11 +10317,268 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class DocumentSymbolParams implements ToJsonable {
+class DocumentSymbolClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentSymbolClientCapabilities.canParse,
+      DocumentSymbolClientCapabilities.fromJson);
+
+  DocumentSymbolClientCapabilities(
+      {this.dynamicRegistration,
+      this.symbolKind,
+      this.hierarchicalDocumentSymbolSupport});
+  static DocumentSymbolClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final symbolKind = json['symbolKind'] != null
+        ? DocumentSymbolClientCapabilitiesSymbolKind.fromJson(
+            json['symbolKind'])
+        : null;
+    final hierarchicalDocumentSymbolSupport =
+        json['hierarchicalDocumentSymbolSupport'];
+    return DocumentSymbolClientCapabilities(
+        dynamicRegistration: dynamicRegistration,
+        symbolKind: symbolKind,
+        hierarchicalDocumentSymbolSupport: hierarchicalDocumentSymbolSupport);
+  }
+
+  /// Whether document symbol supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// The client supports hierarchical document symbols.
+  final bool hierarchicalDocumentSymbolSupport;
+
+  /// Specific capabilities for the `SymbolKind` in the
+  /// `textDocument/documentSymbol` request.
+  final DocumentSymbolClientCapabilitiesSymbolKind symbolKind;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (symbolKind != null) {
+      __result['symbolKind'] = symbolKind;
+    }
+    if (hierarchicalDocumentSymbolSupport != null) {
+      __result['hierarchicalDocumentSymbolSupport'] =
+          hierarchicalDocumentSymbolSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('symbolKind');
+      try {
+        if (obj['symbolKind'] != null &&
+            !(DocumentSymbolClientCapabilitiesSymbolKind.canParse(
+                obj['symbolKind'], reporter))) {
+          reporter.reportError(
+              'must be of type DocumentSymbolClientCapabilitiesSymbolKind');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('hierarchicalDocumentSymbolSupport');
+      try {
+        if (obj['hierarchicalDocumentSymbolSupport'] != null &&
+            !(obj['hierarchicalDocumentSymbolSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentSymbolClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentSymbolClientCapabilities &&
+        other.runtimeType == DocumentSymbolClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          symbolKind == other.symbolKind &&
+          hierarchicalDocumentSymbolSupport ==
+              other.hierarchicalDocumentSymbolSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, symbolKind.hashCode);
+    hash = JenkinsSmiHash.combine(
+        hash, hierarchicalDocumentSymbolSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentSymbolClientCapabilitiesSymbolKind implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentSymbolClientCapabilitiesSymbolKind.canParse,
+      DocumentSymbolClientCapabilitiesSymbolKind.fromJson);
+
+  DocumentSymbolClientCapabilitiesSymbolKind({this.valueSet});
+  static DocumentSymbolClientCapabilitiesSymbolKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? SymbolKind.fromJson(item) : null)
+        ?.cast<SymbolKind>()
+        ?.toList();
+    return DocumentSymbolClientCapabilitiesSymbolKind(valueSet: valueSet);
+  }
+
+  /// The symbol kind values the client supports. When this property exists the
+  /// client also guarantees that it will handle values outside its set
+  /// gracefully and falls back to a default value when unknown.
+  ///
+  /// If this property is not present the client only supports the symbol kinds
+  /// from `File` to `Array` as defined in the initial version of the protocol.
+  final List<SymbolKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (valueSet != null) {
+      __result['valueSet'] = valueSet;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('valueSet');
+      try {
+        if (obj['valueSet'] != null &&
+            !((obj['valueSet'] is List &&
+                (obj['valueSet']
+                    .every((item) => SymbolKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<SymbolKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError(
+          'must be of type DocumentSymbolClientCapabilitiesSymbolKind');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentSymbolClientCapabilitiesSymbolKind &&
+        other.runtimeType == DocumentSymbolClientCapabilitiesSymbolKind) {
+      return listEqual(valueSet, other.valueSet,
+              (SymbolKind a, SymbolKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentSymbolOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentSymbolOptions.canParse, DocumentSymbolOptions.fromJson);
+
+  DocumentSymbolOptions({this.workDoneProgress});
+  static DocumentSymbolOptions fromJson(Map<String, dynamic> json) {
+    if (DocumentSymbolRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return DocumentSymbolRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentSymbolOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentSymbolOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentSymbolOptions &&
+        other.runtimeType == DocumentSymbolOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentSymbolParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       DocumentSymbolParams.canParse, DocumentSymbolParams.fromJson);
 
-  DocumentSymbolParams(this.textDocument) {
+  DocumentSymbolParams(
+      {@required this.textDocument,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -6032,16 +10587,46 @@
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    return DocumentSymbolParams(textDocument);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return DocumentSymbolParams(
+        textDocument: textDocument,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -6064,6 +10649,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type DocumentSymbolParams');
@@ -6075,7 +10682,10 @@
   bool operator ==(Object other) {
     if (other is DocumentSymbolParams &&
         other.runtimeType == DocumentSymbolParams) {
-      return textDocument == other.textDocument && true;
+      return textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
     }
     return false;
   }
@@ -6084,6 +10694,102 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class DocumentSymbolRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        DocumentSymbolOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      DocumentSymbolRegistrationOptions.canParse,
+      DocumentSymbolRegistrationOptions.fromJson);
+
+  DocumentSymbolRegistrationOptions(
+      {this.documentSelector, this.workDoneProgress});
+  static DocumentSymbolRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return DocumentSymbolRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type DocumentSymbolRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is DocumentSymbolRegistrationOptions &&
+        other.runtimeType == DocumentSymbolRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -6127,29 +10833,99 @@
   bool operator ==(Object o) => o is ErrorCodes && o._value == _value;
 }
 
-/// Execute command options.
-class ExecuteCommandOptions implements ToJsonable {
+class ExecuteCommandClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ExecuteCommandClientCapabilities.canParse,
+      ExecuteCommandClientCapabilities.fromJson);
+
+  ExecuteCommandClientCapabilities({this.dynamicRegistration});
+  static ExecuteCommandClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return ExecuteCommandClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Execute command supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ExecuteCommandClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ExecuteCommandClientCapabilities &&
+        other.runtimeType == ExecuteCommandClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ExecuteCommandOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       ExecuteCommandOptions.canParse, ExecuteCommandOptions.fromJson);
 
-  ExecuteCommandOptions(this.commands) {
+  ExecuteCommandOptions({@required this.commands, this.workDoneProgress}) {
     if (commands == null) {
       throw 'commands is required but was not provided';
     }
   }
   static ExecuteCommandOptions fromJson(Map<String, dynamic> json) {
+    if (ExecuteCommandRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return ExecuteCommandRegistrationOptions.fromJson(json);
+    }
     final commands =
         json['commands']?.map((item) => item)?.cast<String>()?.toList();
-    return ExecuteCommandOptions(commands);
+    final workDoneProgress = json['workDoneProgress'];
+    return ExecuteCommandOptions(
+        commands: commands, workDoneProgress: workDoneProgress);
   }
 
   /// The commands to be executed on the server
   final List<String> commands;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['commands'] =
         commands ?? (throw 'commands is required but was not set');
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -6173,6 +10949,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ExecuteCommandOptions');
@@ -6186,6 +10972,7 @@
         other.runtimeType == ExecuteCommandOptions) {
       return listEqual(
               commands, other.commands, (String a, String b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -6195,6 +10982,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, lspHashCode(commands));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -6202,11 +10990,12 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ExecuteCommandParams implements ToJsonable {
+class ExecuteCommandParams implements WorkDoneProgressParams, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       ExecuteCommandParams.canParse, ExecuteCommandParams.fromJson);
 
-  ExecuteCommandParams(this.command, this.arguments) {
+  ExecuteCommandParams(
+      {@required this.command, this.arguments, this.workDoneToken}) {
     if (command == null) {
       throw 'command is required but was not provided';
     }
@@ -6215,7 +11004,15 @@
     final command = json['command'];
     final arguments =
         json['arguments']?.map((item) => item)?.cast<dynamic>()?.toList();
-    return ExecuteCommandParams(command, arguments);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    return ExecuteCommandParams(
+        command: command, arguments: arguments, workDoneToken: workDoneToken);
   }
 
   /// Arguments that the command should be invoked with.
@@ -6224,6 +11021,9 @@
   /// The identifier of the actual command handler.
   final String command;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['command'] =
@@ -6231,6 +11031,9 @@
     if (arguments != null) {
       __result['arguments'] = arguments;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -6264,6 +11067,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ExecuteCommandParams');
@@ -6278,6 +11092,7 @@
       return command == other.command &&
           listEqual(
               arguments, other.arguments, (dynamic a, dynamic b) => a == b) &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -6288,6 +11103,7 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, command.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(arguments));
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -6296,12 +11112,14 @@
 }
 
 /// Execute command registration options.
-class ExecuteCommandRegistrationOptions implements ToJsonable {
+class ExecuteCommandRegistrationOptions
+    implements ExecuteCommandOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       ExecuteCommandRegistrationOptions.canParse,
       ExecuteCommandRegistrationOptions.fromJson);
 
-  ExecuteCommandRegistrationOptions(this.commands) {
+  ExecuteCommandRegistrationOptions(
+      {@required this.commands, this.workDoneProgress}) {
     if (commands == null) {
       throw 'commands is required but was not provided';
     }
@@ -6309,16 +11127,22 @@
   static ExecuteCommandRegistrationOptions fromJson(Map<String, dynamic> json) {
     final commands =
         json['commands']?.map((item) => item)?.cast<String>()?.toList();
-    return ExecuteCommandRegistrationOptions(commands);
+    final workDoneProgress = json['workDoneProgress'];
+    return ExecuteCommandRegistrationOptions(
+        commands: commands, workDoneProgress: workDoneProgress);
   }
 
   /// The commands to be executed on the server
   final List<String> commands;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['commands'] =
         commands ?? (throw 'commands is required but was not set');
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -6342,6 +11166,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ExecuteCommandRegistrationOptions');
@@ -6355,6 +11189,7 @@
         other.runtimeType == ExecuteCommandRegistrationOptions) {
       return listEqual(
               commands, other.commands, (String a, String b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -6364,6 +11199,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, lspHashCode(commands));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -6393,18 +11229,18 @@
   /// executed.
   static const Abort = FailureHandlingKind._('abort');
 
-  /// All operations are executed transactionally. That means they either all
+  /// All operations are executed transactional. That means they either all
   /// succeed or no changes at all are applied to the workspace.
   static const Transactional = FailureHandlingKind._('transactional');
 
   /// If the workspace edit contains only textual file changes they are executed
-  /// transactionally. If resource changes (create, rename or delete file) are
+  /// transactional. If resource changes (create, rename or delete file) are
   /// part of the change the failure handling strategy is abort.
   static const TextOnlyTransactional =
       FailureHandlingKind._('textOnlyTransactional');
 
   /// The client tries to undo the operations already executed. But there is no
-  /// guarantee that this succeeds.
+  /// guarantee that this is succeeding.
   static const Undo = FailureHandlingKind._('undo');
 
   Object toJson() => _value;
@@ -6454,7 +11290,7 @@
   static const jsonHandler =
       LspJsonHandler(FileEvent.canParse, FileEvent.fromJson);
 
-  FileEvent(this.uri, this.type) {
+  FileEvent({@required this.uri, @required this.type}) {
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
@@ -6465,7 +11301,7 @@
   static FileEvent fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final type = json['type'];
-    return FileEvent(uri, type);
+    return FileEvent(uri: uri, type: type);
   }
 
   /// The change type.
@@ -6548,7 +11384,7 @@
   static const jsonHandler =
       LspJsonHandler(FileSystemWatcher.canParse, FileSystemWatcher.fromJson);
 
-  FileSystemWatcher(this.globPattern, this.kind) {
+  FileSystemWatcher({@required this.globPattern, this.kind}) {
     if (globPattern == null) {
       throw 'globPattern is required but was not provided';
     }
@@ -6556,7 +11392,7 @@
   static FileSystemWatcher fromJson(Map<String, dynamic> json) {
     final globPattern = json['globPattern'];
     final kind = json['kind'] != null ? WatchKind.fromJson(json['kind']) : null;
-    return FileSystemWatcher(globPattern, kind);
+    return FileSystemWatcher(globPattern: globPattern, kind: kind);
   }
 
   /// The  glob pattern to watch.
@@ -6649,8 +11485,12 @@
   static const jsonHandler =
       LspJsonHandler(FoldingRange.canParse, FoldingRange.fromJson);
 
-  FoldingRange(this.startLine, this.startCharacter, this.endLine,
-      this.endCharacter, this.kind) {
+  FoldingRange(
+      {@required this.startLine,
+      this.startCharacter,
+      @required this.endLine,
+      this.endCharacter,
+      this.kind}) {
     if (startLine == null) {
       throw 'startLine is required but was not provided';
     }
@@ -6665,7 +11505,12 @@
     final endCharacter = json['endCharacter'];
     final kind =
         json['kind'] != null ? FoldingRangeKind.fromJson(json['kind']) : null;
-    return FoldingRange(startLine, startCharacter, endLine, endCharacter, kind);
+    return FoldingRange(
+        startLine: startLine,
+        startCharacter: startCharacter,
+        endLine: endLine,
+        endCharacter: endCharacter,
+        kind: kind);
   }
 
   /// The zero-based character offset before the folded range ends. If not
@@ -6805,6 +11650,116 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class FoldingRangeClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      FoldingRangeClientCapabilities.canParse,
+      FoldingRangeClientCapabilities.fromJson);
+
+  FoldingRangeClientCapabilities(
+      {this.dynamicRegistration, this.rangeLimit, this.lineFoldingOnly});
+  static FoldingRangeClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final rangeLimit = json['rangeLimit'];
+    final lineFoldingOnly = json['lineFoldingOnly'];
+    return FoldingRangeClientCapabilities(
+        dynamicRegistration: dynamicRegistration,
+        rangeLimit: rangeLimit,
+        lineFoldingOnly: lineFoldingOnly);
+  }
+
+  /// Whether implementation supports dynamic registration for folding range
+  /// providers. If this is set to `true` the client supports the new
+  /// `FoldingRangeRegistrationOptions` return value for the corresponding
+  /// server capability as well.
+  final bool dynamicRegistration;
+
+  /// If set, the client signals that it only supports folding complete lines.
+  /// If set, client will ignore specified `startCharacter` and `endCharacter`
+  /// properties in a FoldingRange.
+  final bool lineFoldingOnly;
+
+  /// The maximum number of folding ranges that the client prefers to receive
+  /// per document. The value serves as a hint, servers are free to follow the
+  /// limit.
+  final num rangeLimit;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (rangeLimit != null) {
+      __result['rangeLimit'] = rangeLimit;
+    }
+    if (lineFoldingOnly != null) {
+      __result['lineFoldingOnly'] = lineFoldingOnly;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('rangeLimit');
+      try {
+        if (obj['rangeLimit'] != null && !(obj['rangeLimit'] is num)) {
+          reporter.reportError('must be of type num');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('lineFoldingOnly');
+      try {
+        if (obj['lineFoldingOnly'] != null &&
+            !(obj['lineFoldingOnly'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type FoldingRangeClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FoldingRangeClientCapabilities &&
+        other.runtimeType == FoldingRangeClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          rangeLimit == other.rangeLimit &&
+          lineFoldingOnly == other.lineFoldingOnly &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rangeLimit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lineFoldingOnly.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Enum of known range kinds
 class FoldingRangeKind {
   const FoldingRangeKind(this._value);
@@ -6836,11 +11791,77 @@
   bool operator ==(Object o) => o is FoldingRangeKind && o._value == _value;
 }
 
-class FoldingRangeParams implements ToJsonable {
+class FoldingRangeOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      FoldingRangeOptions.canParse, FoldingRangeOptions.fromJson);
+
+  FoldingRangeOptions({this.workDoneProgress});
+  static FoldingRangeOptions fromJson(Map<String, dynamic> json) {
+    if (FoldingRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return FoldingRangeRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return FoldingRangeOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type FoldingRangeOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is FoldingRangeOptions &&
+        other.runtimeType == FoldingRangeOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class FoldingRangeParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(FoldingRangeParams.canParse, FoldingRangeParams.fromJson);
 
-  FoldingRangeParams(this.textDocument) {
+  FoldingRangeParams(
+      {@required this.textDocument,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
@@ -6849,16 +11870,46 @@
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    return FoldingRangeParams(textDocument);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return FoldingRangeParams(
+        textDocument: textDocument,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -6881,6 +11932,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FoldingRangeParams');
@@ -6892,7 +11965,10 @@
   bool operator ==(Object other) {
     if (other is FoldingRangeParams &&
         other.runtimeType == FoldingRangeParams) {
-      return textDocument == other.textDocument && true;
+      return textDocument == other.textDocument &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
     }
     return false;
   }
@@ -6901,6 +11977,8 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -6908,35 +11986,105 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Folding range provider options.
-class FoldingRangeProviderOptions implements ToJsonable {
+class FoldingRangeRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        FoldingRangeOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
   static const jsonHandler = LspJsonHandler(
-      FoldingRangeProviderOptions.canParse,
-      FoldingRangeProviderOptions.fromJson);
+      FoldingRangeRegistrationOptions.canParse,
+      FoldingRangeRegistrationOptions.fromJson);
 
-  static FoldingRangeProviderOptions fromJson(Map<String, dynamic> json) {
-    return FoldingRangeProviderOptions();
+  FoldingRangeRegistrationOptions(
+      {this.documentSelector, this.workDoneProgress, this.id});
+  static FoldingRangeRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    final id = json['id'];
+    return FoldingRangeRegistrationOptions(
+        documentSelector: documentSelector,
+        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;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String id;
+  final bool workDoneProgress;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    if (id != null) {
+      __result['id'] = id;
+    }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        if (obj['id'] != null && !(obj['id'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
-      reporter.reportError('must be of type FoldingRangeProviderOptions');
+      reporter.reportError('must be of type FoldingRangeRegistrationOptions');
       return false;
     }
   }
 
   @override
   bool operator ==(Object other) {
-    if (other is FoldingRangeProviderOptions &&
-        other.runtimeType == FoldingRangeProviderOptions) {
-      return true;
+    if (other is FoldingRangeRegistrationOptions &&
+        other.runtimeType == FoldingRangeRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          id == other.id &&
+          true;
     }
     return false;
   }
@@ -6944,6 +12092,9 @@
   @override
   int get hashCode {
     var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -6956,7 +12107,12 @@
   static const jsonHandler =
       LspJsonHandler(FormattingOptions.canParse, FormattingOptions.fromJson);
 
-  FormattingOptions(this.tabSize, this.insertSpaces) {
+  FormattingOptions(
+      {@required this.tabSize,
+      @required this.insertSpaces,
+      this.trimTrailingWhitespace,
+      this.insertFinalNewline,
+      this.trimFinalNewlines}) {
     if (tabSize == null) {
       throw 'tabSize is required but was not provided';
     }
@@ -6967,21 +12123,50 @@
   static FormattingOptions fromJson(Map<String, dynamic> json) {
     final tabSize = json['tabSize'];
     final insertSpaces = json['insertSpaces'];
-    return FormattingOptions(tabSize, insertSpaces);
+    final trimTrailingWhitespace = json['trimTrailingWhitespace'];
+    final insertFinalNewline = json['insertFinalNewline'];
+    final trimFinalNewlines = json['trimFinalNewlines'];
+    return FormattingOptions(
+        tabSize: tabSize,
+        insertSpaces: insertSpaces,
+        trimTrailingWhitespace: trimTrailingWhitespace,
+        insertFinalNewline: insertFinalNewline,
+        trimFinalNewlines: trimFinalNewlines);
   }
 
+  /// Insert a newline character at the end of the file if one does not exist.
+  ///  @since 3.15.0
+  final bool insertFinalNewline;
+
   /// Prefer spaces over tabs.
   final bool insertSpaces;
 
   /// Size of a tab in spaces.
   final num tabSize;
 
+  /// Trim all newlines after the final newline at the end of the file.
+  ///  @since 3.15.0
+  final bool trimFinalNewlines;
+
+  /// Trim trailing whitespace on a line.
+  ///  @since 3.15.0
+  final bool trimTrailingWhitespace;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['tabSize'] =
         tabSize ?? (throw 'tabSize is required but was not set');
     __result['insertSpaces'] =
         insertSpaces ?? (throw 'insertSpaces is required but was not set');
+    if (trimTrailingWhitespace != null) {
+      __result['trimTrailingWhitespace'] = trimTrailingWhitespace;
+    }
+    if (insertFinalNewline != null) {
+      __result['insertFinalNewline'] = insertFinalNewline;
+    }
+    if (trimFinalNewlines != null) {
+      __result['trimFinalNewlines'] = trimFinalNewlines;
+    }
     return __result;
   }
 
@@ -7021,6 +12206,36 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('trimTrailingWhitespace');
+      try {
+        if (obj['trimTrailingWhitespace'] != null &&
+            !(obj['trimTrailingWhitespace'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('insertFinalNewline');
+      try {
+        if (obj['insertFinalNewline'] != null &&
+            !(obj['insertFinalNewline'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('trimFinalNewlines');
+      try {
+        if (obj['trimFinalNewlines'] != null &&
+            !(obj['trimFinalNewlines'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type FormattingOptions');
@@ -7033,6 +12248,9 @@
     if (other is FormattingOptions && other.runtimeType == FormattingOptions) {
       return tabSize == other.tabSize &&
           insertSpaces == other.insertSpaces &&
+          trimTrailingWhitespace == other.trimTrailingWhitespace &&
+          insertFinalNewline == other.insertFinalNewline &&
+          trimFinalNewlines == other.trimFinalNewlines &&
           true;
     }
     return false;
@@ -7043,6 +12261,9 @@
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, tabSize.hashCode);
     hash = JenkinsSmiHash.combine(hash, insertSpaces.hashCode);
+    hash = JenkinsSmiHash.combine(hash, trimTrailingWhitespace.hashCode);
+    hash = JenkinsSmiHash.combine(hash, insertFinalNewline.hashCode);
+    hash = JenkinsSmiHash.combine(hash, trimFinalNewlines.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -7054,7 +12275,7 @@
 class Hover implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Hover.canParse, Hover.fromJson);
 
-  Hover(this.contents, this.range) {
+  Hover({@required this.contents, this.range}) {
     if (contents == null) {
       throw 'contents is required but was not provided';
     }
@@ -7068,7 +12289,7 @@
                 : null)
             : (throw '''${json['contents']} was not one of (String, MarkupContent)'''));
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
-    return Hover(contents, range);
+    return Hover(contents: contents, range: range);
   }
 
   /// The hover's content
@@ -7145,24 +12366,832 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class InitializeParams implements ToJsonable {
+class HoverClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      HoverClientCapabilities.canParse, HoverClientCapabilities.fromJson);
+
+  HoverClientCapabilities({this.dynamicRegistration, this.contentFormat});
+  static HoverClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final contentFormat = json['contentFormat']
+        ?.map((item) => item != null ? MarkupKind.fromJson(item) : null)
+        ?.cast<MarkupKind>()
+        ?.toList();
+    return HoverClientCapabilities(
+        dynamicRegistration: dynamicRegistration, contentFormat: contentFormat);
+  }
+
+  /// Client supports the follow content formats for the content property. The
+  /// order describes the preferred format of the client.
+  final List<MarkupKind> contentFormat;
+
+  /// Whether hover supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (contentFormat != null) {
+      __result['contentFormat'] = contentFormat;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('contentFormat');
+      try {
+        if (obj['contentFormat'] != null &&
+            !((obj['contentFormat'] is List &&
+                (obj['contentFormat']
+                    .every((item) => MarkupKind.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<MarkupKind>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type HoverClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is HoverClientCapabilities &&
+        other.runtimeType == HoverClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          listEqual(contentFormat, other.contentFormat,
+              (MarkupKind a, MarkupKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(contentFormat));
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class HoverOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(HoverOptions.canParse, HoverOptions.fromJson);
+
+  HoverOptions({this.workDoneProgress});
+  static HoverOptions fromJson(Map<String, dynamic> json) {
+    if (HoverRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return HoverRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return HoverOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type HoverOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is HoverOptions && other.runtimeType == HoverOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class HoverParams
+    implements TextDocumentPositionParams, WorkDoneProgressParams, ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(HoverParams.canParse, HoverParams.fromJson);
+
+  HoverParams(
+      {@required this.textDocument,
+      @required this.position,
+      this.workDoneToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
+  }
+  static HoverParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    return HoverParams(
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken);
+  }
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['position'] =
+        position ?? (throw 'position is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type HoverParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is HoverParams && other.runtimeType == HoverParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class HoverRegistrationOptions
+    implements TextDocumentRegistrationOptions, HoverOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      HoverRegistrationOptions.canParse, HoverRegistrationOptions.fromJson);
+
+  HoverRegistrationOptions({this.documentSelector, this.workDoneProgress});
+  static HoverRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return HoverRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type HoverRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is HoverRegistrationOptions &&
+        other.runtimeType == HoverRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ImplementationClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ImplementationClientCapabilities.canParse,
+      ImplementationClientCapabilities.fromJson);
+
+  ImplementationClientCapabilities(
+      {this.dynamicRegistration, this.linkSupport});
+  static ImplementationClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return ImplementationClientCapabilities(
+        dynamicRegistration: dynamicRegistration, linkSupport: linkSupport);
+  }
+
+  /// Whether implementation supports dynamic registration. If this is set to
+  /// `true` the client supports the new `ImplementationRegistrationOptions`
+  /// return value for the corresponding server capability as well.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of definition links.
+  ///  @since 3.14.0
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('linkSupport');
+      try {
+        if (obj['linkSupport'] != null && !(obj['linkSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ImplementationClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ImplementationClientCapabilities &&
+        other.runtimeType == ImplementationClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ImplementationOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ImplementationOptions.canParse, ImplementationOptions.fromJson);
+
+  ImplementationOptions({this.workDoneProgress});
+  static ImplementationOptions fromJson(Map<String, dynamic> json) {
+    if (ImplementationRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return ImplementationRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return ImplementationOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ImplementationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ImplementationOptions &&
+        other.runtimeType == ImplementationOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ImplementationParams
+    implements
+        TextDocumentPositionParams,
+        WorkDoneProgressParams,
+        PartialResultParams,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ImplementationParams.canParse, ImplementationParams.fromJson);
+
+  ImplementationParams(
+      {@required this.textDocument,
+      @required this.position,
+      this.workDoneToken,
+      this.partialResultToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
+  }
+  static ImplementationParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return ImplementationParams(
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['position'] =
+        position ?? (throw 'position is required but was not set');
+    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, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ImplementationParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ImplementationParams &&
+        other.runtimeType == ImplementationParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ImplementationRegistrationOptions
+    implements
+        TextDocumentRegistrationOptions,
+        ImplementationOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ImplementationRegistrationOptions.canParse,
+      ImplementationRegistrationOptions.fromJson);
+
+  ImplementationRegistrationOptions(
+      {this.documentSelector, this.workDoneProgress, this.id});
+  static ImplementationRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    final id = json['id'];
+    return ImplementationRegistrationOptions(
+        documentSelector: documentSelector,
+        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;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String id;
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    if (id != null) {
+      __result['id'] = id;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        if (obj['id'] != null && !(obj['id'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ImplementationRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ImplementationRegistrationOptions &&
+        other.runtimeType == ImplementationRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class InitializeParams implements WorkDoneProgressParams, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(InitializeParams.canParse, InitializeParams.fromJson);
 
   InitializeParams(
-      this.processId,
+      {this.processId,
+      this.clientInfo,
       this.rootPath,
       this.rootUri,
       this.initializationOptions,
-      this.capabilities,
+      @required this.capabilities,
       this.trace,
-      this.workspaceFolders) {
+      this.workspaceFolders,
+      this.workDoneToken}) {
     if (capabilities == null) {
       throw 'capabilities is required but was not provided';
     }
   }
   static InitializeParams fromJson(Map<String, dynamic> json) {
     final processId = json['processId'];
+    final clientInfo = json['clientInfo'] != null
+        ? InitializeParamsClientInfo.fromJson(json['clientInfo'])
+        : null;
     final rootPath = json['rootPath'];
     final rootUri = json['rootUri'];
     final initializationOptions = json['initializationOptions'];
@@ -7174,13 +13203,32 @@
         ?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
-    return InitializeParams(processId, rootPath, rootUri, initializationOptions,
-        capabilities, trace, workspaceFolders);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    return InitializeParams(
+        processId: processId,
+        clientInfo: clientInfo,
+        rootPath: rootPath,
+        rootUri: rootUri,
+        initializationOptions: initializationOptions,
+        capabilities: capabilities,
+        trace: trace,
+        workspaceFolders: workspaceFolders,
+        workDoneToken: workDoneToken);
   }
 
   /// The capabilities provided by the client (editor or tool)
   final ClientCapabilities capabilities;
 
+  /// Information about the client
+  ///  @since 3.15.0
+  final InitializeParamsClientInfo clientInfo;
+
   /// User provided initialization options.
   final dynamic initializationOptions;
 
@@ -7202,17 +13250,22 @@
   /// The initial trace setting. If omitted trace is disabled ('off').
   final String trace;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   /// The workspace folders configured in the client when the server starts.
   /// This property is only available if the client supports workspace folders.
   /// It can be `null` if the client supports workspace folders but none are
   /// configured.
-  ///
-  /// Since 3.6.0
+  ///  @since 3.6.0
   final List<WorkspaceFolder> workspaceFolders;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['processId'] = processId;
+    if (clientInfo != null) {
+      __result['clientInfo'] = clientInfo;
+    }
     if (rootPath != null) {
       __result['rootPath'] = rootPath;
     }
@@ -7228,6 +13281,9 @@
     if (workspaceFolders != null) {
       __result['workspaceFolders'] = workspaceFolders;
     }
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
@@ -7246,6 +13302,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('clientInfo');
+      try {
+        if (obj['clientInfo'] != null &&
+            !(InitializeParamsClientInfo.canParse(
+                obj['clientInfo'], reporter))) {
+          reporter.reportError('must be of type InitializeParamsClientInfo');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('rootPath');
       try {
         if (obj['rootPath'] != null && !(obj['rootPath'] is String)) {
@@ -7315,6 +13382,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type InitializeParams');
@@ -7326,6 +13404,7 @@
   bool operator ==(Object other) {
     if (other is InitializeParams && other.runtimeType == InitializeParams) {
       return processId == other.processId &&
+          clientInfo == other.clientInfo &&
           rootPath == other.rootPath &&
           rootUri == other.rootUri &&
           initializationOptions == other.initializationOptions &&
@@ -7333,6 +13412,7 @@
           trace == other.trace &&
           listEqual(workspaceFolders, other.workspaceFolders,
               (WorkspaceFolder a, WorkspaceFolder b) => a == b) &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -7342,12 +13422,100 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, processId.hashCode);
+    hash = JenkinsSmiHash.combine(hash, clientInfo.hashCode);
     hash = JenkinsSmiHash.combine(hash, rootPath.hashCode);
     hash = JenkinsSmiHash.combine(hash, rootUri.hashCode);
     hash = JenkinsSmiHash.combine(hash, initializationOptions.hashCode);
     hash = JenkinsSmiHash.combine(hash, capabilities.hashCode);
     hash = JenkinsSmiHash.combine(hash, trace.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(workspaceFolders));
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class InitializeParamsClientInfo implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      InitializeParamsClientInfo.canParse, InitializeParamsClientInfo.fromJson);
+
+  InitializeParamsClientInfo({@required this.name, this.version}) {
+    if (name == null) {
+      throw 'name is required but was not provided';
+    }
+  }
+  static InitializeParamsClientInfo fromJson(Map<String, dynamic> json) {
+    final name = json['name'];
+    final version = json['version'];
+    return InitializeParamsClientInfo(name: name, version: version);
+  }
+
+  /// The name of the client as defined by the client.
+  final String name;
+
+  /// The client's version as defined by the client.
+  final String version;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['name'] = name ?? (throw 'name is required but was not set');
+    if (version != null) {
+      __result['version'] = version;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('name');
+      try {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['name'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(obj['name'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (obj['version'] != null && !(obj['version'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InitializeParamsClientInfo');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InitializeParamsClientInfo &&
+        other.runtimeType == InitializeParamsClientInfo) {
+      return name == other.name && version == other.version && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, version.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -7359,7 +13527,7 @@
   static const jsonHandler =
       LspJsonHandler(InitializeResult.canParse, InitializeResult.fromJson);
 
-  InitializeResult(this.capabilities) {
+  InitializeResult({@required this.capabilities, this.serverInfo}) {
     if (capabilities == null) {
       throw 'capabilities is required but was not provided';
     }
@@ -7368,16 +13536,26 @@
     final capabilities = json['capabilities'] != null
         ? ServerCapabilities.fromJson(json['capabilities'])
         : null;
-    return InitializeResult(capabilities);
+    final serverInfo = json['serverInfo'] != null
+        ? InitializeResultServerInfo.fromJson(json['serverInfo'])
+        : null;
+    return InitializeResult(capabilities: capabilities, serverInfo: serverInfo);
   }
 
   /// The capabilities the language server provides.
   final ServerCapabilities capabilities;
 
+  /// Information about the server.
+  ///  @since 3.15.0
+  final InitializeResultServerInfo serverInfo;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['capabilities'] =
         capabilities ?? (throw 'capabilities is required but was not set');
+    if (serverInfo != null) {
+      __result['serverInfo'] = serverInfo;
+    }
     return __result;
   }
 
@@ -7400,6 +13578,17 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('serverInfo');
+      try {
+        if (obj['serverInfo'] != null &&
+            !(InitializeResultServerInfo.canParse(
+                obj['serverInfo'], reporter))) {
+          reporter.reportError('must be of type InitializeResultServerInfo');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type InitializeResult');
@@ -7410,7 +13599,9 @@
   @override
   bool operator ==(Object other) {
     if (other is InitializeResult && other.runtimeType == InitializeResult) {
-      return capabilities == other.capabilities && true;
+      return capabilities == other.capabilities &&
+          serverInfo == other.serverInfo &&
+          true;
     }
     return false;
   }
@@ -7419,6 +13610,93 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, capabilities.hashCode);
+    hash = JenkinsSmiHash.combine(hash, serverInfo.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class InitializeResultServerInfo implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      InitializeResultServerInfo.canParse, InitializeResultServerInfo.fromJson);
+
+  InitializeResultServerInfo({@required this.name, this.version}) {
+    if (name == null) {
+      throw 'name is required but was not provided';
+    }
+  }
+  static InitializeResultServerInfo fromJson(Map<String, dynamic> json) {
+    final name = json['name'];
+    final version = json['version'];
+    return InitializeResultServerInfo(name: name, version: version);
+  }
+
+  /// The name of the server as defined by the server.
+  final String name;
+
+  /// The server's version as defined by the server.
+  final String version;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['name'] = name ?? (throw 'name is required but was not set');
+    if (version != null) {
+      __result['version'] = version;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('name');
+      try {
+        if (!obj.containsKey('name')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['name'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(obj['name'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('version');
+      try {
+        if (obj['version'] != null && !(obj['version'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type InitializeResultServerInfo');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is InitializeResultServerInfo &&
+        other.runtimeType == InitializeResultServerInfo) {
+      return name == other.name && version == other.version && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, version.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -7509,7 +13787,7 @@
   static const jsonHandler =
       LspJsonHandler(Location.canParse, Location.fromJson);
 
-  Location(this.uri, this.range) {
+  Location({@required this.uri, @required this.range}) {
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
@@ -7520,7 +13798,7 @@
   static Location fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
-    return Location(uri, range);
+    return Location(uri: uri, range: range);
   }
 
   final Range range;
@@ -7600,8 +13878,11 @@
   static const jsonHandler =
       LspJsonHandler(LocationLink.canParse, LocationLink.fromJson);
 
-  LocationLink(this.originSelectionRange, this.targetUri, this.targetRange,
-      this.targetSelectionRange) {
+  LocationLink(
+      {this.originSelectionRange,
+      @required this.targetUri,
+      @required this.targetRange,
+      @required this.targetSelectionRange}) {
     if (targetUri == null) {
       throw 'targetUri is required but was not provided';
     }
@@ -7624,7 +13905,10 @@
         ? Range.fromJson(json['targetSelectionRange'])
         : null;
     return LocationLink(
-        originSelectionRange, targetUri, targetRange, targetSelectionRange);
+        originSelectionRange: originSelectionRange,
+        targetUri: targetUri,
+        targetRange: targetRange,
+        targetSelectionRange: targetSelectionRange);
   }
 
   /// Span of the origin of this link.
@@ -7761,7 +14045,7 @@
   static const jsonHandler =
       LspJsonHandler(LogMessageParams.canParse, LogMessageParams.fromJson);
 
-  LogMessageParams(this.type, this.message) {
+  LogMessageParams({@required this.type, @required this.message}) {
     if (type == null) {
       throw 'type is required but was not provided';
     }
@@ -7773,7 +14057,7 @@
     final type =
         json['type'] != null ? MessageType.fromJson(json['type']) : null;
     final message = json['message'];
-    return LogMessageParams(type, message);
+    return LogMessageParams(type: type, message: message);
   }
 
   /// The actual message
@@ -7879,7 +14163,7 @@
   static const jsonHandler =
       LspJsonHandler(MarkupContent.canParse, MarkupContent.fromJson);
 
-  MarkupContent(this.kind, this.value) {
+  MarkupContent({@required this.kind, @required this.value}) {
     if (kind == null) {
       throw 'kind is required but was not provided';
     }
@@ -7891,7 +14175,7 @@
     final kind =
         json['kind'] != null ? MarkupKind.fromJson(json['kind']) : null;
     final value = json['value'];
-    return MarkupContent(kind, value);
+    return MarkupContent(kind: kind, value: value);
   }
 
   /// The type of the Markup
@@ -8010,7 +14294,7 @@
 class Message implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Message.canParse, Message.fromJson);
 
-  Message(this.jsonrpc) {
+  Message({@required this.jsonrpc}) {
     if (jsonrpc == null) {
       throw 'jsonrpc is required but was not provided';
     }
@@ -8026,7 +14310,7 @@
       return NotificationMessage.fromJson(json);
     }
     final jsonrpc = json['jsonrpc'];
-    return Message(jsonrpc);
+    return Message(jsonrpc: jsonrpc);
   }
 
   final String jsonrpc;
@@ -8087,14 +14371,14 @@
   static const jsonHandler =
       LspJsonHandler(MessageActionItem.canParse, MessageActionItem.fromJson);
 
-  MessageActionItem(this.title) {
+  MessageActionItem({@required this.title}) {
     if (title == null) {
       throw 'title is required but was not provided';
     }
   }
   static MessageActionItem fromJson(Map<String, dynamic> json) {
     final title = json['title'];
-    return MessageActionItem(title);
+    return MessageActionItem(title: title);
   }
 
   /// A short title like 'Retry', 'Open Log' etc.
@@ -8198,6 +14482,9 @@
   /// Constant for the '$/cancelRequest' method.
   static const cancelRequest = Method(r'$/cancelRequest');
 
+  /// Constant for the '$/progress' method.
+  static const progress = Method(r'$/progress');
+
   /// Constant for the 'initialize' method.
   static const initialize = Method(r'initialize');
 
@@ -8219,6 +14506,14 @@
   /// Constant for the 'window/logMessage' method.
   static const window_logMessage = Method(r'window/logMessage');
 
+  /// Constant for the 'window/workDoneProgress/create' method.
+  static const window_workDoneProgress_create =
+      Method(r'window/workDoneProgress/create');
+
+  /// Constant for the 'window/workDoneProgress/cancel' method.
+  static const window_workDoneProgress_cancel =
+      Method(r'window/workDoneProgress/cancel');
+
   /// Constant for the 'telemetry/event' method.
   static const telemetry_event = Method(r'telemetry/event');
 
@@ -8270,6 +14565,9 @@
   static const textDocument_willSaveWaitUntil =
       Method(r'textDocument/willSaveWaitUntil');
 
+  /// Constant for the 'textDocument/didSave' method.
+  static const textDocument_didSave = Method(r'textDocument/didSave');
+
   /// Constant for the 'textDocument/didClose' method.
   static const textDocument_didClose = Method(r'textDocument/didClose');
 
@@ -8359,6 +14657,10 @@
   /// Constant for the 'textDocument/foldingRange' method.
   static const textDocument_foldingRange = Method(r'textDocument/foldingRange');
 
+  /// Constant for the 'textDocument/selectionRange' method.
+  static const textDocument_selectionRange =
+      Method(r'textDocument/selectionRange');
+
   Object toJson() => _value;
 
   @override
@@ -8374,7 +14676,8 @@
   static const jsonHandler = LspJsonHandler(
       NotificationMessage.canParse, NotificationMessage.fromJson);
 
-  NotificationMessage(this.method, this.params, this.jsonrpc) {
+  NotificationMessage(
+      {@required this.method, this.params, @required this.jsonrpc}) {
     if (method == null) {
       throw 'method is required but was not provided';
     }
@@ -8387,7 +14690,8 @@
         json['method'] != null ? Method.fromJson(json['method']) : null;
     final params = json['params'];
     final jsonrpc = json['jsonrpc'];
-    return NotificationMessage(method, params, jsonrpc);
+    return NotificationMessage(
+        method: method, params: params, jsonrpc: jsonrpc);
   }
 
   final String jsonrpc;
@@ -8492,7 +14796,7 @@
   static const jsonHandler = LspJsonHandler(
       ParameterInformation.canParse, ParameterInformation.fromJson);
 
-  ParameterInformation(this.label, this.documentation) {
+  ParameterInformation({@required this.label, this.documentation}) {
     if (label == null) {
       throw 'label is required but was not provided';
     }
@@ -8508,7 +14812,7 @@
             : (json['documentation'] == null
                 ? null
                 : (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
-    return ParameterInformation(label, documentation);
+    return ParameterInformation(label: label, documentation: documentation);
   }
 
   /// The human-readable doc-comment of this parameter. Will be shown in the UI
@@ -8597,11 +14901,127 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class PartialResultParams implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      PartialResultParams.canParse, PartialResultParams.fromJson);
+
+  PartialResultParams({this.partialResultToken});
+  static PartialResultParams fromJson(Map<String, dynamic> json) {
+    if (WorkspaceSymbolParams.canParse(json, nullLspJsonReporter)) {
+      return WorkspaceSymbolParams.fromJson(json);
+    }
+    if (CompletionParams.canParse(json, nullLspJsonReporter)) {
+      return CompletionParams.fromJson(json);
+    }
+    if (DeclarationParams.canParse(json, nullLspJsonReporter)) {
+      return DeclarationParams.fromJson(json);
+    }
+    if (DefinitionParams.canParse(json, nullLspJsonReporter)) {
+      return DefinitionParams.fromJson(json);
+    }
+    if (TypeDefinitionParams.canParse(json, nullLspJsonReporter)) {
+      return TypeDefinitionParams.fromJson(json);
+    }
+    if (ImplementationParams.canParse(json, nullLspJsonReporter)) {
+      return ImplementationParams.fromJson(json);
+    }
+    if (ReferenceParams.canParse(json, nullLspJsonReporter)) {
+      return ReferenceParams.fromJson(json);
+    }
+    if (DocumentHighlightParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentHighlightParams.fromJson(json);
+    }
+    if (DocumentSymbolParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentSymbolParams.fromJson(json);
+    }
+    if (CodeActionParams.canParse(json, nullLspJsonReporter)) {
+      return CodeActionParams.fromJson(json);
+    }
+    if (CodeLensParams.canParse(json, nullLspJsonReporter)) {
+      return CodeLensParams.fromJson(json);
+    }
+    if (DocumentLinkParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentLinkParams.fromJson(json);
+    }
+    if (DocumentColorParams.canParse(json, nullLspJsonReporter)) {
+      return DocumentColorParams.fromJson(json);
+    }
+    if (ColorPresentationParams.canParse(json, nullLspJsonReporter)) {
+      return ColorPresentationParams.fromJson(json);
+    }
+    if (FoldingRangeParams.canParse(json, nullLspJsonReporter)) {
+      return FoldingRangeParams.fromJson(json);
+    }
+    if (SelectionRangeParams.canParse(json, nullLspJsonReporter)) {
+      return SelectionRangeParams.fromJson(json);
+    }
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return PartialResultParams(partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type PartialResultParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PartialResultParams &&
+        other.runtimeType == PartialResultParams) {
+      return partialResultToken == other.partialResultToken && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class Position implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(Position.canParse, Position.fromJson);
 
-  Position(this.line, this.character) {
+  Position({@required this.line, @required this.character}) {
     if (line == null) {
       throw 'line is required but was not provided';
     }
@@ -8612,7 +15032,7 @@
   static Position fromJson(Map<String, dynamic> json) {
     final line = json['line'];
     final character = json['character'];
-    return Position(line, character);
+    return Position(line: line, character: character);
   }
 
   /// Character offset on a line in a document (zero-based). Assuming that the
@@ -8697,11 +15117,406 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class PrepareRenameParams implements TextDocumentPositionParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      PrepareRenameParams.canParse, PrepareRenameParams.fromJson);
+
+  PrepareRenameParams({@required this.textDocument, @required this.position}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (position == null) {
+      throw 'position is required but was not provided';
+    }
+  }
+  static PrepareRenameParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
+    return PrepareRenameParams(textDocument: textDocument, position: position);
+  }
+
+  /// The position inside the text document.
+  final Position position;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['position'] =
+        position ?? (throw 'position is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['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;
+        }
+        if (obj['position'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Position.canParse(obj['position'], reporter))) {
+          reporter.reportError('must be of type Position');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type PrepareRenameParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PrepareRenameParams &&
+        other.runtimeType == PrepareRenameParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ProgressParams<T> implements ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(ProgressParams.canParse, ProgressParams.fromJson);
+
+  ProgressParams({@required this.token, @required this.value}) {
+    if (token == null) {
+      throw 'token is required but was not provided';
+    }
+    if (value == null) {
+      throw 'value is required but was not provided';
+    }
+  }
+  static ProgressParams<T> fromJson<T>(Map<String, dynamic> json) {
+    final token = json['token'] is num
+        ? Either2<num, String>.t1(json['token'])
+        : (json['token'] is String
+            ? Either2<num, String>.t2(json['token'])
+            : (throw '''${json['token']} was not one of (num, String)'''));
+    final value = json['value'];
+    return ProgressParams<T>(token: token, value: value);
+  }
+
+  /// The progress token provided by the client or server.
+  final Either2<num, String> token;
+
+  /// The progress data.
+  final T value;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['token'] = token ?? (throw 'token is required but was not set');
+    __result['value'] = value ?? (throw 'value is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('token');
+      try {
+        if (!obj.containsKey('token')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['token'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((obj['token'] is num || obj['token'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('value');
+      try {
+        if (!obj.containsKey('value')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['value'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(true /* T.canParse(obj['value']) */)) {
+          reporter.reportError('must be of type T');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ProgressParams<T>');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ProgressParams && other.runtimeType == ProgressParams) {
+      return token == other.token && value == other.value && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, token.hashCode);
+    hash = JenkinsSmiHash.combine(hash, value.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class PublishDiagnosticsClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      PublishDiagnosticsClientCapabilities.canParse,
+      PublishDiagnosticsClientCapabilities.fromJson);
+
+  PublishDiagnosticsClientCapabilities(
+      {this.relatedInformation, this.tagSupport, this.versionSupport});
+  static PublishDiagnosticsClientCapabilities fromJson(
+      Map<String, dynamic> json) {
+    final relatedInformation = json['relatedInformation'];
+    final tagSupport = json['tagSupport'] != null
+        ? PublishDiagnosticsClientCapabilitiesTagSupport.fromJson(
+            json['tagSupport'])
+        : null;
+    final versionSupport = json['versionSupport'];
+    return PublishDiagnosticsClientCapabilities(
+        relatedInformation: relatedInformation,
+        tagSupport: tagSupport,
+        versionSupport: versionSupport);
+  }
+
+  /// Whether the clients accepts diagnostics with related information.
+  final bool relatedInformation;
+
+  /// Client supports the tag property to provide meta data about a diagnostic.
+  /// Clients supporting tags have to handle unknown tags gracefully.
+  ///  @since 3.15.0
+  final PublishDiagnosticsClientCapabilitiesTagSupport tagSupport;
+
+  /// Whether the client interprets the version property of the
+  /// `textDocument/publishDiagnostics` notification's parameter.
+  ///  @since 3.15.0
+  final bool versionSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (relatedInformation != null) {
+      __result['relatedInformation'] = relatedInformation;
+    }
+    if (tagSupport != null) {
+      __result['tagSupport'] = tagSupport;
+    }
+    if (versionSupport != null) {
+      __result['versionSupport'] = versionSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('relatedInformation');
+      try {
+        if (obj['relatedInformation'] != null &&
+            !(obj['relatedInformation'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('tagSupport');
+      try {
+        if (obj['tagSupport'] != null &&
+            !(PublishDiagnosticsClientCapabilitiesTagSupport.canParse(
+                obj['tagSupport'], reporter))) {
+          reporter.reportError(
+              'must be of type PublishDiagnosticsClientCapabilitiesTagSupport');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('versionSupport');
+      try {
+        if (obj['versionSupport'] != null && !(obj['versionSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter
+          .reportError('must be of type PublishDiagnosticsClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PublishDiagnosticsClientCapabilities &&
+        other.runtimeType == PublishDiagnosticsClientCapabilities) {
+      return relatedInformation == other.relatedInformation &&
+          tagSupport == other.tagSupport &&
+          versionSupport == other.versionSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, relatedInformation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, tagSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, versionSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class PublishDiagnosticsClientCapabilitiesTagSupport implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      PublishDiagnosticsClientCapabilitiesTagSupport.canParse,
+      PublishDiagnosticsClientCapabilitiesTagSupport.fromJson);
+
+  PublishDiagnosticsClientCapabilitiesTagSupport({@required this.valueSet}) {
+    if (valueSet == null) {
+      throw 'valueSet is required but was not provided';
+    }
+  }
+  static PublishDiagnosticsClientCapabilitiesTagSupport fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? DiagnosticTag.fromJson(item) : null)
+        ?.cast<DiagnosticTag>()
+        ?.toList();
+    return PublishDiagnosticsClientCapabilitiesTagSupport(valueSet: valueSet);
+  }
+
+  /// The tags supported by the client.
+  final List<DiagnosticTag> valueSet;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['valueSet'] =
+        valueSet ?? (throw 'valueSet is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('valueSet');
+      try {
+        if (!obj.containsKey('valueSet')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['valueSet'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((obj['valueSet'] is List &&
+            (obj['valueSet']
+                .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 PublishDiagnosticsClientCapabilitiesTagSupport');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is PublishDiagnosticsClientCapabilitiesTagSupport &&
+        other.runtimeType == PublishDiagnosticsClientCapabilitiesTagSupport) {
+      return listEqual(valueSet, other.valueSet,
+              (DiagnosticTag a, DiagnosticTag b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(valueSet));
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class PublishDiagnosticsParams implements ToJsonable {
   static const jsonHandler = LspJsonHandler(
       PublishDiagnosticsParams.canParse, PublishDiagnosticsParams.fromJson);
 
-  PublishDiagnosticsParams(this.uri, this.diagnostics) {
+  PublishDiagnosticsParams(
+      {@required this.uri, this.version, @required this.diagnostics}) {
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
@@ -8711,11 +15526,13 @@
   }
   static PublishDiagnosticsParams fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
+    final version = json['version'];
     final diagnostics = json['diagnostics']
         ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
-    return PublishDiagnosticsParams(uri, diagnostics);
+    return PublishDiagnosticsParams(
+        uri: uri, version: version, diagnostics: diagnostics);
   }
 
   /// An array of diagnostic information items.
@@ -8724,9 +15541,17 @@
   /// The URI for which diagnostic information is reported.
   final String uri;
 
+  /// Optional the version number of the document the diagnostics are published
+  /// for.
+  ///  @since 3.15.0
+  final num version;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['uri'] = uri ?? (throw 'uri is required but was not set');
+    if (version != null) {
+      __result['version'] = version;
+    }
     __result['diagnostics'] =
         diagnostics ?? (throw 'diagnostics is required but was not set');
     return __result;
@@ -8751,6 +15576,15 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('version');
+      try {
+        if (obj['version'] != null && !(obj['version'] is num)) {
+          reporter.reportError('must be of type num');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('diagnostics');
       try {
         if (!obj.containsKey('diagnostics')) {
@@ -8782,6 +15616,7 @@
     if (other is PublishDiagnosticsParams &&
         other.runtimeType == PublishDiagnosticsParams) {
       return uri == other.uri &&
+          version == other.version &&
           listEqual(diagnostics, other.diagnostics,
               (Diagnostic a, Diagnostic b) => a == b) &&
           true;
@@ -8793,6 +15628,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, version.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(diagnostics));
     return JenkinsSmiHash.finish(hash);
   }
@@ -8804,7 +15640,7 @@
 class Range implements ToJsonable {
   static const jsonHandler = LspJsonHandler(Range.canParse, Range.fromJson);
 
-  Range(this.start, this.end) {
+  Range({@required this.start, @required this.end}) {
     if (start == null) {
       throw 'start is required but was not provided';
     }
@@ -8816,7 +15652,7 @@
     final start =
         json['start'] != null ? Position.fromJson(json['start']) : null;
     final end = json['end'] != null ? Position.fromJson(json['end']) : null;
-    return Range(start, end);
+    return Range(start: start, end: end);
   }
 
   /// The range's end position.
@@ -8899,7 +15735,7 @@
   static const jsonHandler = LspJsonHandler(
       RangeAndPlaceholder.canParse, RangeAndPlaceholder.fromJson);
 
-  RangeAndPlaceholder(this.range, this.placeholder) {
+  RangeAndPlaceholder({@required this.range, @required this.placeholder}) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
@@ -8910,7 +15746,7 @@
   static RangeAndPlaceholder fromJson(Map<String, dynamic> json) {
     final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final placeholder = json['placeholder'];
-    return RangeAndPlaceholder(range, placeholder);
+    return RangeAndPlaceholder(range: range, placeholder: placeholder);
   }
 
   final String placeholder;
@@ -8988,18 +15824,80 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class ReferenceClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ReferenceClientCapabilities.canParse,
+      ReferenceClientCapabilities.fromJson);
+
+  ReferenceClientCapabilities({this.dynamicRegistration});
+  static ReferenceClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return ReferenceClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether references supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ReferenceClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ReferenceClientCapabilities &&
+        other.runtimeType == ReferenceClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class ReferenceContext implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(ReferenceContext.canParse, ReferenceContext.fromJson);
 
-  ReferenceContext(this.includeDeclaration) {
+  ReferenceContext({@required this.includeDeclaration}) {
     if (includeDeclaration == null) {
       throw 'includeDeclaration is required but was not provided';
     }
   }
   static ReferenceContext fromJson(Map<String, dynamic> json) {
     final includeDeclaration = json['includeDeclaration'];
-    return ReferenceContext(includeDeclaration);
+    return ReferenceContext(includeDeclaration: includeDeclaration);
   }
 
   /// Include the declaration of the current symbol.
@@ -9057,11 +15955,82 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class ReferenceParams implements TextDocumentPositionParams, ToJsonable {
+class ReferenceOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(ReferenceOptions.canParse, ReferenceOptions.fromJson);
+
+  ReferenceOptions({this.workDoneProgress});
+  static ReferenceOptions fromJson(Map<String, dynamic> json) {
+    if (ReferenceRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return ReferenceRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return ReferenceOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ReferenceOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ReferenceOptions && other.runtimeType == ReferenceOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ReferenceParams
+    implements
+        TextDocumentPositionParams,
+        WorkDoneProgressParams,
+        PartialResultParams,
+        ToJsonable {
   static const jsonHandler =
       LspJsonHandler(ReferenceParams.canParse, ReferenceParams.fromJson);
 
-  ReferenceParams(this.context, this.textDocument, this.position) {
+  ReferenceParams(
+      {@required this.context,
+      @required this.textDocument,
+      @required this.position,
+      this.workDoneToken,
+      this.partialResultToken}) {
     if (context == null) {
       throw 'context is required but was not provided';
     }
@@ -9081,17 +16050,43 @@
         : null;
     final position =
         json['position'] != null ? Position.fromJson(json['position']) : null;
-    return ReferenceParams(context, textDocument, position);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return ReferenceParams(
+        context: context,
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
   }
 
   final ReferenceContext context;
 
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
   /// The position inside the text document.
   final Position position;
 
   /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     __result['context'] =
@@ -9100,6 +16095,12 @@
         textDocument ?? (throw 'textDocument is required but was not set');
     __result['position'] =
         position ?? (throw 'position is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
+    if (partialResultToken != null) {
+      __result['partialResultToken'] = partialResultToken;
+    }
     return __result;
   }
 
@@ -9156,6 +16157,28 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type ReferenceParams');
@@ -9169,6 +16192,8 @@
       return context == other.context &&
           textDocument == other.textDocument &&
           position == other.position &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
           true;
     }
     return false;
@@ -9180,6 +16205,98 @@
     hash = JenkinsSmiHash.combine(hash, context.hashCode);
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ReferenceRegistrationOptions
+    implements TextDocumentRegistrationOptions, ReferenceOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      ReferenceRegistrationOptions.canParse,
+      ReferenceRegistrationOptions.fromJson);
+
+  ReferenceRegistrationOptions({this.documentSelector, this.workDoneProgress});
+  static ReferenceRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final workDoneProgress = json['workDoneProgress'];
+    return ReferenceRegistrationOptions(
+        documentSelector: documentSelector, 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 bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type ReferenceRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is ReferenceRegistrationOptions &&
+        other.runtimeType == ReferenceRegistrationOptions) {
+      return listEqual(documentSelector, other.documentSelector,
+              (DocumentFilter a, DocumentFilter b) => a == b) &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -9192,7 +16309,8 @@
   static const jsonHandler =
       LspJsonHandler(Registration.canParse, Registration.fromJson);
 
-  Registration(this.id, this.method, this.registerOptions) {
+  Registration(
+      {@required this.id, @required this.method, this.registerOptions}) {
     if (id == null) {
       throw 'id is required but was not provided';
     }
@@ -9204,7 +16322,8 @@
     final id = json['id'];
     final method = json['method'];
     final registerOptions = json['registerOptions'];
-    return Registration(id, method, registerOptions);
+    return Registration(
+        id: id, method: method, registerOptions: registerOptions);
   }
 
   /// The id used to register the request. The id can be used to deregister the
@@ -9307,7 +16426,7 @@
   static const jsonHandler =
       LspJsonHandler(RegistrationParams.canParse, RegistrationParams.fromJson);
 
-  RegistrationParams(this.registrations) {
+  RegistrationParams({@required this.registrations}) {
     if (registrations == null) {
       throw 'registrations is required but was not provided';
     }
@@ -9317,7 +16436,7 @@
         ?.map((item) => item != null ? Registration.fromJson(item) : null)
         ?.cast<Registration>()
         ?.toList();
-    return RegistrationParams(registrations);
+    return RegistrationParams(registrations: registrations);
   }
 
   final List<Registration> registrations;
@@ -9379,12 +16498,99 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class RenameClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      RenameClientCapabilities.canParse, RenameClientCapabilities.fromJson);
+
+  RenameClientCapabilities({this.dynamicRegistration, this.prepareSupport});
+  static RenameClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final prepareSupport = json['prepareSupport'];
+    return RenameClientCapabilities(
+        dynamicRegistration: dynamicRegistration,
+        prepareSupport: prepareSupport);
+  }
+
+  /// Whether rename supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// Client supports testing for validity of rename operations before
+  /// execution.
+  ///  @since version 3.12.0
+  final bool prepareSupport;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (prepareSupport != null) {
+      __result['prepareSupport'] = prepareSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('prepareSupport');
+      try {
+        if (obj['prepareSupport'] != null && !(obj['prepareSupport'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type RenameClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is RenameClientCapabilities &&
+        other.runtimeType == RenameClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          prepareSupport == other.prepareSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, prepareSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 /// Rename file operation
 class RenameFile implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(RenameFile.canParse, RenameFile.fromJson);
 
-  RenameFile(this.kind, this.oldUri, this.newUri, this.options) {
+  RenameFile(
+      {@required this.kind,
+      @required this.oldUri,
+      @required this.newUri,
+      this.options}) {
     if (kind == null) {
       throw 'kind is required but was not provided';
     }
@@ -9402,7 +16608,8 @@
     final options = json['options'] != null
         ? RenameFileOptions.fromJson(json['options'])
         : null;
-    return RenameFile(kind, oldUri, newUri, options);
+    return RenameFile(
+        kind: kind, oldUri: oldUri, newUri: newUri, options: options);
   }
 
   /// A rename
@@ -9529,11 +16736,12 @@
   static const jsonHandler =
       LspJsonHandler(RenameFileOptions.canParse, RenameFileOptions.fromJson);
 
-  RenameFileOptions(this.overwrite, this.ignoreIfExists);
+  RenameFileOptions({this.overwrite, this.ignoreIfExists});
   static RenameFileOptions fromJson(Map<String, dynamic> json) {
     final overwrite = json['overwrite'];
     final ignoreIfExists = json['ignoreIfExists'];
-    return RenameFileOptions(overwrite, ignoreIfExists);
+    return RenameFileOptions(
+        overwrite: overwrite, ignoreIfExists: ignoreIfExists);
   }
 
   /// Ignores if target exists.
@@ -9602,25 +16810,33 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Rename options
-class RenameOptions implements ToJsonable {
+class RenameOptions implements WorkDoneProgressOptions, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(RenameOptions.canParse, RenameOptions.fromJson);
 
-  RenameOptions(this.prepareProvider);
+  RenameOptions({this.prepareProvider, this.workDoneProgress});
   static RenameOptions fromJson(Map<String, dynamic> json) {
+    if (RenameRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return RenameRegistrationOptions.fromJson(json);
+    }
     final prepareProvider = json['prepareProvider'];
-    return RenameOptions(prepareProvider);
+    final workDoneProgress = json['workDoneProgress'];
+    return RenameOptions(
+        prepareProvider: prepareProvider, workDoneProgress: workDoneProgress);
   }
 
   /// Renames should be checked and tested before being executed.
   final bool prepareProvider;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
     if (prepareProvider != null) {
       __result['prepareProvider'] = prepareProvider;
     }
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
@@ -9636,6 +16852,16 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type RenameOptions');
@@ -9646,7 +16872,9 @@
   @override
   bool operator ==(Object other) {
     if (other is RenameOptions && other.runtimeType == RenameOptions) {
-      return prepareProvider == other.prepareProvider && true;
+      return prepareProvider == other.prepareProvider &&
+          workDoneProgress == other.workDoneProgress &&
+          true;
     }
     return false;
   }
@@ -9655,6 +16883,7 @@
   int get hashCode {
     var hash = 0;
     hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -9662,54 +16891,93 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-class RenameParams implements ToJsonable {
+class RenameParams
+    implements TextDocumentPositionParams, WorkDoneProgressParams, ToJsonable {
   static const jsonHandler =
       LspJsonHandler(RenameParams.canParse, RenameParams.fromJson);
 
-  RenameParams(this.textDocument, this.position, this.newName) {
+  RenameParams(
+      {@required this.newName,
+      @required this.textDocument,
+      @required this.position,
+      this.workDoneToken}) {
+    if (newName == null) {
+      throw 'newName is required but was not provided';
+    }
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
     }
     if (position == null) {
       throw 'position is required but was not provided';
     }
-    if (newName == null) {
-      throw 'newName is required but was not provided';
-    }
   }
   static RenameParams fromJson(Map<String, dynamic> json) {
+    final newName = json['newName'];
     final textDocument = json['textDocument'] != null
         ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final position =
         json['position'] != null ? Position.fromJson(json['position']) : null;
-    final newName = json['newName'];
-    return RenameParams(textDocument, position, newName);
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    return RenameParams(
+        newName: newName,
+        textDocument: textDocument,
+        position: position,
+        workDoneToken: workDoneToken);
   }
 
   /// The new name of the symbol. If the given name is not valid the request
   /// must return a [ResponseError] with an appropriate message set.
   final String newName;
 
-  /// The position at which this request was sent.
+  /// The position inside the text document.
   final Position position;
 
-  /// The document to rename.
+  /// The text document.
   final TextDocumentIdentifier textDocument;
 
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['newName'] =
+        newName ?? (throw 'newName is required but was not set');
     __result['textDocument'] =
         textDocument ?? (throw 'textDocument is required but was not set');
     __result['position'] =
         position ?? (throw 'position is required but was not set');
-    __result['newName'] =
-        newName ?? (throw 'newName is required but was not set');
+    if (workDoneToken != null) {
+      __result['workDoneToken'] = workDoneToken;
+    }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
+      reporter.push('newName');
+      try {
+        if (!obj.containsKey('newName')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['newName'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(obj['newName'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       reporter.push('textDocument');
       try {
         if (!obj.containsKey('textDocument')) {
@@ -9744,18 +17012,12 @@
       } finally {
         reporter.pop();
       }
-      reporter.push('newName');
+      reporter.push('workDoneToken');
       try {
-        if (!obj.containsKey('newName')) {
-          reporter.reportError('must not be undefined');
-          return false;
-        }
-        if (obj['newName'] == null) {
-          reporter.reportError('must not be null');
-          return false;
-        }
-        if (!(obj['newName'] is String)) {
-          reporter.reportError('must be of type String');
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
           return false;
         }
       } finally {
@@ -9771,9 +17033,10 @@
   @override
   bool operator ==(Object other) {
     if (other is RenameParams && other.runtimeType == RenameParams) {
-      return textDocument == other.textDocument &&
+      return newName == other.newName &&
+          textDocument == other.textDocument &&
           position == other.position &&
-          newName == other.newName &&
+          workDoneToken == other.workDoneToken &&
           true;
     }
     return false;
@@ -9782,9 +17045,10 @@
   @override
   int get hashCode {
     var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, newName.hashCode);
     hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
     hash = JenkinsSmiHash.combine(hash, position.hashCode);
-    hash = JenkinsSmiHash.combine(hash, newName.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -9793,48 +17057,47 @@
 }
 
 class RenameRegistrationOptions
-    implements TextDocumentRegistrationOptions, ToJsonable {
+    implements TextDocumentRegistrationOptions, RenameOptions, ToJsonable {
   static const jsonHandler = LspJsonHandler(
       RenameRegistrationOptions.canParse, RenameRegistrationOptions.fromJson);
 
-  RenameRegistrationOptions(this.prepareProvider, this.documentSelector);
+  RenameRegistrationOptions(
+      {this.documentSelector, this.prepareProvider, this.workDoneProgress});
   static RenameRegistrationOptions fromJson(Map<String, dynamic> json) {
-    final prepareProvider = json['prepareProvider'];
     final documentSelector = json['documentSelector']
         ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
-    return RenameRegistrationOptions(prepareProvider, documentSelector);
+    final prepareProvider = json['prepareProvider'];
+    final workDoneProgress = json['workDoneProgress'];
+    return RenameRegistrationOptions(
+        documentSelector: documentSelector,
+        prepareProvider: prepareProvider,
+        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;
 
-  /// Renames should be checked and tested for validity before being executed.
+  /// Renames should be checked and tested before being executed.
   final bool prepareProvider;
+  final bool workDoneProgress;
 
   Map<String, dynamic> toJson() {
     var __result = <String, dynamic>{};
+    __result['documentSelector'] = documentSelector;
     if (prepareProvider != null) {
       __result['prepareProvider'] = prepareProvider;
     }
-    __result['documentSelector'] = documentSelector;
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
     return __result;
   }
 
   static bool canParse(Object obj, LspJsonReporter reporter) {
     if (obj is Map<String, dynamic>) {
-      reporter.push('prepareProvider');
-      try {
-        if (obj['prepareProvider'] != null &&
-            !(obj['prepareProvider'] is bool)) {
-          reporter.reportError('must be of type bool');
-          return false;
-        }
-      } finally {
-        reporter.pop();
-      }
       reporter.push('documentSelector');
       try {
         if (!obj.containsKey('documentSelector')) {
@@ -9851,6 +17114,26 @@
       } finally {
         reporter.pop();
       }
+      reporter.push('prepareProvider');
+      try {
+        if (obj['prepareProvider'] != null &&
+            !(obj['prepareProvider'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
       return true;
     } else {
       reporter.reportError('must be of type RenameRegistrationOptions');
@@ -9862,9 +17145,10 @@
   bool operator ==(Object other) {
     if (other is RenameRegistrationOptions &&
         other.runtimeType == RenameRegistrationOptions) {
-      return prepareProvider == other.prepareProvider &&
-          listEqual(documentSelector, other.documentSelector,
+      return listEqual(documentSelector, other.documentSelector,
               (DocumentFilter a, DocumentFilter b) => a == b) &&
+          prepareProvider == other.prepareProvider &&
+          workDoneProgress == other.workDoneProgress &&
           true;
     }
     return false;
@@ -9873,8 +17157,9 @@
   @override
   int get hashCode {
     var hash = 0;
-    hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
     hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 
@@ -9886,7 +17171,11 @@
   static const jsonHandler =
       LspJsonHandler(RequestMessage.canParse, RequestMessage.fromJson);
 
-  RequestMessage(this.id, this.method, this.params, this.jsonrpc) {
+  RequestMessage(
+      {@required this.id,
+      @required this.method,
+      this.params,
+      @required this.jsonrpc}) {
     if (id == null) {
       throw 'id is required but was not provided';
     }
@@ -9907,7 +17196,8 @@
         json['method'] != null ? Method.fromJson(json['method']) : null;
     final params = json['params'];
     final jsonrpc = json['jsonrpc'];
-    return RequestMessage(id, method, params, jsonrpc);
+    return RequestMessage(
+        id: id, method: method, params: params, jsonrpc: jsonrpc);
   }
 
   /// The request id.
@@ -10064,11 +17354,11 @@
       o is ResourceOperationKind && o._value == _value;
 }
 
-class ResponseError<D> implements ToJsonable {
+class ResponseError implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(ResponseError.canParse, ResponseError.fromJson);
 
-  ResponseError(this.code, this.message, this.data) {
+  ResponseError({@required this.code, @required this.message, this.data}) {
     if (code == null) {
       throw 'code is required but was not provided';
     }
@@ -10076,12 +17366,12 @@
       throw 'message is required but was not provided';
     }
   }
-  static ResponseError<D> fromJson<D>(Map<String, dynamic> json) {
+  static ResponseError fromJson(Map<String, dynamic> json) {
     final code =
         json['code'] != null ? ErrorCodes.fromJson(json['code']) : null;
     final message = json['message'];
     final data = json['data'];
-    return ResponseError<D>(code, message, data);
+    return ResponseError(code: code, message: message, data: data);
   }
 
   /// A number indicating the error type that occurred.
@@ -10152,7 +17442,7 @@
       }
       return true;
     } else {
-      reporter.reportError('must be of type ResponseError<D>');
+      reporter.reportError('must be of type ResponseError');
       return false;
     }
   }
@@ -10185,7 +17475,7 @@
   static const jsonHandler =
       LspJsonHandler(ResponseMessage.canParse, ResponseMessage.fromJson);
 
-  ResponseMessage(this.id, this.result, this.error, this.jsonrpc) {
+  ResponseMessage({this.id, this.result, this.error, @required this.jsonrpc}) {
     if (jsonrpc == null) {
       throw 'jsonrpc is required but was not provided';
     }
@@ -10199,15 +17489,15 @@
                 ? null
                 : (throw '''${json['id']} was not one of (num, String)''')));
     final result = json['result'];
-    final error = json['error'] != null
-        ? ResponseError.fromJson<dynamic>(json['error'])
-        : null;
+    final error =
+        json['error'] != null ? ResponseError.fromJson(json['error']) : null;
     final jsonrpc = json['jsonrpc'];
-    return ResponseMessage(id, result, error, jsonrpc);
+    return ResponseMessage(
+        id: id, result: result, error: error, jsonrpc: jsonrpc);
   }
 
   /// The error object in case a request fails.
-  final ResponseError<dynamic> error;
+  final ResponseError error;
 
   /// The request id.
   final Either2<num, String> id;
@@ -10260,7 +17550,7 @@
       try {
         if (obj['error'] != null &&
             !(ResponseError.canParse(obj['error'], reporter))) {
-          reporter.reportError('must be of type ResponseError<dynamic>');
+          reporter.reportError('must be of type ResponseError');
           return false;
         }
       } finally {
@@ -10316,15 +17606,14 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Save options.
 class SaveOptions implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(SaveOptions.canParse, SaveOptions.fromJson);
 
-  SaveOptions(this.includeText);
+  SaveOptions({this.includeText});
   static SaveOptions fromJson(Map<String, dynamic> json) {
     final includeText = json['includeText'];
-    return SaveOptions(includeText);
+    return SaveOptions(includeText: includeText);
   }
 
   /// The client is supposed to include the content on save.
@@ -10375,35 +17664,536 @@
   String toString() => jsonEncoder.convert(toJson());
 }
 
+class SelectionRange implements ToJsonable {
+  static const jsonHandler =
+      LspJsonHandler(SelectionRange.canParse, SelectionRange.fromJson);
+
+  SelectionRange({@required this.range, this.parent}) {
+    if (range == null) {
+      throw 'range is required but was not provided';
+    }
+  }
+  static SelectionRange fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+    final parent =
+        json['parent'] != null ? SelectionRange.fromJson(json['parent']) : null;
+    return SelectionRange(range: range, parent: parent);
+  }
+
+  /// The parent selection range containing this range. Therefore `parent.range`
+  /// must contain `this.range`.
+  final SelectionRange parent;
+
+  /// The range ([Range]) of this selection range.
+  final Range range;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['range'] = range ?? (throw 'range is required but was not set');
+    if (parent != null) {
+      __result['parent'] = parent;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('range');
+      try {
+        if (!obj.containsKey('range')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['range'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(Range.canParse(obj['range'], reporter))) {
+          reporter.reportError('must be of type Range');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('parent');
+      try {
+        if (obj['parent'] != null &&
+            !(SelectionRange.canParse(obj['parent'], reporter))) {
+          reporter.reportError('must be of type SelectionRange');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type SelectionRange');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SelectionRange && other.runtimeType == SelectionRange) {
+      return range == other.range && parent == other.parent && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, parent.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class SelectionRangeClientCapabilities implements ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      SelectionRangeClientCapabilities.canParse,
+      SelectionRangeClientCapabilities.fromJson);
+
+  SelectionRangeClientCapabilities({this.dynamicRegistration});
+  static SelectionRangeClientCapabilities fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return SelectionRangeClientCapabilities(
+        dynamicRegistration: dynamicRegistration);
+  }
+
+  /// Whether implementation supports dynamic registration for selection range
+  /// providers. If this is set to `true` the client supports the new
+  /// `SelectionRangeRegistrationOptions` return value for the corresponding
+  /// server capability as well.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('dynamicRegistration');
+      try {
+        if (obj['dynamicRegistration'] != null &&
+            !(obj['dynamicRegistration'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type SelectionRangeClientCapabilities');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SelectionRangeClientCapabilities &&
+        other.runtimeType == SelectionRangeClientCapabilities) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class SelectionRangeOptions implements WorkDoneProgressOptions, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      SelectionRangeOptions.canParse, SelectionRangeOptions.fromJson);
+
+  SelectionRangeOptions({this.workDoneProgress});
+  static SelectionRangeOptions fromJson(Map<String, dynamic> json) {
+    if (SelectionRangeRegistrationOptions.canParse(json, nullLspJsonReporter)) {
+      return SelectionRangeRegistrationOptions.fromJson(json);
+    }
+    final workDoneProgress = json['workDoneProgress'];
+    return SelectionRangeOptions(workDoneProgress: workDoneProgress);
+  }
+
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    if (workDoneProgress != null) {
+      __result['workDoneProgress'] = workDoneProgress;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj, LspJsonReporter reporter) {
+    if (obj is Map<String, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type SelectionRangeOptions');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SelectionRangeOptions &&
+        other.runtimeType == SelectionRangeOptions) {
+      return workDoneProgress == other.workDoneProgress && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class SelectionRangeParams
+    implements WorkDoneProgressParams, PartialResultParams, ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      SelectionRangeParams.canParse, SelectionRangeParams.fromJson);
+
+  SelectionRangeParams(
+      {@required this.textDocument,
+      @required this.positions,
+      this.workDoneToken,
+      this.partialResultToken}) {
+    if (textDocument == null) {
+      throw 'textDocument is required but was not provided';
+    }
+    if (positions == null) {
+      throw 'positions is required but was not provided';
+    }
+  }
+  static SelectionRangeParams fromJson(Map<String, dynamic> json) {
+    final textDocument = json['textDocument'] != null
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
+        : null;
+    final positions = json['positions']
+        ?.map((item) => item != null ? Position.fromJson(item) : null)
+        ?.cast<Position>()
+        ?.toList();
+    final workDoneToken = json['workDoneToken'] is num
+        ? Either2<num, String>.t1(json['workDoneToken'])
+        : (json['workDoneToken'] is String
+            ? Either2<num, String>.t2(json['workDoneToken'])
+            : (json['workDoneToken'] == null
+                ? null
+                : (throw '''${json['workDoneToken']} was not one of (num, String)''')));
+    final partialResultToken = json['partialResultToken'] is num
+        ? Either2<num, String>.t1(json['partialResultToken'])
+        : (json['partialResultToken'] is String
+            ? Either2<num, String>.t2(json['partialResultToken'])
+            : (json['partialResultToken'] == null
+                ? null
+                : (throw '''${json['partialResultToken']} was not one of (num, String)''')));
+    return SelectionRangeParams(
+        textDocument: textDocument,
+        positions: positions,
+        workDoneToken: workDoneToken,
+        partialResultToken: partialResultToken);
+  }
+
+  /// An optional token that a server can use to report partial results (e.g.
+  /// streaming) to the client.
+  final Either2<num, String> partialResultToken;
+
+  /// The positions inside the text document.
+  final List<Position> positions;
+
+  /// The text document.
+  final TextDocumentIdentifier textDocument;
+
+  /// An optional token that a server can use to report work done progress.
+  final Either2<num, String> workDoneToken;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    __result['textDocument'] =
+        textDocument ?? (throw 'textDocument is required but was not set');
+    __result['positions'] =
+        positions ?? (throw 'positions is required but was not set');
+    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, dynamic>) {
+      reporter.push('textDocument');
+      try {
+        if (!obj.containsKey('textDocument')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['textDocument'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!(TextDocumentIdentifier.canParse(obj['textDocument'], reporter))) {
+          reporter.reportError('must be of type TextDocumentIdentifier');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('positions');
+      try {
+        if (!obj.containsKey('positions')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['positions'] == null) {
+          reporter.reportError('must not be null');
+          return false;
+        }
+        if (!((obj['positions'] is List &&
+            (obj['positions']
+                .every((item) => Position.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<Position>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('workDoneToken');
+      try {
+        if (obj['workDoneToken'] != null &&
+            !((obj['workDoneToken'] is num ||
+                obj['workDoneToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('partialResultToken');
+      try {
+        if (obj['partialResultToken'] != null &&
+            !((obj['partialResultToken'] is num ||
+                obj['partialResultToken'] is String))) {
+          reporter.reportError('must be of type Either2<num, String>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type SelectionRangeParams');
+      return false;
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is SelectionRangeParams &&
+        other.runtimeType == SelectionRangeParams) {
+      return textDocument == other.textDocument &&
+          listEqual(
+              positions, other.positions, (Position a, Position b) => a == b) &&
+          workDoneToken == other.workDoneToken &&
+          partialResultToken == other.partialResultToken &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(positions));
+    hash = JenkinsSmiHash.combine(hash, workDoneToken.hashCode);
+    hash = JenkinsSmiHash.combine(hash, partialResultToken.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class SelectionRangeRegistrationOptions
+    implements
+        SelectionRangeOptions,
+        TextDocumentRegistrationOptions,
+        StaticRegistrationOptions,
+        ToJsonable {
+  static const jsonHandler = LspJsonHandler(
+      SelectionRangeRegistrationOptions.canParse,
+      SelectionRangeRegistrationOptions.fromJson);
+
+  SelectionRangeRegistrationOptions(
+      {this.workDoneProgress, this.documentSelector, this.id});
+  static SelectionRangeRegistrationOptions fromJson(Map<String, dynamic> json) {
+    final workDoneProgress = json['workDoneProgress'];
+    final documentSelector = json['documentSelector']
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
+        ?.cast<DocumentFilter>()
+        ?.toList();
+    final id = json['id'];
+    return SelectionRangeRegistrationOptions(
+        workDoneProgress: workDoneProgress,
+        documentSelector: documentSelector,
+        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;
+
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
+  final String id;
+  final bool workDoneProgress;
+
+  Map<String, dynamic> toJson() {
+    var __result = <String, dynamic>{};
+    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, dynamic>) {
+      reporter.push('workDoneProgress');
+      try {
+        if (obj['workDoneProgress'] != null &&
+            !(obj['workDoneProgress'] is bool)) {
+          reporter.reportError('must be of type bool');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('documentSelector');
+      try {
+        if (!obj.containsKey('documentSelector')) {
+          reporter.reportError('must not be undefined');
+          return false;
+        }
+        if (obj['documentSelector'] != null &&
+            !((obj['documentSelector'] is List &&
+                (obj['documentSelector'].every(
+                    (item) => DocumentFilter.canParse(item, reporter)))))) {
+          reporter.reportError('must be of type List<DocumentFilter>');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      reporter.push('id');
+      try {
+        if (obj['id'] != null && !(obj['id'] is String)) {
+          reporter.reportError('must be of type String');
+          return false;
+        }
+      } finally {
+        reporter.pop();
+      }
+      return true;
+    } else {
+      reporter.reportError('must be of type SelectionRangeRegistrationOptions');
+      return false;
+    }
+  }
+
+  @override
+  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) &&
+          id == other.id &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workDoneProgress.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lspHashCode(documentSelector));
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
 class ServerCapabilities implements ToJsonable {
   static const jsonHandler =
       LspJsonHandler(ServerCapabilities.canParse, ServerCapabilities.fromJson);
 
   ServerCapabilities(
-      this.textDocumentSync,
-      this.hoverProvider,
+      {this.textDocumentSync,
       this.completionProvider,
+      this.hoverProvider,
       this.signatureHelpProvider,
+      this.declarationProvider,
       this.definitionProvider,
       this.typeDefinitionProvider,
       this.implementationProvider,
       this.referencesProvider,
       this.documentHighlightProvider,
       this.documentSymbolProvider,
-      this.workspaceSymbolProvider,
       this.codeActionProvider,
       this.codeLensProvider,
+      this.documentLinkProvider,
+      this.colorProvider,
       this.documentFormattingProvider,
       this.documentRangeFormattingProvider,
       this.documentOnTypeFormattingProvider,
       this.renameProvider,
-      this.documentLinkProvider,
-      this.colorProvider,
       this.foldingRangeProvider,
-      this.declarationProvider,
       this.executeCommandProvider,
+      this.selectionRangeProvider,
+      this.workspaceSymbolProvider,
       this.workspace,
-      this.experimental);
+      this.experimental});
   static ServerCapabilities fromJson(Map<String, dynamic> json) {
     final textDocumentSync = TextDocumentSyncOptions.canParse(
             json['textDocumentSync'], nullLspJsonReporter)
@@ -10416,20 +18206,124 @@
             : (json['textDocumentSync'] == null
                 ? null
                 : (throw '''${json['textDocumentSync']} was not one of (TextDocumentSyncOptions, num)''')));
-    final hoverProvider = json['hoverProvider'];
     final completionProvider = json['completionProvider'] != null
         ? CompletionOptions.fromJson(json['completionProvider'])
         : null;
+    final hoverProvider = json['hoverProvider'] is bool
+        ? Either2<bool, HoverOptions>.t1(json['hoverProvider'])
+        : (HoverOptions.canParse(json['hoverProvider'], nullLspJsonReporter)
+            ? Either2<bool, HoverOptions>.t2(json['hoverProvider'] != null
+                ? HoverOptions.fromJson(json['hoverProvider'])
+                : null)
+            : (json['hoverProvider'] == null
+                ? null
+                : (throw '''${json['hoverProvider']} was not one of (bool, HoverOptions)''')));
     final signatureHelpProvider = json['signatureHelpProvider'] != null
         ? SignatureHelpOptions.fromJson(json['signatureHelpProvider'])
         : null;
-    final definitionProvider = json['definitionProvider'];
-    final typeDefinitionProvider = json['typeDefinitionProvider'];
-    final implementationProvider = json['implementationProvider'];
-    final referencesProvider = json['referencesProvider'];
-    final documentHighlightProvider = json['documentHighlightProvider'];
-    final documentSymbolProvider = json['documentSymbolProvider'];
-    final workspaceSymbolProvider = json['workspaceSymbolProvider'];
+    final declarationProvider = json['declarationProvider'] is bool
+        ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t1(
+            json['declarationProvider'])
+        : (DeclarationOptions.canParse(
+                json['declarationProvider'], nullLspJsonReporter)
+            ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t2(
+                json['declarationProvider'] != null
+                    ? DeclarationOptions.fromJson(json['declarationProvider'])
+                    : null)
+            : (DeclarationRegistrationOptions.canParse(
+                    json['declarationProvider'], nullLspJsonReporter)
+                ? Either3<bool, DeclarationOptions, DeclarationRegistrationOptions>.t3(
+                    json['declarationProvider'] != null
+                        ? DeclarationRegistrationOptions.fromJson(
+                            json['declarationProvider'])
+                        : null)
+                : (json['declarationProvider'] == null
+                    ? null
+                    : (throw '''${json['declarationProvider']} was not one of (bool, DeclarationOptions, DeclarationRegistrationOptions)'''))));
+    final definitionProvider = json['definitionProvider'] is bool
+        ? Either2<bool, DefinitionOptions>.t1(json['definitionProvider'])
+        : (DefinitionOptions.canParse(
+                json['definitionProvider'], nullLspJsonReporter)
+            ? Either2<bool, DefinitionOptions>.t2(
+                json['definitionProvider'] != null
+                    ? DefinitionOptions.fromJson(json['definitionProvider'])
+                    : null)
+            : (json['definitionProvider'] == null
+                ? null
+                : (throw '''${json['definitionProvider']} was not one of (bool, DefinitionOptions)''')));
+    final typeDefinitionProvider = json['typeDefinitionProvider'] is bool
+        ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t1(
+            json['typeDefinitionProvider'])
+        : (TypeDefinitionOptions.canParse(
+                json['typeDefinitionProvider'], nullLspJsonReporter)
+            ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t2(json['typeDefinitionProvider'] != null
+                ? TypeDefinitionOptions.fromJson(json['typeDefinitionProvider'])
+                : null)
+            : (TypeDefinitionRegistrationOptions.canParse(
+                    json['typeDefinitionProvider'], nullLspJsonReporter)
+                ? Either3<bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions>.t3(
+                    json['typeDefinitionProvider'] != null
+                        ? TypeDefinitionRegistrationOptions.fromJson(
+                            json['typeDefinitionProvider'])
+                        : null)
+                : (json['typeDefinitionProvider'] == null
+                    ? null
+                    : (throw '''${json['typeDefinitionProvider']} was not one of (bool, TypeDefinitionOptions, TypeDefinitionRegistrationOptions)'''))));
+    final implementationProvider = json['implementationProvider'] is bool
+        ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t1(
+            json['implementationProvider'])
+        : (ImplementationOptions.canParse(
+                json['implementationProvider'], nullLspJsonReporter)
+            ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t2(json['implementationProvider'] != null
+                ? ImplementationOptions.fromJson(json['implementationProvider'])
+                : null)
+            : (ImplementationRegistrationOptions.canParse(
+                    json['implementationProvider'], nullLspJsonReporter)
+                ? Either3<bool, ImplementationOptions, ImplementationRegistrationOptions>.t3(
+                    json['implementationProvider'] != null
+                        ? ImplementationRegistrationOptions.fromJson(
+                            json['implementationProvider'])
+                        : null)
+                : (json['implementationProvider'] == null
+                    ? null
+                    : (throw '''${json['implementationProvider']} was not one of (bool, ImplementationOptions, ImplementationRegistrationOptions)'''))));
+    final referencesProvider = json['referencesProvider'] is bool
+        ? Either2<bool, ReferenceOptions>.t1(json['referencesProvider'])
+        : (ReferenceOptions.canParse(
+                json['referencesProvider'], nullLspJsonReporter)
+            ? Either2<bool, ReferenceOptions>.t2(
+                json['referencesProvider'] != null
+                    ? ReferenceOptions.fromJson(json['referencesProvider'])
+                    : null)
+            : (json['referencesProvider'] == null
+                ? null
+                : (throw '''${json['referencesProvider']} was not one of (bool, ReferenceOptions)''')));
+    final documentHighlightProvider = json['documentHighlightProvider'] is bool
+        ? Either2<bool, DocumentHighlightOptions>.t1(
+            json['documentHighlightProvider'])
+        : (DocumentHighlightOptions.canParse(
+                json['documentHighlightProvider'], nullLspJsonReporter)
+            ? Either2<bool, DocumentHighlightOptions>.t2(
+                json['documentHighlightProvider'] != null
+                    ? DocumentHighlightOptions.fromJson(
+                        json['documentHighlightProvider'])
+                    : null)
+            : (json['documentHighlightProvider'] == null
+                ? null
+                : (throw '''${json['documentHighlightProvider']} was not one of (bool, DocumentHighlightOptions)''')));
+    final documentSymbolProvider = json['documentSymbolProvider'] is bool
+        ? Either2<bool, DocumentSymbolOptions>.t1(
+            json['documentSymbolProvider'])
+        : (DocumentSymbolOptions.canParse(
+                json['documentSymbolProvider'], nullLspJsonReporter)
+            ? Either2<bool, DocumentSymbolOptions>.t2(
+                json['documentSymbolProvider'] != null
+                    ? DocumentSymbolOptions.fromJson(
+                        json['documentSymbolProvider'])
+                    : null)
+            : (json['documentSymbolProvider'] == null
+                ? null
+                : (throw '''${json['documentSymbolProvider']} was not one of (bool, DocumentSymbolOptions)''')));
     final codeActionProvider = json['codeActionProvider'] is bool
         ? Either2<bool, CodeActionOptions>.t1(json['codeActionProvider'])
         : (CodeActionOptions.canParse(
@@ -10444,9 +18338,56 @@
     final codeLensProvider = json['codeLensProvider'] != null
         ? CodeLensOptions.fromJson(json['codeLensProvider'])
         : null;
-    final documentFormattingProvider = json['documentFormattingProvider'];
-    final documentRangeFormattingProvider =
-        json['documentRangeFormattingProvider'];
+    final documentLinkProvider = json['documentLinkProvider'] != null
+        ? DocumentLinkOptions.fromJson(json['documentLinkProvider'])
+        : null;
+    final colorProvider = json['colorProvider'] is bool
+        ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t1(
+            json['colorProvider'])
+        : (DocumentColorOptions.canParse(
+                json['colorProvider'], nullLspJsonReporter)
+            ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t2(
+                json['colorProvider'] != null
+                    ? DocumentColorOptions.fromJson(json['colorProvider'])
+                    : null)
+            : (DocumentColorRegistrationOptions.canParse(
+                    json['colorProvider'], nullLspJsonReporter)
+                ? Either3<bool, DocumentColorOptions, DocumentColorRegistrationOptions>.t3(
+                    json['colorProvider'] != null
+                        ? DocumentColorRegistrationOptions.fromJson(
+                            json['colorProvider'])
+                        : null)
+                : (json['colorProvider'] == null
+                    ? null
+                    : (throw '''${json['colorProvider']} was not one of (bool, DocumentColorOptions, DocumentColorRegistrationOptions)'''))));
+    final documentFormattingProvider = json['documentFormattingProvider']
+            is bool
+        ? Either2<bool, DocumentFormattingOptions>.t1(
+            json['documentFormattingProvider'])
+        : (DocumentFormattingOptions.canParse(
+                json['documentFormattingProvider'], nullLspJsonReporter)
+            ? Either2<bool, DocumentFormattingOptions>.t2(
+                json['documentFormattingProvider'] != null
+                    ? DocumentFormattingOptions.fromJson(
+                        json['documentFormattingProvider'])
+                    : null)
+            : (json['documentFormattingProvider'] == null
+                ? null
+                : (throw '''${json['documentFormattingProvider']} was not one of (bool, DocumentFormattingOptions)''')));
+    final documentRangeFormattingProvider = json[
+            'documentRangeFormattingProvider'] is bool
+        ? Either2<bool, DocumentRangeFormattingOptions>.t1(
+            json['documentRangeFormattingProvider'])
+        : (DocumentRangeFormattingOptions.canParse(
+                json['documentRangeFormattingProvider'], nullLspJsonReporter)
+            ? Either2<bool, DocumentRangeFormattingOptions>.t2(
+                json['documentRangeFormattingProvider'] != null
+                    ? DocumentRangeFormattingOptions.fromJson(
+                        json['documentRangeFormattingProvider'])
+                    : null)
+            : (json['documentRangeFormattingProvider'] == null
+                ? null
+                : (throw '''${json['documentRangeFormattingProvider']} was not one of (bool, DocumentRangeFormattingOptions)''')));
     final documentOnTypeFormattingProvider =
         json['documentOnTypeFormattingProvider'] != null
             ? DocumentOnTypeFormattingOptions.fromJson(
@@ -10461,44 +18402,77 @@
             : (json['renameProvider'] == null
                 ? null
                 : (throw '''${json['renameProvider']} was not one of (bool, RenameOptions)''')));
-    final documentLinkProvider = json['documentLinkProvider'] != null
-        ? DocumentLinkOptions.fromJson(json['documentLinkProvider'])
-        : null;
-    final colorProvider = json['colorProvider'];
-    final foldingRangeProvider = json['foldingRangeProvider'];
-    final declarationProvider = json['declaratio