From d755ed14e8884eb5b9696430d87aecac632cfa63 Mon Sep 17 00:00:00 2001
From: tgodzik <tgodzik@virtuslab.com>
Date: Sat, 17 Aug 2024 14:20:21 +0200
Subject: [PATCH] refactor: Drop GlobalSymbolTable

---
 build.sbt                                     |   8 +-
 dep.txt                                       | 694 ++++++++++++++++++
 .../implementation/Supermethods.scala         |   1 +
 .../internal/metals/ConnectionProvider.scala  |   3 +-
 .../scala/meta/internal/metals/Indexer.scala  |   2 +-
 .../internal/metals/MetalsLspService.scala    |   4 +-
 .../metals/ProjectMetalsLspService.scala      |   2 +-
 .../internal/metals/ReferenceProvider.scala   |   1 +
 .../internal/metals/SqlSharedIndices.scala    |   2 +-
 .../codeactions/ConvertToNamedArguments.scala |   2 +-
 .../metals/debug/DebugDiscovery.scala         |   2 +-
 .../meta/internal/rename/RenameProvider.scala |  98 ++-
 .../internal/search/GlobalClassTable.scala    |  33 -
 .../internal/search/SymbolHierarchyOps.scala  |  18 +-
 .../meta/internal/tvp/ScalacpCopyPaste.scala  | 498 -------------
 .../internal/mtags/MtagsEnrichments.scala     | 142 ----
 .../mtags/ScalametaCommonEnrichments.scala    |   3 +
 ...cala => InlayHintsScala2ExpectSuite.scala} |   4 +-
 .../test/scala/tests/WarningsLspSuite.scala   |   4 +-
 19 files changed, 779 insertions(+), 742 deletions(-)
 create mode 100644 dep.txt
 delete mode 100644 metals/src/main/scala/scala/meta/internal/search/GlobalClassTable.scala
 delete mode 100644 metals/src/main/scala/scala/meta/internal/tvp/ScalacpCopyPaste.scala
 rename tests/slow/src/test/scala/tests/feature/{InlayHintsScala3ExpectSuite.scala => InlayHintsScala2ExpectSuite.scala} (85%)

diff --git a/build.sbt b/build.sbt
index 365105c6d9f..992985c0909 100644
--- a/build.sbt
+++ b/build.sbt
@@ -468,8 +468,10 @@ lazy val metals = project
       V.lsp4j,
       // for DAP
       V.dap4j,
-      ("ch.epfl.scala" %% "scala-debug-adapter" % V.debugAdapter)
-        .cross(CrossVersion.for3Use2_13),
+      withExcludes(
+        ("ch.epfl.scala" %% "scala-debug-adapter" % V.debugAdapter)
+          .cross(CrossVersion.for3Use2_13)
+      ),
       // for finding paths of global log/cache directories
       "dev.dirs" % "directories" % "26",
       // ==================
@@ -495,7 +497,7 @@ lazy val metals = project
       "com.outr" %% "scribe-file" % V.scribe,
       "com.outr" %% "scribe-slf4j2" % V.scribe, // needed for flyway database migrations
       // for JSON formatted doctor
-      "com.lihaoyi" %% "ujson" % "4.0.0",
+      "com.lihaoyi" %% "ujson" % "3.3.1",
       // For fetching projects' templates
       "com.lihaoyi" %% "requests" % "0.9.0",
       // for producing SemanticDB from Scala source files, to be sure we want the same version of scalameta
diff --git a/dep.txt b/dep.txt
new file mode 100644
index 00000000000..a8a743121ba
--- /dev/null
+++ b/dep.txt
@@ -0,0 +1,694 @@
+[info] welcome to sbt 1.9.9 (Eclipse Adoptium Java 17.0.6)
+[info] loading global plugins from /home/tgodzik/.sbt/1.0/plugins
+[info] loading settings for project metals-build-build-build from metals.sbt ...
+[info] loading project definition from /home/tgodzik/Documents/metals/project/project/project
+[info] loading settings for project metals-build-build from metals.sbt ...
+[info] loading project definition from /home/tgodzik/Documents/metals/project/project
+[success] Generated .bloop/metals-build-build.json
+[success] Total time: 1 s, completed Aug 16, 2024, 6:21:30 PM
+[info] loading settings for project metals-build from metals.sbt,plugins.sbt ...
+[info] loading project definition from /home/tgodzik/Documents/metals/project
+[success] Generated .bloop/metals-build.json
+[success] Total time: 1 s, completed Aug 16, 2024, 6:21:32 PM
+[info] loading settings for project default-ce2872 from build.sbt ...
+[info] resolving key references (19696 settings) ...
+[info]              _        _     
+[info]   /\/\   ___| |_ __ _| |___ 
+[info]  /    \ / _ \ __/ _` | / __|
+[info] / /\/\ \  __/ || (_| | \__ \
+[info] \/    \/\___|\__\__,_|_|___/
+[info] 
+[info] Useful sbt tasks:
+[info] a. unit/testOnly tests.DefinitionSuite - run a specific unit test suite.
+[info] b. unit/testOnly tests.DefinitionSuite -- *exact-test-name* - run a specific test case inside the unit test suite.
+[info] c. unit/testOnly tests.DefinitionSuite -- -F - use `-F` flag to show the full stack trace in case it is missing
+[info] d. slow/testOnly -- tests.sbt.* - run all slow tests inside tests.sbt package, they will publish needed mtags locally.
+[info] e. ~cross/testOnly tests.hover.HoverTermSuite - automatically rerun on changes a specific presentation compiler test, great for edit/test/debug workflows.
+[info] f. +cross/test - run all presentation compiler tests for all non-deprecated Scala versions.
+[info] g. publishLocal - publish Metals for the currently used Scala version.
+[info] h. +publishLocal - publish Metals for all supported used Scala versions.
+[info] i. quick-publish-local - publish Metals artifacts but with only limited set of Scala versions
+[info] j. ++3.3.3 mtags/publishLocal - publish changes for a single Scala version, especially useful if working on a feature inside mtags module. `publishLocal` will still need to be run before at least once.
+[warn] there's a key that's not used by any other settings/tasks:
+[warn]  
+[warn] * ThisBuild / scalafixScalaBinaryVersion
+[warn]   +- /home/tgodzik/Documents/metals/build.sbt:39
+[warn]  
+[warn] note: a setting might still be used by a command; to exclude a key from this `lintUnused` check
+[warn] either append it to `Global / excludeLintKeys` or call .withRank(KeyRanks.Invisible) on the key
+[info] org.scalameta:metals_3:1.3.6-SNAPSHOT
+[info]   +-ch.epfl.scala:bloop-rifle_2.13:2.0.0-RC1 [S]
+[info]   | +-ch.epfl.scala:bsp4j:2.1.1 (evicted by: 2.2.0-M2)
+[info]   | +-ch.epfl.scala:bsp4j:2.2.0-M2
+[info]   | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.20.1
+[info]   | | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.20.1 (evicted by: 0.23..
+[info]   | | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   | | | | +-com.google.code.gson:gson:2.11.0
+[info]   | | | | | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | | | | | 
+[info]   | | | | +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   | | | | 
+[info]   | | | +-org.eclipse.xtend:org.eclipse.xtend.lib:2.28.0
+[info]   | | |   +-org.eclipse.xtend:org.eclipse.xtend.lib.macro:2.28.0
+[info]   | | |   | +-org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.28.0
+[info]   | | |   |   +-com.google.guava:guava:33.2.1-jre
+[info]   | | |   |     +-com.google.code.findbugs:jsr305:3.0.2
+[info]   | | |   |     +-com.google.errorprone:error_prone_annotations:2.26.1 (evicte..
+[info]   | | |   |     +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | | |   |     +-com.google.guava:failureaccess:1.0.2
+[info]   | | |   |     +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-conf..
+[info]   | | |   |     +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   | | |   |     +-org.checkerframework:checker-qual:3.42.0
+[info]   | | |   |     
+[info]   | | |   +-org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.28.0
+[info]   | | |     +-com.google.guava:guava:33.2.1-jre
+[info]   | | |       +-com.google.code.findbugs:jsr305:3.0.2
+[info]   | | |       +-com.google.errorprone:error_prone_annotations:2.26.1 (evicted ..
+[info]   | | |       +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | | |       +-com.google.guava:failureaccess:1.0.2
+[info]   | | |       +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-confli..
+[info]   | | |       +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   | | |       +-org.checkerframework:checker-qual:3.42.0
+[info]   | | |       
+[info]   | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.20.1 (evicted by: 0.23.1)
+[info]   | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   | |   +-com.google.code.gson:gson:2.11.0
+[info]   | |   | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | |   | 
+[info]   | |   +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   | |   
+[info]   | +-ch.epfl.scala:libdaemon_2.13:0.0.12
+[info]   | +-io.github.alexarchambault.scala-cli.snailgun:snailgun-core_2.13:0.4.1-sc..
+[info]   | 
+[info]   +-ch.epfl.scala:bsp4j:2.2.0-M2
+[info]   | +-org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.20.1
+[info]   | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.20.1 (evicted by: 0.23.1)
+[info]   | | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   | | | +-com.google.code.gson:gson:2.11.0
+[info]   | | | | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | | | | 
+[info]   | | | +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   | | | 
+[info]   | | +-org.eclipse.xtend:org.eclipse.xtend.lib:2.28.0
+[info]   | |   +-org.eclipse.xtend:org.eclipse.xtend.lib.macro:2.28.0
+[info]   | |   | +-org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.28.0
+[info]   | |   |   +-com.google.guava:guava:33.2.1-jre
+[info]   | |   |     +-com.google.code.findbugs:jsr305:3.0.2
+[info]   | |   |     +-com.google.errorprone:error_prone_annotations:2.26.1 (evicted ..
+[info]   | |   |     +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | |   |     +-com.google.guava:failureaccess:1.0.2
+[info]   | |   |     +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-confli..
+[info]   | |   |     +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   | |   |     +-org.checkerframework:checker-qual:3.42.0
+[info]   | |   |     
+[info]   | |   +-org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.28.0
+[info]   | |     +-com.google.guava:guava:33.2.1-jre
+[info]   | |       +-com.google.code.findbugs:jsr305:3.0.2
+[info]   | |       +-com.google.errorprone:error_prone_annotations:2.26.1 (evicted by..
+[info]   | |       +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | |       +-com.google.guava:failureaccess:1.0.2
+[info]   | |       +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict..
+[info]   | |       +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   | |       +-org.checkerframework:checker-qual:3.42.0
+[info]   | |       
+[info]   | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.20.1 (evicted by: 0.23.1)
+[info]   | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   |   +-com.google.code.gson:gson:2.11.0
+[info]   |   | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |   | 
+[info]   |   +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   |   
+[info]   +-ch.epfl.scala:scala-debug-adapter_2.13:4.2.0 [S]
+[info]   | +-ch.epfl.scala:com-microsoft-java-debug-core:0.34.0+31
+[info]   | | +-com.google.code.gson:gson:2.11.0
+[info]   | | | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | | | 
+[info]   | | +-commons-io:commons-io:2.16.1
+[info]   | | +-io.reactivex.rxjava2:rxjava:2.2.21
+[info]   | | | +-org.reactivestreams:reactive-streams:1.0.3 (evicted by: 1.0.4)
+[info]   | | | +-org.reactivestreams:reactive-streams:1.0.4
+[info]   | | | 
+[info]   | | +-org.apache.commons:commons-lang3:3.14.0
+[info]   | | +-org.reactivestreams:reactive-streams:1.0.4
+[info]   | | 
+[info]   | +-org.ow2.asm:asm-util:9.7
+[info]   | | +-org.ow2.asm:asm-analysis:9.7
+[info]   | | | +-org.ow2.asm:asm-tree:9.7
+[info]   | | |   +-org.ow2.asm:asm:9.7
+[info]   | | |   
+[info]   | | +-org.ow2.asm:asm-tree:9.7
+[info]   | | | +-org.ow2.asm:asm:9.7
+[info]   | | | 
+[info]   | | +-org.ow2.asm:asm:9.7
+[info]   | | 
+[info]   | +-org.ow2.asm:asm:9.7
+[info]   | +-org.scala-lang.modules:scala-parallel-collections_2.13:1.0.4 [S]
+[info]   | +-org.scala-lang:scala-reflect:2.13.14 [S]
+[info]   | +-org.scala-sbt:test-agent:1.10.1
+[info]   | | +-org.scala-sbt:test-interface:1.0
+[info]   | | 
+[info]   | +-org.scalameta:parsers_2.13:4.9.7 (evicted by: 4.9.9)
+[info]   | +-org.scalameta:parsers_2.13:4.9.9 [S]
+[info]   |   +-org.scalameta:trees_2.13:4.9.9 [S]
+[info]   |     +-org.scalameta:common_2.13:4.9.9 [S]
+[info]   |       +-com.lihaoyi:sourcecode_2.13:0.4.2 [S]
+[info]   |       
+[info]   +-ch.epfl.scala:scalafix-interfaces:0.12.1
+[info]   | +-io.get-coursier:interface:1.0.19
+[info]   |   +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   |   +-org.slf4j:slf4j-api:2.0.13
+[info]   |   
+[info]   +-com.google.guava:guava:33.2.1-jre
+[info]   | +-com.google.code.findbugs:jsr305:3.0.2
+[info]   | +-com.google.errorprone:error_prone_annotations:2.26.1 (evicted by: 2.27.0)
+[info]   | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | +-com.google.guava:failureaccess:1.0.2
+[info]   | +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-gu..
+[info]   | +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   | +-org.checkerframework:checker-qual:3.42.0
+[info]   | 
+[info]   +-com.googlecode.java-diff-utils:diffutils:1.3.0
+[info]   +-com.h2database:h2:2.3.230
+[info]   +-com.lihaoyi:requests_3:0.9.0
+[info]   | +-com.lihaoyi:geny_3:1.0.0 (evicted by: 1.1.1)
+[info]   | +-com.lihaoyi:geny_3:1.1.1
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.1.1 (evicted by: 3.4.2)
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | 
+[info]   +-com.lihaoyi:ujson_3:4.0.0
+[info]   | +-com.lihaoyi:upickle-core_3:4.0.0
+[info]   | | +-com.lihaoyi:geny_3:1.1.1
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | 
+[info]   +-com.outr:scribe-file_3:3.15.0
+[info]   | +-com.outr:scribe_3:3.15.0
+[info]   | | +-com.lihaoyi:sourcecode_3:0.4.2
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-com.outr:moduload_3:1.1.7
+[info]   | | | +-org.scala-lang.modules:scala-collection-compat_3:2.11.0 (evicted by:..
+[info]   | | | +-org.scala-lang.modules:scala-collection-compat_3:2.12.0
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.2.2 (evicted by: 3.4.2)
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.0 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-com.outr:perfolation_3:1.2.11
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cyc..
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | 
+[info]   +-com.outr:scribe-slf4j2_3:3.15.0
+[info]   | +-com.outr:scribe_3:3.15.0
+[info]   | | +-com.lihaoyi:sourcecode_3:0.4.2
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-com.outr:moduload_3:1.1.7
+[info]   | | | +-org.scala-lang.modules:scala-collection-compat_3:2.11.0 (evicted by:..
+[info]   | | | +-org.scala-lang.modules:scala-collection-compat_3:2.12.0
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.2.2 (evicted by: 3.4.2)
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.0 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-com.outr:perfolation_3:1.2.11
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cyc..
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | +-org.slf4j:slf4j-api:2.0.13
+[info]   | 
+[info]   +-com.outr:scribe_3:3.15.0
+[info]   | +-com.lihaoyi:sourcecode_3:0.4.2
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-com.outr:moduload_3:1.1.7
+[info]   | | +-org.scala-lang.modules:scala-collection-compat_3:2.11.0 (evicted by: 2..
+[info]   | | +-org.scala-lang.modules:scala-collection-compat_3:2.12.0
+[info]   | | | +-org.scala-lang:scala3-library_3:3.2.2 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.0 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-com.outr:perfolation_3:1.2.11
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | 
+[info]   +-com.swoval:file-tree-views:2.1.12
+[info]   +-dev.dirs:directories:26
+[info]   +-io.get-coursier:coursier-sbt-maven-repository_2.13:2.1.10 [S]
+[info]   | +-io.get-coursier:coursier-core_2.13:2.1.10 [S]
+[info]   |   +-io.get-coursier:coursier-util_2.13:2.1.10 [S]
+[info]   |   +-io.github.alexarchambault:concurrent-reference-hash-map:1.1.0
+[info]   |   
+[info]   +-io.get-coursier:coursier_2.13:2.1.10 [S]
+[info]   | +-com.github.plokhotnyuk.jsoniter-scala:jsoniter-scala-core_2.13:2.13.5 (e..
+[info]   | +-com.github.plokhotnyuk.jsoniter-scala:jsoniter-scala-core_2.13:2.13.5.2 ..
+[info]   | +-io.get-coursier:coursier-cache_2.13:2.1.10 [S]
+[info]   | | +-io.get-coursier.jniutils:windows-jni-utils:0.3.3
+[info]   | | +-io.get-coursier:coursier-util_2.13:2.1.10 [S]
+[info]   | | +-io.github.alexarchambault.windows-ansi:windows-ansi:0.0.5
+[info]   | | | +-org.fusesource.jansi:jansi:1.18
+[info]   | | | 
+[info]   | | +-org.codehaus.plexus:plexus-archiver:4.9.0
+[info]   | | | +-com.github.luben:zstd-jni:1.5.5-10
+[info]   | | | +-commons-io:commons-io:2.15.0 (evicted by: 2.16.1)
+[info]   | | | +-commons-io:commons-io:2.16.1
+[info]   | | | +-javax.inject:javax.inject:1
+[info]   | | | +-org.apache.commons:commons-compress:1.24.0
+[info]   | | | +-org.codehaus.plexus:plexus-io:3.4.1
+[info]   | | | | +-commons-io:commons-io:2.11.0 (evicted by: 2.16.1)
+[info]   | | | | +-commons-io:commons-io:2.16.1
+[info]   | | | | +-javax.inject:javax.inject:1
+[info]   | | | | +-org.codehaus.plexus:plexus-utils:3.5.0 (evicted by: 4.0.0)
+[info]   | | | | +-org.codehaus.plexus:plexus-utils:4.0.0
+[info]   | | | | 
+[info]   | | | +-org.codehaus.plexus:plexus-utils:4.0.0
+[info]   | | | +-org.iq80.snappy:snappy:0.4
+[info]   | | | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   | | | +-org.slf4j:slf4j-api:2.0.13
+[info]   | | | +-org.tukaani:xz:1.9
+[info]   | | | 
+[info]   | | +-org.codehaus.plexus:plexus-container-default:2.1.1
+[info]   | | | +-org.apache.xbean:xbean-reflect:3.7
+[info]   | | | +-org.codehaus.plexus:plexus-classworlds:2.6.0
+[info]   | | | +-org.codehaus.plexus:plexus-utils:3.1.1 (evicted by: 4.0.0)
+[info]   | | | +-org.codehaus.plexus:plexus-utils:4.0.0
+[info]   | | | 
+[info]   | | +-org.virtuslab.scala-cli:config_2.13:0.2.1 [S]
+[info]   | |   +-com.github.plokhotnyuk.jsoniter-scala:jsoniter-scala-core_2.13:2.13...
+[info]   | |   
+[info]   | +-io.get-coursier:coursier-core_2.13:2.1.10 [S]
+[info]   | | +-io.get-coursier:coursier-util_2.13:2.1.10 [S]
+[info]   | | +-io.github.alexarchambault:concurrent-reference-hash-map:1.1.0
+[info]   | | 
+[info]   | +-io.get-coursier:coursier-proxy-setup:2.1.10
+[info]   | 
+[info]   +-io.get-coursier:interface:1.0.19
+[info]   | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   | +-org.slf4j:slf4j-api:2.0.13
+[info]   | 
+[info]   +-io.get-coursier:versions_2.13:0.3.2 [S]
+[info]   +-io.github.alexarchambault.ammonite:ammonite-runner_2.13:0.4.0 [S]
+[info]   | +-io.get-coursier:coursier-launcher_2.13:2.0.16 [S]
+[info]   | +-io.get-coursier:interface:1.0.19
+[info]   | | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   | | +-org.slf4j:slf4j-api:2.0.13
+[info]   | | 
+[info]   | +-io.get-coursier:interface:1.0.8 (evicted by: 1.0.19)
+[info]   | 
+[info]   +-io.undertow:undertow-core:2.2.20.Final
+[info]   | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   | +-org.jboss.threads:jboss-threads:3.1.0.Final
+[info]   | | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   | | +-org.wildfly.common:wildfly-common:1.5.0.Final (evicted by: 1.5.4.Final)
+[info]   | | +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   | | 
+[info]   | +-org.jboss.xnio:xnio-api:3.8.16.Final
+[info]   | | +-org.jboss.threads:jboss-threads:2.3.6.Final (evicted by: 3.1.0.Final)
+[info]   | | +-org.jboss.threads:jboss-threads:3.1.0.Final
+[info]   | | | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   | | | +-org.wildfly.common:wildfly-common:1.5.0.Final (evicted by: 1.5.4.Fin..
+[info]   | | | +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   | | | 
+[info]   | | +-org.wildfly.client:wildfly-client-config:1.0.1.Final
+[info]   | | | +-org.jboss.logging:jboss-logging:3.3.1.Final (evicted by: 3.4.1.Final)
+[info]   | | | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   | | | 
+[info]   | | +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   | | 
+[info]   | +-org.jboss.xnio:xnio-api:3.8.7.Final (evicted by: 3.8.16.Final)
+[info]   | +-org.jboss.xnio:xnio-nio:3.8.16.Final
+[info]   | | +-org.jboss.xnio:xnio-api:3.8.16.Final
+[info]   | |   +-org.jboss.threads:jboss-threads:2.3.6.Final (evicted by: 3.1.0.Final)
+[info]   | |   +-org.jboss.threads:jboss-threads:3.1.0.Final
+[info]   | |   | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   | |   | +-org.wildfly.common:wildfly-common:1.5.0.Final (evicted by: 1.5.4.F..
+[info]   | |   | +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   | |   | 
+[info]   | |   +-org.wildfly.client:wildfly-client-config:1.0.1.Final
+[info]   | |   | +-org.jboss.logging:jboss-logging:3.3.1.Final (evicted by: 3.4.1.Fin..
+[info]   | |   | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   | |   | 
+[info]   | |   +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   | |   
+[info]   | +-org.jboss.xnio:xnio-nio:3.8.7.Final (evicted by: 3.8.16.Final)
+[info]   | 
+[info]   +-org.eclipse.jdt:org.eclipse.jdt.core:3.25.0
+[info]   +-org.eclipse.lsp4j:org.eclipse.lsp4j.debug:0.23.1
+[info]   | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc.debug:0.23.1
+[info]   |   +-com.google.code.gson:gson:2.11.0
+[info]   |   | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |   | 
+[info]   |   +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   |   +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   |     +-com.google.code.gson:gson:2.11.0
+[info]   |     | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |     | 
+[info]   |     +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   |     
+[info]   +-org.eclipse.lsp4j:org.eclipse.lsp4j:0.23.1
+[info]   | +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   |   +-com.google.code.gson:gson:2.11.0
+[info]   |   | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |   | 
+[info]   |   +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   |   
+[info]   +-org.eclipse.platform:org.eclipse.ant.core:3.5.500
+[info]   +-org.eclipse.platform:org.eclipse.compare.core:3.6.600
+[info]   +-org.eclipse.platform:org.eclipse.core.commands:3.9.500
+[info]   +-org.eclipse.platform:org.eclipse.core.contenttype:3.7.500
+[info]   +-org.eclipse.platform:org.eclipse.core.expressions:3.6.500
+[info]   +-org.eclipse.platform:org.eclipse.core.filesystem:1.7.500
+[info]   +-org.eclipse.platform:org.eclipse.core.jobs:3.10.500
+[info]   +-org.eclipse.platform:org.eclipse.core.resources:3.13.500
+[info]   +-org.eclipse.platform:org.eclipse.core.runtime:3.16.0
+[info]   +-org.eclipse.platform:org.eclipse.core.variables:3.4.600
+[info]   +-org.eclipse.platform:org.eclipse.equinox.app:1.4.300
+[info]   +-org.eclipse.platform:org.eclipse.equinox.common:3.10.600
+[info]   +-org.eclipse.platform:org.eclipse.equinox.preferences:3.7.600
+[info]   +-org.eclipse.platform:org.eclipse.equinox.registry:3.8.600
+[info]   +-org.eclipse.platform:org.eclipse.osgi:3.15.0
+[info]   +-org.eclipse.platform:org.eclipse.team.core:3.8.700
+[info]   +-org.eclipse.platform:org.eclipse.text:3.9.0
+[info]   +-org.flywaydb:flyway-core:9.22.3
+[info]   | +-com.fasterxml.jackson.dataformat:jackson-dataformat-toml:2.15.2
+[info]   | | +-com.fasterxml.jackson.core:jackson-core:2.15.2
+[info]   | | +-com.fasterxml.jackson.core:jackson-databind:2.15.2
+[info]   | |   +-com.fasterxml.jackson.core:jackson-annotations:2.15.2
+[info]   | |   +-com.fasterxml.jackson.core:jackson-core:2.15.2
+[info]   | |   
+[info]   | +-com.google.code.gson:gson:2.10.1 (evicted by: 2.11.0)
+[info]   | +-com.google.code.gson:gson:2.11.0
+[info]   |   +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |   
+[info]   +-org.jboss.xnio:xnio-nio:3.8.16.Final
+[info]   | +-org.jboss.xnio:xnio-api:3.8.16.Final
+[info]   |   +-org.jboss.threads:jboss-threads:2.3.6.Final (evicted by: 3.1.0.Final)
+[info]   |   +-org.jboss.threads:jboss-threads:3.1.0.Final
+[info]   |   | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   |   | +-org.wildfly.common:wildfly-common:1.5.0.Final (evicted by: 1.5.4.Fin..
+[info]   |   | +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   |   | 
+[info]   |   +-org.wildfly.client:wildfly-client-config:1.0.1.Final
+[info]   |   | +-org.jboss.logging:jboss-logging:3.3.1.Final (evicted by: 3.4.1.Final)
+[info]   |   | +-org.jboss.logging:jboss-logging:3.4.1.Final
+[info]   |   | 
+[info]   |   +-org.wildfly.common:wildfly-common:1.5.4.Final
+[info]   |   
+[info]   +-org.openjdk.jol:jol-core:0.17
+[info]   +-org.scala-lang.modules:scala-parallel-collections_3:1.0.4
+[info]   | +-org.scala-lang:scala3-library_3:3.0.2 (evicted by: 3.4.2)
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | 
+[info]   +-org.scala-lang.modules:scala-xml_3:2.3.0
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | 
+[info]   +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   +-org.scala-sbt.ipcsocket:ipcsocket:1.6.2
+[info]   | +-net.java.dev.jna:jna-platform:5.12.0
+[info]   | | +-net.java.dev.jna:jna:5.12.0
+[info]   | | 
+[info]   | +-net.java.dev.jna:jna:5.12.0
+[info]   | 
+[info]   +-org.scalameta:mdoc-interfaces:2.5.4
+[info]   | +-io.get-coursier:interface:1.0.19
+[info]   |   +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   |   +-org.slf4j:slf4j-api:2.0.13
+[info]   |   
+[info]   +-org.scalameta:metaconfig-core_3:0.13.0
+[info]   | +-org.scala-lang.modules:scala-collection-compat_3:2.12.0
+[info]   | | +-org.scala-lang:scala3-library_3:3.2.2 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala-reflect:2.13.14 [S]
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | +-org.scalameta:metaconfig-pprint_3:0.13.0
+[info]   | | +-com.lihaoyi:fansi_3:0.5.0
+[info]   | | | +-com.lihaoyi:sourcecode_3:0.4.0 (evicted by: 0.4.2)
+[info]   | | | +-com.lihaoyi:sourcecode_3:0.4.2
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.typelevel:paiges-core_3:0.4.4
+[info]   |   +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   |   | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   |   | 
+[info]   |   +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   |   
+[info]   +-org.scalameta:mtags-java_3:1.3.6-SNAPSHOT
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | +-org.scalameta:mtags-interfaces:1.3.6-SNAPSHOT
+[info]   | | +-org.eclipse.lsp4j:org.eclipse.lsp4j:0.23.1
+[info]   | |   +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   | |     +-com.google.code.gson:gson:2.11.0
+[info]   | |     | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | |     | 
+[info]   | |     +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   | |     
+[info]   | +-org.scalameta:mtags-shared_3.3.3:1.3.6-SNAPSHOT
+[info]   |   +-com.google.guava:guava:33.2.1-jre
+[info]   |   | +-com.google.code.findbugs:jsr305:3.0.2
+[info]   |   | +-com.google.errorprone:error_prone_annotations:2.26.1 (evicted by: 2...
+[info]   |   | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |   | +-com.google.guava:failureaccess:1.0.2
+[info]   |   | +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-wit..
+[info]   |   | +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   |   | +-org.checkerframework:checker-qual:3.42.0
+[info]   |   | 
+[info]   |   +-com.google.protobuf:protobuf-java:4.27.3
+[info]   |   +-io.get-coursier:interface:1.0.19
+[info]   |   | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   |   | +-org.slf4j:slf4j-api:2.0.13
+[info]   |   | 
+[info]   |   +-org.lz4:lz4-java:1.8.0
+[info]   |   +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   |   | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   |   | 
+[info]   |   +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   |   +-org.scalameta:mtags-interfaces:1.3.6-SNAPSHOT
+[info]   |     +-org.eclipse.lsp4j:org.eclipse.lsp4j:0.23.1
+[info]   |       +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   |         +-com.google.code.gson:gson:2.11.0
+[info]   |         | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   |         | 
+[info]   |         +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   |         
+[info]   +-org.scalameta:mtags_3.3.3:1.3.6-SNAPSHOT
+[info]   | +-com.lihaoyi:geny_3:1.0.0 (evicted by: 1.1.1)
+[info]   | +-com.lihaoyi:geny_3:1.1.1
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-com.lihaoyi:pprint_3:0.7.3
+[info]   | | +-com.lihaoyi:fansi_3:0.3.1 (evicted by: 0.5.0)
+[info]   | | +-com.lihaoyi:fansi_3:0.5.0
+[info]   | | | +-com.lihaoyi:sourcecode_3:0.4.0 (evicted by: 0.4.2)
+[info]   | | | +-com.lihaoyi:sourcecode_3:0.4.2
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-com.lihaoyi:sourcecode_3:0.2.8 (evicted by: 0.4.2)
+[info]   | | +-com.lihaoyi:sourcecode_3:0.4.2
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.1 (evicted by: 3.4.2)
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.0.2 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-com.thoughtworks.qdox:qdox:2.1.0
+[info]   | +-io.get-coursier:interface:1.0.19
+[info]   | | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   | | +-org.slf4j:slf4j-api:2.0.13
+[info]   | | 
+[info]   | +-org.jsoup:jsoup:1.18.1
+[info]   | +-org.lz4:lz4-java:1.8.0
+[info]   | +-org.scala-lang.modules:scala-java8-compat_3:1.0.2
+[info]   | | +-org.scala-lang:scala3-library_3:3.0.2 (evicted by: 3.4.2)
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-compiler_3:3.3.3
+[info]   | | +-org.jline:jline-reader:3.19.0
+[info]   | | | +-org.jline:jline-terminal:3.19.0
+[info]   | | | 
+[info]   | | +-org.jline:jline-terminal-jna:3.19.0
+[info]   | | | +-net.java.dev.jna:jna:5.12.0
+[info]   | | | +-net.java.dev.jna:jna:5.3.1 (evicted by: 5.12.0)
+[info]   | | | +-org.jline:jline-terminal:3.19.0
+[info]   | | | 
+[info]   | | +-org.jline:jline-terminal:3.19.0
+[info]   | | +-org.scala-lang.modules:scala-asm:9.5.0-scala-1
+[info]   | | +-org.scala-lang:scala3-interfaces:3.3.3
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | +-org.scala-lang:tasty-core_3:3.3.3
+[info]   | | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cyc..
+[info]   | | | | 
+[info]   | | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | | 
+[info]   | | +-org.scala-sbt:compiler-interface:1.9.3
+[info]   | |   +-org.scala-sbt:util-interface:1.9.2
+[info]   | |   
+[info]   | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | 
+[info]   | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | +-org.scalameta:mtags-shared_3.3.3:1.3.6-SNAPSHOT
+[info]   | | +-com.google.guava:guava:33.2.1-jre
+[info]   | | | +-com.google.code.findbugs:jsr305:3.0.2
+[info]   | | | +-com.google.errorprone:error_prone_annotations:2.26.1 (evicted by: 2...
+[info]   | | | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | | | +-com.google.guava:failureaccess:1.0.2
+[info]   | | | +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-wit..
+[info]   | | | +-com.google.j2objc:j2objc-annotations:3.0.0
+[info]   | | | +-org.checkerframework:checker-qual:3.42.0
+[info]   | | | 
+[info]   | | +-com.google.protobuf:protobuf-java:4.27.3
+[info]   | | +-io.get-coursier:interface:1.0.19
+[info]   | | | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   | | | +-org.slf4j:slf4j-api:2.0.13
+[info]   | | | 
+[info]   | | +-org.lz4:lz4-java:1.8.0
+[info]   | | +-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2)
+[info]   | | | #-org.scala-lang:scala3-library_3:3.3.3 [S] (evicted by: 3.4.2) (cycle)
+[info]   | | | 
+[info]   | | +-org.scala-lang:scala3-library_3:3.4.2 [S]
+[info]   | | +-org.scalameta:mtags-interfaces:1.3.6-SNAPSHOT
+[info]   | |   +-org.eclipse.lsp4j:org.eclipse.lsp4j:0.23.1
+[info]   | |     +-org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.23.1
+[info]   | |       +-com.google.code.gson:gson:2.11.0
+[info]   | |       | +-com.google.errorprone:error_prone_annotations:2.27.0
+[info]   | |       | 
+[info]   | |       +-com.google.code.gson:gson:[2.9.1,3.0) (evicted by: 2.11.0)
+[info]   | |       
+[info]   | +-org.scalameta:scalameta_2.13:4.9.9
+[info]   | | +-org.scala-lang:scalap:2.13.11
+[info]   | | +-org.scalameta:parsers_2.13:4.9.9 [S]
+[info]   | |   +-org.scalameta:trees_2.13:4.9.9 [S]
+[info]   | |     +-org.scalameta:common_2.13:4.9.9 [S]
+[info]   | |       +-com.lihaoyi:sourcecode_2.13:0.4.2 [S]
+[info]   | |       
+[info]   | +-org.scalameta:semanticdb-shared_2.13.14:4.9.9
+[info]   |   +-com.thesamet.scalapb:scalapb-runtime_2.13:0.11.17
+[info]   |   | +-com.google.protobuf:protobuf-java:3.19.6 (evicted by: 4.27.3)
+[info]   |   | +-com.google.protobuf:protobuf-java:4.27.3
+[info]   |   | +-com.thesamet.scalapb:lenses_2.13:0.11.17
+[info]   |   | 
+[info]   |   +-org.scalameta:scalameta_2.13:4.9.9
+[info]   |     +-org.scala-lang:scalap:2.13.11
+[info]   |     +-org.scalameta:parsers_2.13:4.9.9 [S]
+[info]   |       +-org.scalameta:trees_2.13:4.9.9 [S]
+[info]   |         +-org.scalameta:common_2.13:4.9.9 [S]
+[info]   |           +-com.lihaoyi:sourcecode_2.13:0.4.2 [S]
+[info]   |           
+[info]   +-org.scalameta:scalafmt-dynamic_2.13:3.7.15 [S]
+[info]   | +-com.typesafe:config:1.4.2
+[info]   | +-io.get-coursier:interface:0.0.17 (evicted by: 1.0.19)
+[info]   | +-io.get-coursier:interface:1.0.19
+[info]   | | +-org.slf4j:slf4j-api:1.7.36 (evicted by: 2.0.13)
+[info]   | | +-org.slf4j:slf4j-api:2.0.13
+[info]   | | 
+[info]   | +-org.scalameta:scalafmt-interfaces:3.7.15
+[info]   | 
+[info]   +-org.scalameta:scalameta_2.13:4.9.9
+[info]   | +-org.scala-lang:scalap:2.13.11
+[info]   | +-org.scalameta:parsers_2.13:4.9.9 [S]
+[info]   |   +-org.scalameta:trees_2.13:4.9.9 [S]
+[info]   |     +-org.scalameta:common_2.13:4.9.9 [S]
+[info]   |       +-com.lihaoyi:sourcecode_2.13:0.4.2 [S]
+[info]   |       
+[info]   +-org.scalameta:semanticdb-metap_2.13.14:4.9.9
+[info]   | +-org.scalameta:semanticdb-shared_2.13.14:4.9.9
+[info]   |   +-com.thesamet.scalapb:scalapb-runtime_2.13:0.11.17
+[info]   |   | +-com.google.protobuf:protobuf-java:3.19.6 (evicted by: 4.27.3)
+[info]   |   | +-com.google.protobuf:protobuf-java:4.27.3
+[info]   |   | +-com.thesamet.scalapb:lenses_2.13:0.11.17
+[info]   |   | 
+[info]   |   +-org.scalameta:scalameta_2.13:4.9.9
+[info]   |     +-org.scala-lang:scalap:2.13.11
+[info]   |     +-org.scalameta:parsers_2.13:4.9.9 [S]
+[info]   |       +-org.scalameta:trees_2.13:4.9.9 [S]
+[info]   |         +-org.scalameta:common_2.13:4.9.9 [S]
+[info]   |           +-com.lihaoyi:sourcecode_2.13:0.4.2 [S]
+[info]   |           
+[info]   +-org.scalameta:semanticdb-shared_2.13.14:4.9.9
+[info]   | +-com.thesamet.scalapb:scalapb-runtime_2.13:0.11.17
+[info]   | | +-com.google.protobuf:protobuf-java:3.19.6 (evicted by: 4.27.3)
+[info]   | | +-com.google.protobuf:protobuf-java:4.27.3
+[info]   | | +-com.thesamet.scalapb:lenses_2.13:0.11.17
+[info]   | | 
+[info]   | +-org.scalameta:scalameta_2.13:4.9.9
+[info]   |   +-org.scala-lang:scalap:2.13.11
+[info]   |   +-org.scalameta:parsers_2.13:4.9.9 [S]
+[info]   |     +-org.scalameta:trees_2.13:4.9.9 [S]
+[info]   |       +-org.scalameta:common_2.13:4.9.9 [S]
+[info]   |         +-com.lihaoyi:sourcecode_2.13:0.4.2 [S]
+[info]   |         
+[info]   +-org.virtuslab.scala-cli:scala-cli-bsp:1.4.3
+[info]   
+[success] Total time: 1 s, completed Aug 16, 2024, 6:21:36 PM
diff --git a/metals/src/main/scala/scala/meta/internal/implementation/Supermethods.scala b/metals/src/main/scala/scala/meta/internal/implementation/Supermethods.scala
index e6fff1f3217..2f2b9538508 100644
--- a/metals/src/main/scala/scala/meta/internal/implementation/Supermethods.scala
+++ b/metals/src/main/scala/scala/meta/internal/implementation/Supermethods.scala
@@ -81,6 +81,7 @@ class Supermethods(
         filePath,
         textDocument,
       )
+      // TODO fallback to compilers
       symbolInformation <- findSymbol(symbolOcc.symbol)
       gotoSymbol <- {
         if (symbolOcc.role.isDefinition) {
diff --git a/metals/src/main/scala/scala/meta/internal/metals/ConnectionProvider.scala b/metals/src/main/scala/scala/meta/internal/metals/ConnectionProvider.scala
index 91debfe58dd..d145f9af8c6 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/ConnectionProvider.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/ConnectionProvider.scala
@@ -240,7 +240,8 @@ class ConnectionProvider(
         case _ if !session.canReloadWorkspace =>
           connect(CreateSession())
         case _ =>
-          session.workspaceReload
+          session
+            .workspaceReload()
             .flatMap(_ => connect(new ImportBuildAndIndex(session)))
             .map { _ =>
               scribe.info("Correctly reloaded workspace")
diff --git a/metals/src/main/scala/scala/meta/internal/metals/Indexer.scala b/metals/src/main/scala/scala/meta/internal/metals/Indexer.scala
index 1eb47a8ae65..aee740bf9f3 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/Indexer.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/Indexer.scala
@@ -62,7 +62,7 @@ case class Indexer(indexProviders: IndexProviders)(implicit rc: ReportContext) {
       },
     )
     tracked.foreach { _ =>
-      statusBar().addMessage(
+      statusBar.addMessage(
         s"${clientConfig.icons().rocket} Indexing complete!"
       )
       if (clientConfig.initialConfig.statistics.isMemory) {
diff --git a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala
index 04664bfc878..dd19874f11c 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/MetalsLspService.scala
@@ -1571,8 +1571,8 @@ abstract class MetalsLspService(
   ): Future[Unit] = {
     paths
       .find { path =>
-        if (clientConfig.isDidFocusProvider() || focusedDocument().isDefined) {
-          focusedDocument().contains(path) &&
+        if (clientConfig.isDidFocusProvider() || focusedDocument.isDefined) {
+          focusedDocument.contains(path) &&
           path.isWorksheet
         } else {
           path.isWorksheet
diff --git a/metals/src/main/scala/scala/meta/internal/metals/ProjectMetalsLspService.scala b/metals/src/main/scala/scala/meta/internal/metals/ProjectMetalsLspService.scala
index 23151fb08c8..68c439e767a 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/ProjectMetalsLspService.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/ProjectMetalsLspService.scala
@@ -533,7 +533,7 @@ class ProjectMetalsLspService(
         ).ignoreValue
       case buildTools =>
         for {
-          Some(buildTool) <- bspConfigGenerator.chooseBuildServerProvider(
+          case Some(buildTool) <- bspConfigGenerator.chooseBuildServerProvider(
             buildTools
           )
           _ <- connect(
diff --git a/metals/src/main/scala/scala/meta/internal/metals/ReferenceProvider.scala b/metals/src/main/scala/scala/meta/internal/metals/ReferenceProvider.scala
index 97db92551a9..93b52ac8f09 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/ReferenceProvider.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/ReferenceProvider.scala
@@ -14,6 +14,7 @@ import scala.util.matching.Regex
 
 import scala.meta.Importee
 import scala.meta.internal.metals.MetalsEnrichments.given
+import scala.meta.internal.metals.MetalsEnrichments._
 import scala.meta.internal.mtags.DefinitionAlternatives.GlobalSymbol
 import scala.meta.internal.mtags.Semanticdbs
 import scala.meta.internal.mtags.Symbol
diff --git a/metals/src/main/scala/scala/meta/internal/metals/SqlSharedIndices.scala b/metals/src/main/scala/scala/meta/internal/metals/SqlSharedIndices.scala
index 1a642a590a1..8bc24ea222f 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/SqlSharedIndices.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/SqlSharedIndices.scala
@@ -12,5 +12,5 @@ class SqlSharedIndices
       migrations = "/shared-db/migration",
     ) {
 
-  val jvmTypeHierarchy: JarTypeHierarchy = new JarTypeHierarchy(() => connect)
+  val jvmTypeHierarchy: JarTypeHierarchy = new JarTypeHierarchy(() => connect())
 }
diff --git a/metals/src/main/scala/scala/meta/internal/metals/codeactions/ConvertToNamedArguments.scala b/metals/src/main/scala/scala/meta/internal/metals/codeactions/ConvertToNamedArguments.scala
index 5f6b90a1356..03399ff54e5 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/codeactions/ConvertToNamedArguments.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/codeactions/ConvertToNamedArguments.scala
@@ -149,7 +149,7 @@ class ConvertToNamedArguments(
               ServerCommands
                 .ConvertToNamedArgsRequest(
                   position,
-                  apply.argIndices.map(Integer.valueOf).asJava,
+                  apply.argIndices.map(Integer.valueOf).toArray,
                 )
             )
 
diff --git a/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala b/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala
index 9599e26a86f..379b6596c57 100644
--- a/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala
+++ b/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala
@@ -326,7 +326,7 @@ class DebugDiscovery(
               .flatMap(scalaTarget =>
                 JavaBinary.javaBinaryFromPath(scalaTarget.jvmHome)
               )
-              .orElse(userConfig().usedJavaBinary)
+              .orElse(userConfig().usedJavaBinary())
             buildTargetClasses
               .jvmRunEnvironment(params.getTargets().get(0))
               .map { envItem =>
diff --git a/metals/src/main/scala/scala/meta/internal/rename/RenameProvider.scala b/metals/src/main/scala/scala/meta/internal/rename/RenameProvider.scala
index 744efd65a01..60e65596a13 100644
--- a/metals/src/main/scala/scala/meta/internal/rename/RenameProvider.scala
+++ b/metals/src/main/scala/scala/meta/internal/rename/RenameProvider.scala
@@ -50,6 +50,7 @@ import org.eclipse.lsp4j.VersionedTextDocumentIdentifier
 import org.eclipse.lsp4j.WorkspaceEdit
 import org.eclipse.lsp4j.jsonrpc.messages.{Either => LSPEither}
 import org.eclipse.lsp4j.{Range => LSPRange}
+import scala.meta.internal.pc.PcSymbolInformation
 
 final class RenameProvider(
     referenceProvider: ReferenceProvider,
@@ -117,6 +118,7 @@ final class RenameProvider(
       token: CancelToken,
   ): Future[WorkspaceEdit] = {
     val source = params.getTextDocument.getUri.toAbsolutePath
+    // val scalaVersion =
     val localRename = compilers
       .rename(params, token)
       .map(_.asScala.toList)
@@ -164,7 +166,8 @@ final class RenameProvider(
                   if (suggestedName.isBackticked)
                     suggestedName.stripBackticks
                   else suggestedName
-                val newName = Identifier.backtickWrap(withoutBackticks)
+                val newName =
+                  KeywordWrapper.Scala3().backtickWrap(withoutBackticks)
 
                 def isNotRenamedSymbol(
                     textDocument: TextDocument,
@@ -179,15 +182,6 @@ final class RenameProvider(
                   foundName.contains(realName)
                 }
 
-                def shouldCheckImplementation(
-                    symbol: String,
-                    path: AbsolutePath,
-                    textDocument: TextDocument,
-                ) =
-                  !symbol.desc.isType && !(symbol.isLocal && symbolHierarchyOps
-                    .defaultSymbolSearch(path, textDocument)(symbol)
-                    .exists(info => info.isTrait || info.isClass))
-
                 val allReferences =
                   for {
                     (occurence, semanticDb) <- symbolOccurrence.toIterable
@@ -235,13 +229,14 @@ final class RenameProvider(
                       source,
                       newName,
                     )
+                    shouldCheckImplementationFut = shouldCheckImplementation(
+                      occurence.symbol,
+                      source,
+                      semanticDb,
+                    )
                     implReferences = implementations(
                       txtParams,
-                      shouldCheckImplementation(
-                        occurence.symbol,
-                        source,
-                        semanticDb,
-                      ),
+                      shouldCheckImplementationFut,
                       newName,
                     )
                   } yield Future
@@ -327,6 +322,32 @@ final class RenameProvider(
     Future.sequence(all.map(waiting => waiting())).ignoreValue
   }
 
+  private def shouldCheckImplementation(
+      symbol: String,
+      path: AbsolutePath,
+      textDocument: TextDocument,
+  ): Future[Boolean] = {
+    val notLocalAndType = !symbol.desc.isType && !symbol.isLocal
+
+    if (notLocalAndType) Future.successful(true)
+    else if (!symbol.isLocal) Future.successful(false)
+    else
+      symbolHierarchyOps
+        .defaultSymbolSearch(path, textDocument)(symbol)
+        .match {
+          case Some(info) =>
+            Future.successful(info.isTrait || info.isClass)
+          case None =>
+            compilers.info(path, symbol).map {
+              case None => false
+              case Some(value) =>
+                value.kind.getValue() == 13 ||
+                value.kind.getValue() == 14
+            }
+
+        }
+  }
+
   /**
    * In case of import renames, we can only rename the symbol in file.
    * Global rename will not return any results, so this method will be used as
@@ -466,31 +487,32 @@ final class RenameProvider(
 
   private def implementations(
       textParams: TextDocumentPositionParams,
-      shouldCheckImplementation: Boolean,
+      shouldCheckImplementationFut: Future[Boolean],
       newName: String,
-  ): Future[Seq[Location]] = {
-    if (shouldCheckImplementation) {
-      for {
-        implLocs <- implementationProvider.implementations(textParams)
-        result <- {
-          val result = for {
-            implLoc <- implLocs
-            locParams = toReferenceParams(implLoc, includeDeclaration = true)
-          } yield {
-            referenceProvider
-              .references(
-                locParams,
-                findRealRange = AdjustRange(findRealRange(newName)),
-                includeSynthetic,
-              )
-              .map(_.flatMap(_.locations))
+  ): Future[Seq[Location]] = shouldCheckImplementationFut.flatMap {
+    shouldCheckImplementation =>
+      if (shouldCheckImplementation) {
+        for {
+          implLocs <- implementationProvider.implementations(textParams)
+          result <- {
+            val result = for {
+              implLoc <- implLocs
+              locParams = toReferenceParams(implLoc, includeDeclaration = true)
+            } yield {
+              referenceProvider
+                .references(
+                  locParams,
+                  findRealRange = AdjustRange(findRealRange(newName)),
+                  includeSynthetic,
+                )
+                .map(_.flatMap(_.locations))
+            }
+            Future.sequence(result)
           }
-          Future.sequence(result)
-        }
-      } yield result.flatten
-    } else {
-      Future.successful(Nil)
-    }
+        } yield result.flatten
+      } else {
+        Future.successful(Nil)
+      }
   }
 
   private def canRenameSymbol(
diff --git a/metals/src/main/scala/scala/meta/internal/search/GlobalClassTable.scala b/metals/src/main/scala/scala/meta/internal/search/GlobalClassTable.scala
deleted file mode 100644
index f74aad8e946..00000000000
--- a/metals/src/main/scala/scala/meta/internal/search/GlobalClassTable.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package scala.meta.internal.search
-import scala.collection.concurrent.TrieMap
-
-import scala.meta.internal.metals.BuildTargets
-import scala.meta.internal.symtab.GlobalSymbolTable
-import scala.meta.io.AbsolutePath
-import scala.meta.io.Classpath
-
-import ch.epfl.scala.bsp4j.BuildTargetIdentifier
-
-final class GlobalClassTable(
-    buildTargets: BuildTargets
-) {
-  private val buildTargetsIndexes =
-    TrieMap.empty[BuildTargetIdentifier, GlobalSymbolTable]
-
-  def globalSymbolTableFor(
-      source: AbsolutePath
-  ): Option[GlobalSymbolTable] =
-    synchronized {
-      for {
-        buildTargetId <- buildTargets.inverseSources(source)
-        jarClasspath <- buildTargets.targetJarClasspath(buildTargetId)
-        classpath = new Classpath(jarClasspath)
-      } yield {
-        buildTargetsIndexes.getOrElseUpdate(
-          buildTargetId,
-          GlobalSymbolTable(classpath, includeJdk = true),
-        )
-      }
-    }
-
-}
diff --git a/metals/src/main/scala/scala/meta/internal/search/SymbolHierarchyOps.scala b/metals/src/main/scala/scala/meta/internal/search/SymbolHierarchyOps.scala
index 813b5d0ef9b..b4f4340c4bf 100644
--- a/metals/src/main/scala/scala/meta/internal/search/SymbolHierarchyOps.scala
+++ b/metals/src/main/scala/scala/meta/internal/search/SymbolHierarchyOps.scala
@@ -22,7 +22,6 @@ import scala.meta.internal.semanticdb.SymbolOccurrence
 import scala.meta.internal.semanticdb.TextDocument
 import scala.meta.internal.semanticdb.TypeRef
 import scala.meta.internal.semanticdb.XtensionSemanticdbSymbolInformation
-import scala.meta.internal.symtab.GlobalSymbolTable
 import scala.meta.io.AbsolutePath
 
 import org.eclipse.lsp4j.Location
@@ -36,18 +35,14 @@ class SymbolHierarchyOps(
     buffer: Buffers,
     trees: Trees,
 ) {
-  private val globalTable = new GlobalClassTable(buildTargets)
   def defaultSymbolSearch(
       anyWorkspacePath: AbsolutePath,
       textDocument: TextDocument,
-  ): String => Option[SymbolInformation] = {
-    lazy val global =
-      globalTable.globalSymbolTableFor(anyWorkspacePath)
-    symbol => {
+  ): String => Option[SymbolInformation] = { symbol =>
+    {
       textDocument.symbols
         .find(_.symbol == symbol)
         .orElse(findSymbolInformation(symbol))
-        .orElse(global.flatMap(_.safeInfo(symbol)))
     }
   }
 
@@ -195,15 +190,6 @@ object SymbolHierarchyOps {
       .find(sym => sym.symbol == symbol)
   }
 
-  implicit class XtensionGlobalSymbolTable(symtab: GlobalSymbolTable) {
-    def safeInfo(symbol: String): Option[SymbolInformation] =
-      try {
-        symtab.info(symbol)
-      } catch {
-        case NonFatal(_) => None
-      }
-  }
-
   def isClassLike(info: SymbolInformation): Boolean =
     info.isObject || info.isClass || info.isTrait || info.isInterface
 
diff --git a/metals/src/main/scala/scala/meta/internal/tvp/ScalacpCopyPaste.scala b/metals/src/main/scala/scala/meta/internal/tvp/ScalacpCopyPaste.scala
deleted file mode 100644
index 1129a168fd1..00000000000
--- a/metals/src/main/scala/scala/meta/internal/tvp/ScalacpCopyPaste.scala
+++ /dev/null
@@ -1,498 +0,0 @@
-package scala.meta.internal.tvp
-
-import java.{util => ju}
-
-import scala.collection.mutable
-import scala.reflect.NameTransformer
-import scala.tools.scalap.scalax.rules.scalasig._
-
-import scala.meta.internal.scalacp._
-import scala.meta.internal.semanticdb.Scala._
-import scala.meta.internal.semanticdb.Scala.{Descriptor => d}
-import scala.meta.internal.semanticdb.Scala.{DisplayNames => dn}
-import scala.meta.internal.semanticdb.Scala.{Names => n}
-import scala.meta.internal.semanticdb.SymbolInformation.{Kind => k}
-import scala.meta.internal.semanticdb.SymbolInformation.{Property => p}
-import scala.meta.internal.semanticdb.{Language => l}
-import scala.meta.internal.{semanticdb => s}
-
-/**
- * This class contains copy-pasted code from scala.meta.internal.scalacp with minor changes.
- *
- * If the `Scalacp` class was not final then we could avoid this copy-pasting. Changes are
- * documented with "// scalacp deviation" comments.
- */
-object ScalacpCopyPaste {
-  lazy val symbolCache = new ju.HashMap[Symbol, String]
-  implicit class XtensionSymbolSSymbol(sym: Symbol) {
-    def toSemantic: String = {
-      def uncached(sym: Symbol): String = {
-        if (sym.isSemanticdbGlobal) Symbols.Global(sym.owner, sym.descriptor)
-        else freshSymbol()
-      }
-      val ssym = symbolCache.get(sym)
-      if (ssym != null) {
-        ssym
-      } else {
-        val ssym = uncached(sym)
-        symbolCache.put(sym, ssym)
-        ssym
-      }
-    }
-  }
-
-  implicit class XtensionSymbolSSpec(sym: Symbol) {
-    def isSemanticdbGlobal: Boolean = !isSemanticdbLocal
-    def isSemanticdbLocal: Boolean = {
-      val owner = sym.parent.getOrElse(NoSymbol)
-      def definitelyGlobal = sym.isPackage
-      def definitelyLocal =
-        sym == NoSymbol ||
-          (owner.isInstanceOf[MethodSymbol] && !sym.isParam) ||
-          ((owner.isAlias || (owner.isType && owner.isDeferred)) && !sym.isParam) ||
-          // NOTE: Scalap doesn't expose locals.
-          // sym.isSelfParameter ||
-          // sym.isLocalDummy ||
-          sym.isRefinementClass ||
-          sym.isAnonymousClass ||
-          sym.isAnonymousFunction ||
-          (sym.isInstanceOf[TypeSymbol] && sym.isExistential)
-      def ownerLocal = sym.parent.map(_.isSemanticdbLocal).getOrElse(false)
-      !definitelyGlobal && (definitelyLocal || ownerLocal)
-    }
-    def owner: String = {
-      if (sym.isRootPackage) Symbols.None
-      else if (sym.isEmptyPackage) Symbols.RootPackage
-      else if (sym.isToplevelPackage) Symbols.RootPackage
-      else {
-        sym.parent match {
-          case Some(NoSymbol) => ""
-          case Some(parent) => parent.ssym
-          case None => sys.error(s"unsupported symbol $sym")
-        }
-      }
-    }
-    def symbolName: String = {
-      if (sym.isRootPackage) n.RootPackage.value
-      else if (sym.isEmptyPackage) n.EmptyPackage.value
-      else if (sym.isConstructor) n.Constructor.value
-      else {
-        def loop(value: String): String = {
-          val i = value.lastIndexOf("$$")
-          if (i > 0) loop(value.substring(i + 2))
-          else NameTransformer.decode(value).stripSuffix(" ")
-        }
-        loop(sym.name)
-      }
-    }
-    def descriptor: Descriptor = {
-      sym match {
-        case sym: SymbolInfoSymbol =>
-          sym.kind match {
-            case k.LOCAL | k.OBJECT | k.PACKAGE_OBJECT =>
-              d.Term(symbolName)
-            case k.METHOD if sym.isValMethod =>
-              d.Term(symbolName)
-            case k.METHOD | k.CONSTRUCTOR | k.MACRO =>
-              val overloads = {
-                val peers = sym.parent.get.semanticdbDecls.syms
-                peers.filter {
-                  case peer: MethodSymbol =>
-                    peer.symbolName == sym.symbolName && !peer.isValMethod
-                  case _ => false
-                }
-              }
-              val disambiguator = {
-                if (overloads.lengthCompare(1) == 0) "()"
-                else {
-                  val index = overloads.indexOf(sym)
-                  if (index <= 0) "()"
-                  else s"(+${index})"
-                }
-              }
-              d.Method(symbolName, disambiguator)
-            case k.TYPE | k.CLASS | k.TRAIT =>
-              d.Type(symbolName)
-            case k.PACKAGE =>
-              d.Package(symbolName)
-            case k.PARAMETER =>
-              d.Parameter(symbolName)
-            case k.TYPE_PARAMETER =>
-              d.TypeParameter(symbolName)
-            case skind =>
-              sys.error(s"unsupported kind $skind for symbol $sym")
-          }
-        case sym: ExternalSymbol =>
-          // scalacp deviation: since we are only interested in definitions (not
-          // signatures) it's safe to emit `d.Package` for all term references.
-          if (sym.entry.entryType == 9) d.Type(symbolName)
-          else if (sym.entry.entryType == 10) d.Package(symbolName)
-          else d.Type(symbolName)
-        case NoSymbol =>
-          d.None
-      }
-    }
-    def semanticdbDecls: SemanticdbDecls = {
-      val decls =
-        sym.children.filter(decl => decl.isUseful && !decl.isTypeParam)
-      SemanticdbDecls(decls.toList)
-    }
-  }
-
-  implicit class XtensionSymbolsSSpec(syms: Seq[Symbol]) {
-    def semanticdbDecls: SemanticdbDecls = {
-      SemanticdbDecls(syms.filter(_.isUseful))
-    }
-
-    def sscope(linkMode: LinkMode): s.Scope = {
-      linkMode match {
-        case SymlinkChildren =>
-          s.Scope(symlinks = syms.map(_.ssym))
-        case HardlinkChildren =>
-          syms.map(registerHardlink)
-          val hardlinks = syms.map {
-            case sym: SymbolInfoSymbol =>
-              sym.toSymbolInformation(HardlinkChildren)
-            case sym => sys.error(s"unsupported symbol $sym")
-          }
-          s.Scope(hardlinks = hardlinks)
-      }
-    }
-  }
-
-  case class SemanticdbDecls(syms: Seq[Symbol]) {
-    def sscope(linkMode: LinkMode): s.Scope = {
-      linkMode match {
-        case SymlinkChildren =>
-          val sbuf = List.newBuilder[String]
-          syms.foreach { sym =>
-            val ssym = sym.ssym
-            sbuf += ssym
-            if (sym.isUsefulField && sym.isMutable) {
-              val setterSymbolName = ssym.desc.name.toString + "_="
-              val setterSym =
-                Symbols.Global(ssym.owner, d.Method(setterSymbolName, "()"))
-              sbuf += setterSym
-            }
-          }
-          s.Scope(sbuf.result())
-        case HardlinkChildren =>
-          val sbuf = List.newBuilder[s.SymbolInformation]
-          syms.foreach { sym =>
-            registerHardlink(sym)
-            val sinfo = sym match {
-              case sym: SymbolInfoSymbol =>
-                sym.toSymbolInformation(HardlinkChildren)
-              case sym => sys.error(s"unsupported symbol $sym")
-            }
-            sbuf += sinfo
-            if (sym.isUsefulField && sym.isMutable) {
-              Synthetics.setterInfos(sinfo, HardlinkChildren).foreach(sbuf.+=)
-            }
-          }
-          s.Scope(hardlinks = sbuf.result())
-      }
-    }
-  }
-
-  implicit class XtensionSymbol(sym: Symbol) {
-    def ssym: String = sym.toSemantic
-    def self: Type =
-      sym match {
-        case sym: ClassSymbol =>
-          sym.selfType
-            .map {
-              case RefinedType(_, List(_, self)) => self
-              case _ => NoType
-            }
-            .getOrElse(NoType)
-        case _ =>
-          NoType
-      }
-    def isRootPackage: Boolean = sym.path == "<root>"
-    def isEmptyPackage: Boolean = sym.path == "<empty>"
-    def isToplevelPackage: Boolean = sym.parent.isEmpty
-    def isModuleClass: Boolean = sym.isInstanceOf[ClassSymbol] && sym.isModule
-    def moduleClass: Symbol =
-      sym match {
-        case sym: SymbolInfoSymbol if sym.isModule =>
-          sym.infoType match {
-            case TypeRefType(_, moduleClass, _) => moduleClass
-            case _ => NoSymbol
-          }
-        case _ =>
-          NoSymbol
-      }
-    def isClass: Boolean = sym.isInstanceOf[ClassSymbol] && !sym.isModule
-    def isObject: Boolean = sym.isInstanceOf[ObjectSymbol]
-    def isType: Boolean = sym.isInstanceOf[TypeSymbol]
-    def isAlias: Boolean = sym.isInstanceOf[AliasSymbol]
-    def isMacro: Boolean = sym.isMethod && sym.hasFlag(0x00008000)
-    def isConstructor: Boolean =
-      sym.isMethod && (sym.name == "<init>" || sym.name == "$init$")
-    def isPackageObject: Boolean = sym.name == "package"
-    def isTypeParam: Boolean = sym.isType && sym.isParam
-    def isAnonymousClass: Boolean = sym.name.contains("$anon")
-    def isAnonymousFunction: Boolean = sym.name.contains("$anonfun")
-    def isSyntheticConstructor: Boolean =
-      sym match {
-        case sym: SymbolInfoSymbol =>
-          val owner = sym.symbolInfo.owner
-          sym.isConstructor && (owner.isModuleClass || owner.isTrait)
-        case _ =>
-          false
-      }
-    def isLocalChild: Boolean = sym.name == "<local child>"
-    def isExtensionMethod: Boolean = sym.name.contains("$extension")
-    def isSyntheticValueClassCompanion: Boolean = {
-      sym match {
-        case sym: SymbolInfoSymbol =>
-          if (sym.isModuleClass) {
-            sym.infoType match {
-              case ClassInfoType(_, List(TypeRefType(_, _, _))) =>
-                sym.isSynthetic && sym.semanticdbDecls.syms.isEmpty
-              case _ =>
-                false
-            }
-          } else if (sym.isModule) {
-            sym.moduleClass.isSyntheticValueClassCompanion
-          } else {
-            false
-          }
-        case _ =>
-          false
-      }
-    }
-    def isValMethod: Boolean = {
-      sym match {
-        case sym: SymbolInfoSymbol =>
-          sym.kind.isMethod && {
-            (sym.isAccessor && sym.isStable) ||
-            (isUsefulField && !sym.isMutable)
-          }
-        case _ =>
-          false
-      }
-    }
-    def isScalacField: Boolean = {
-      val isField = sym
-        .isInstanceOf[MethodSymbol] && !sym.isMethod && !sym.isParam
-      val isJavaDefined = sym.isJava
-      isField && !isJavaDefined
-    }
-    def isUselessField: Boolean = {
-      val peers = sym.parent.map(_.children.toList).getOrElse(Nil)
-      val getter =
-        peers.find(m => m.isAccessor && m.name == sym.name.stripSuffix(" "))
-      sym.isScalacField && getter.nonEmpty
-    }
-    def isUsefulField: Boolean = {
-      sym.isScalacField && !sym.isUselessField
-    }
-    def isSyntheticCaseAccessor: Boolean = {
-      sym.isCaseAccessor && sym.name.contains("$")
-    }
-    def isRefinementClass: Boolean = {
-      sym.name == "<refinement>"
-    }
-    def isUseless: Boolean = {
-      sym == NoSymbol ||
-      sym.isAnonymousClass ||
-      sym.isSyntheticConstructor ||
-      sym.isModuleClass ||
-      sym.isLocalChild ||
-      sym.isExtensionMethod ||
-      sym.isSyntheticValueClassCompanion ||
-      sym.isUselessField ||
-      sym.isSyntheticCaseAccessor ||
-      sym.isRefinementClass
-    }
-    def isUseful: Boolean = !sym.isUseless
-    def isDefaultParameter: Boolean = {
-      sym.hasFlag(0x02000000) && sym.isParam
-    }
-  }
-
-  private var nextId = 0
-  private def freshSymbol(): String = {
-    val result = Symbols.Local(nextId.toString)
-    nextId += 1
-    result
-  }
-
-  lazy val hardlinks = new ju.HashSet[String]
-  private def registerHardlink(sym: Symbol): Unit = {
-    hardlinks.add(sym.ssym)
-  }
-
-  private val primaryCtors = mutable.Map[String, Int]()
-  implicit class XtensionGSymbolSSymbolInformation(sym: SymbolInfoSymbol) {
-    private def language: s.Language = {
-      // NOTE: We have no way to figure out whether an external symbol
-      // comes from Java or Scala. Moreover, we can't even find out
-      // whether it's a package or an object. Therefore, we default to l.SCALA.
-      l.SCALA
-    }
-
-    private[meta] def kind: s.SymbolInformation.Kind = {
-      sym match {
-        // NOTE: Scalacp doesn't care about self parameters
-        // because they are local, i.e. not saved in scala signatures.
-        // case _ if sym.isSelfParameter =>
-        //   k.SELF_PARAMETER
-        case sym: MethodSymbol if sym.isMethod =>
-          if (sym.isConstructor) k.CONSTRUCTOR
-          else if (sym.isMacro) k.MACRO
-          // NOTE: Scalap doesn't expose locals.
-          // else if (sym.isGetter && sym.isLazy && sym.isLocalToBlock) k.LOCAL
-          else k.METHOD
-        case _: ObjectSymbol | _: ClassSymbol if sym.isModule =>
-          if (sym.isPackage) k.PACKAGE
-          else if (sym.isPackageObject) k.PACKAGE_OBJECT
-          else k.OBJECT
-        case sym: MethodSymbol =>
-          // NOTE: This is craziness. In scalap, parameters, val and vars
-          // are also modelled with method symbols.
-          if (sym.isParam) k.PARAMETER
-          // NOTE: Scalap doesn't expose locals.
-          // else if (gsym.isLocalToBlock) k.LOCAL
-          // NOTE: Scalap doesn't expose JAVA_ENUM.
-          else if (sym.isJava /* || sym.isJavaEnum */ ) k.FIELD
-          else k.METHOD
-        case sym: ClassSymbol if !sym.isModule =>
-          if (sym.isTrait && sym.isJava) k.INTERFACE
-          else if (sym.isTrait) k.TRAIT
-          else k.CLASS
-        case _: TypeSymbol | _: AliasSymbol =>
-          if (sym.isParam) k.TYPE_PARAMETER
-          else k.TYPE
-        case _ =>
-          sys.error(s"unsupported symbol $sym")
-      }
-    }
-
-    private[meta] def properties: Int = {
-      var flags = 0
-      def flip(sprop: s.SymbolInformation.Property) = flags |= sprop.value
-      def isAbstractClass = sym.isClass && sym.isAbstract && !sym.isTrait
-      def isAbstractMethod = sym.isMethod && sym.isDeferred
-      def isAbstractType = sym.isType && !sym.isParam && sym.isDeferred
-      if (sym.isPackage) {
-        ()
-      } else if (sym.isJava) {
-        if (isAbstractClass || kind.isInterface || isAbstractMethod)
-          flip(p.ABSTRACT)
-        // NOTE: Scalap doesn't expose JAVA_ENUM.
-        if (sym.isFinal /* || sym.isJavaEnum */ ) flip(p.FINAL)
-        // NOTE: Scalap doesn't expose JAVA_ENUM.
-        // if (sym.isJavaEnum) flip(p.ENUM)
-        if (sym.isStatic) flip(p.STATIC)
-        ???
-      } else {
-        if (isAbstractClass || isAbstractMethod || isAbstractType)
-          flip(p.ABSTRACT)
-        if (sym.isFinal || sym.isModule) flip(p.FINAL)
-        if (sym.isSealed) flip(p.SEALED)
-        if (sym.isImplicit) flip(p.IMPLICIT)
-        if (sym.isLazy) flip(p.LAZY)
-        if (sym.isCase && (sym.isClass || sym.isModule)) flip(p.CASE)
-        if (sym.isType && sym.isCovariant) flip(p.COVARIANT)
-        if (sym.isType && sym.isContravariant) flip(p.CONTRAVARIANT)
-        // NOTE: Scalap doesn't expose locals.
-        if (/*kind.isLocal ||*/ sym.isUsefulField) {
-          if (sym.isMutable) flip(p.VAR)
-          else flip(p.VAL)
-        }
-        if (sym.isAccessor) {
-          if (sym.isStable) flip(p.VAL)
-          else flip(p.VAR)
-        }
-        if (sym.isParam) {
-          sym.parent.foreach {
-            case parent: SymbolInfoSymbol =>
-              if ((parent.properties & p.PRIMARY.value) != 0) {
-                parent.parent.foreach { grandParent =>
-                  val classMembers = grandParent.children
-                  val accessor =
-                    classMembers.find(m =>
-                      m.isParamAccessor && m.symbolName == sym.symbolName
-                    )
-                  accessor.foreach { accessor =>
-                    val isStable = {
-                      if (accessor.isMethod) accessor.isStable
-                      else !accessor.isMutable
-                    }
-                    if (!isStable) flip(p.VAR)
-                    else if (accessor.isMethod) flip(p.VAL)
-                    else ()
-                  }
-                }
-              }
-            case _ =>
-              ()
-          }
-        }
-        if (sym.isConstructor) {
-          val primaryIndex =
-            primaryCtors.getOrElseUpdate(sym.path, sym.entry.index)
-          if (sym.entry.index == primaryIndex) flip(p.PRIMARY)
-        }
-        if (sym.isDefaultParameter) flip(p.DEFAULT)
-      }
-      flags
-    }
-
-    private def displayName: String = {
-      if (sym.isRootPackage) dn.RootPackage
-      else if (sym.isEmptyPackage) dn.EmptyPackage
-      else if (sym.isConstructor) dn.Constructor
-      else if (sym.name.startsWith("_$")) dn.Anonymous
-      else if (sym.isPackageObject) sym.ssym.owner.desc.value
-      else sym.symbolName
-    }
-
-    private def sig(linkMode: LinkMode): s.Signature =
-      s.NoSignature // scalacp deviation
-
-    private def annotations: List[s.Annotation] = {
-      Nil // scalacp deviation
-    }
-
-    private def access: s.Access = {
-      kind match {
-        case k.LOCAL | k.PARAMETER | k.SELF_PARAMETER | k.TYPE_PARAMETER |
-            k.PACKAGE | k.PACKAGE_OBJECT =>
-          s.NoAccess
-        case _ =>
-          sym.symbolInfo.privateWithin match {
-            case None =>
-              if (sym.isPrivate && sym.isLocal) s.PrivateThisAccess()
-              else if (sym.isPrivate) s.PrivateAccess()
-              else if (sym.isProtected && sym.isLocal) s.ProtectedThisAccess()
-              else if (sym.isProtected) s.ProtectedAccess()
-              else s.PublicAccess()
-            case Some(privateWithin: Symbol) =>
-              val ssym = privateWithin.ssym
-              if (sym.isProtected) s.ProtectedWithinAccess(ssym)
-              else s.PrivateWithinAccess(ssym)
-            case Some(other) =>
-              sys.error(s"unsupported privateWithin: ${other.getClass} $other")
-          }
-      }
-    }
-
-    def toSymbolInformation(linkMode: LinkMode): s.SymbolInformation = {
-      s.SymbolInformation(
-        symbol = sym.ssym,
-        language = language,
-        kind = kind,
-        properties = properties,
-        displayName = displayName,
-        signature = sig(linkMode),
-        annotations = annotations,
-        access = access,
-      )
-    }
-  }
-
-}
diff --git a/mtags/src/main/scala-2/scala/meta/internal/mtags/MtagsEnrichments.scala b/mtags/src/main/scala-2/scala/meta/internal/mtags/MtagsEnrichments.scala
index e486df5d9dc..fd38998632d 100644
--- a/mtags/src/main/scala-2/scala/meta/internal/mtags/MtagsEnrichments.scala
+++ b/mtags/src/main/scala-2/scala/meta/internal/mtags/MtagsEnrichments.scala
@@ -55,148 +55,6 @@ trait MtagsEnrichments extends ScalametaCommonEnrichments {
       buf.result()
     }
   }
-  implicit class XtensionCancelChecker(token: CancelChecker) {
-    def isCancelled: Boolean =
-      try {
-        token.checkCanceled()
-        false
-      } catch {
-        case _: CancellationException =>
-          true
-      }
-  }
-  implicit class XtensionSemanticdbProperties(properties: Int) {
-    def isEnum: Boolean = (properties & p.ENUM.value) != 0
-    def isVar: Boolean = (properties & p.VAR.value) != 0
-    def isVal: Boolean = (properties & p.VAL.value) != 0
-  }
-
-  implicit class XtensionToken(token: Token) {
-    def isWhiteSpaceOrComment: Boolean =
-      token match {
-        case _: Token.Whitespace | _: Token.Comment =>
-          true
-        case _ => false
-      }
-  }
-
-  implicit class XtensionURIMtags(value: URI) {
-    def toAbsolutePath: AbsolutePath = toAbsolutePath(followSymlink = true)
-    def toAbsolutePath(followSymlink: Boolean): AbsolutePath = {
-      val path =
-        if (value.getScheme() == "jar")
-          Try {
-            AbsolutePath(Paths.get(value))
-          } match {
-            case Success(path) => path
-            case Failure(_) =>
-              // don't close - put up with the resource staying open so all AbsolutePath methods don't have to be wrapped
-              m.internal.io.PlatformFileIO.newFileSystem(
-                value,
-                new java.util.HashMap[String, String]()
-              )
-              AbsolutePath(Paths.get(value))
-          }
-        else
-          AbsolutePath(Paths.get(value))
-      if (followSymlink)
-        path.dealias
-      else
-        path
-    }
-  }
-
-  implicit class XtensionStringMtags(value: String) {
-
-    def stripBackticks: String = value.stripPrefix("`").stripSuffix("`")
-    def isBackticked: Boolean =
-      value.size > 1 && value.head == '`' && value.last == '`'
-    def toAbsolutePath: AbsolutePath = toAbsolutePath(true)
-    def toAbsolutePath(followSymlink: Boolean): AbsolutePath = {
-
-      /* Windows sometimes treats % literally, but not sure if it's always the case.
-       * https://learn.microsoft.com/en-us/troubleshoot/windows-client/networking/url-encoding-unc-paths-not-url-decoded
-       * This function tries to apply different heuristics to get the proper file system.
-       */
-      def withTryDecode(value: String)(f: String => AbsolutePath) = {
-        try {
-          if (Properties.isWin) f(URLDecoder.decode(value, "UTF-8"))
-          else f(value)
-        } catch {
-          // fallback to try without decoding
-          case _: NoSuchFileException | _: FileSystemNotFoundException
-              if Properties.isWin =>
-            f(value)
-          // prevents infinity recursion and double check for double escaped %
-          case _: NoSuchFileException | _: FileSystemNotFoundException
-              if value.contains("%25") =>
-            f(URLDecoder.decode(value, "UTF-8"))
-        }
-      }
-
-      // jar schemes must have "jar:file:"" instead of "jar:file%3A" or jar file system won't recognise the URI.
-      // but don't overdecode as URIs may not be recognised e.g. "com-microsoft-java-debug-core-0.32.0%2B1.jar" is correct
-      if (value.toUpperCase.startsWith("JAR%3AFILE"))
-        withTryDecode(value)(
-          URLDecoder.decode(_, "UTF-8").toAbsolutePath(followSymlink)
-        )
-      else if (value.toUpperCase.startsWith("JAR:FILE%3A"))
-        withTryDecode(value)(
-          URLDecoder.decode(_, "UTF-8").toAbsolutePath(followSymlink)
-        )
-      else if (value.toUpperCase.startsWith("JAR")) {
-        try URI.create(value).toAbsolutePath(followSymlink)
-        catch {
-          case _: NoSuchFileException | _: FileSystemNotFoundException =>
-            withTryDecode(value.stripPrefix("jar:"))(
-              new URI("jar", _, null).toAbsolutePath(followSymlink)
-            )
-        }
-      } else {
-        val stripped = value.stripPrefix("metals:")
-        val percentEncoded = URIEncoderDecoder.encode(stripped)
-        URI.create(percentEncoded).toAbsolutePath(followSymlink)
-      }
-    }
-    def lastIndexBetween(
-        char: Char,
-        lowerBound: Int,
-        upperBound: Int
-    ): Int = {
-      val safeLowerBound = Math.max(0, lowerBound)
-      var index = upperBound
-      while (index >= safeLowerBound && value(index) != char) {
-        index -= 1
-      }
-      if (index < safeLowerBound) -1 else index
-    }
-  }
-
-  implicit class XtensionRangeLspInverse(range: l.Range) {
-    def toLocation(uri: URI): l.Location = new l.Location(uri.toString(), range)
-  }
-
-  implicit class XtensionPositionLspInverse(pos: l.Position) {
-
-    /**
-     * LSP position translated to scalameta position. Might return None if
-     * pos is not contained in input
-     *
-     * @param input file input the position relates to
-     * @return scalameta position with offset if the pos is contained in the file
-     */
-    def toMeta(input: m.Input): Option[m.Position] = {
-      Try(
-        m.Position.Range(
-          input,
-          pos.getLine,
-          pos.getCharacter,
-          pos.getLine,
-          pos.getCharacter
-        )
-      ).toOption
-    }
-  }
 
   implicit class XtensionPositionMtags(pos: Position) {
     def encloses(other: Position): Boolean =
diff --git a/mtags/src/main/scala/scala/meta/internal/mtags/ScalametaCommonEnrichments.scala b/mtags/src/main/scala/scala/meta/internal/mtags/ScalametaCommonEnrichments.scala
index e168aea76ff..ff97cbc15a7 100644
--- a/mtags/src/main/scala/scala/meta/internal/mtags/ScalametaCommonEnrichments.scala
+++ b/mtags/src/main/scala/scala/meta/internal/mtags/ScalametaCommonEnrichments.scala
@@ -11,6 +11,7 @@ import java.nio.file.Path
 import java.nio.file.Paths
 import java.nio.file.StandardCopyOption
 import java.nio.file.StandardOpenOption
+import java.util.concurrent.CancellationException
 import java.util.logging.Level
 import java.util.logging.Logger
 
@@ -733,6 +734,8 @@ trait ScalametaCommonEnrichments extends CommonMtagsEnrichments {
     }
   }
 
+  // TODO make sure everything was ported
+
   implicit class XtensionRangeLspInverse(range: l.Range) {
     def toLocation(uri: URI): l.Location = new l.Location(uri.toString(), range)
   }
diff --git a/tests/slow/src/test/scala/tests/feature/InlayHintsScala3ExpectSuite.scala b/tests/slow/src/test/scala/tests/feature/InlayHintsScala2ExpectSuite.scala
similarity index 85%
rename from tests/slow/src/test/scala/tests/feature/InlayHintsScala3ExpectSuite.scala
rename to tests/slow/src/test/scala/tests/feature/InlayHintsScala2ExpectSuite.scala
index d5e6a7e53c2..8f4143b7f7d 100644
--- a/tests/slow/src/test/scala/tests/feature/InlayHintsScala3ExpectSuite.scala
+++ b/tests/slow/src/test/scala/tests/feature/InlayHintsScala2ExpectSuite.scala
@@ -7,13 +7,13 @@ import tests.BaseInlayHintsExpectSuite
 import tests.InputProperties
 import tests.TestScala2Compiler
 
-class InlayHintsScala3ExpectSuite(
+class InlayHintsScala2ExpectSuite(
 ) extends BaseInlayHintsExpectSuite(
       "inlayHints3",
       InputProperties.scala3(),
     ) {
   override val compiler: PresentationCompiler = {
-    TestScala3Compiler.compiler("inlayHints", input)(
+    TestScala2Compiler.compiler("inlayHints", input)(
       munitExecutionContext
     ) match {
       case Some(pc) => pc
diff --git a/tests/unit/src/test/scala/tests/WarningsLspSuite.scala b/tests/unit/src/test/scala/tests/WarningsLspSuite.scala
index d13d42e85d6..29143f147f7 100644
--- a/tests/unit/src/test/scala/tests/WarningsLspSuite.scala
+++ b/tests/unit/src/test/scala/tests/WarningsLspSuite.scala
@@ -13,7 +13,7 @@ class WarningsLspSuite extends BaseLspSuite("warnings") {
       deprecatedScala212Versions.size > 0,
       "No deprecated Scala 2.12 versions to test.",
     )
-    val using = deprecatedScala212Versions.head
+    val usingVersion = deprecatedScala212Versions.head
     for {
       _ <- initialize(
         s"""/metals.json
@@ -44,7 +44,7 @@ class WarningsLspSuite extends BaseLspSuite("warnings") {
       deprecatedScala212Versions.size > 0,
       "No deprecated Scala 2.12 versions to test.",
     )
-    val using = deprecatedScala212Versions.head
+    val usingVersion = deprecatedScala212Versions.head
     val older = "2.12.4"
     for {
       _ <- initialize(