Skip to content

Commit c3b94dc

Browse files
committed
refactor: Migrate Metals server to Scala 3
This mostly involved: - changing imports - moving things between MtagsEnrichements variants - adding () - fixing bugs reported now as warning or errors (things previously not reported at all)
1 parent fcb65af commit c3b94dc

File tree

199 files changed

+929
-756
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

199 files changed

+929
-756
lines changed

.scalafix.conf

+4-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
rules = [
2-
OrganizeImports,
3-
ExplicitResultTypes,
4-
RemoveUnused
2+
OrganizeImports
53
]
64

7-
ExplicitResultTypes.rewriteStructuralTypesToNamedSubclass = false
8-
9-
RemoveUnused.imports = false
10-
115
OrganizeImports.groupedImports = Explode
126
OrganizeImports.expandRelative = true
13-
OrganizeImports.removeUnused = true
7+
OrganizeImports.removeUnused = false
148
OrganizeImports.groups = [
159
"re:javax?\\."
1610
"scala."
1711
"scala.meta."
1812
"*"
1913
]
14+
15+
OrganizeImports.targetDialect = StandardLayout

.scalafix2.conf

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
rules = [
2+
OrganizeImports,
3+
ExplicitResultTypes,
4+
RemoveUnused
5+
]
6+
7+
ExplicitResultTypes.rewriteStructuralTypesToNamedSubclass = false
8+
9+
RemoveUnused.imports = false
10+
11+
OrganizeImports.groupedImports = Explode
12+
OrganizeImports.expandRelative = true
13+
OrganizeImports.removeUnused = true
14+
OrganizeImports.groups = [
15+
"re:javax?\\."
16+
"scala."
17+
"scala.meta."
18+
"*"
19+
]

.scalafix3.conf

-14
This file was deleted.

.scalafmt.conf

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
version = "3.8.3"
2-
runner.dialect = scala213source3
2+
runner.dialect = scala3
33
project.git = true
44
align.preset = none
55
align.stripMargin = true
@@ -37,6 +37,7 @@ fileOverride {
3737
},
3838
"glob:**/mtags*/**" {
3939
trailingCommas = never
40+
runner.dialect = scala213
4041
}
4142
"glob:**/tests/cross/src/**" {
4243
trailingCommas = never

build.sbt

+63-25
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,16 @@ def crossSetting[A](
3636
logo := Welcome.logo
3737
usefulTasks := Welcome.tasks
3838

39-
ThisBuild / scalafixScalaBinaryVersion := scalaBinaryVersion.value
39+
ThisBuild / scalafixScalaBinaryVersion := "2.13"
4040

4141
inThisBuild(
4242
List(
4343
version ~= { dynVer =>
4444
if (isCI) dynVer
4545
else localSnapshotVersion // only for local publishing
4646
},
47-
scalaVersion := V.scala213,
48-
crossScalaVersions := List(V.scala213),
47+
scalaVersion := V.scala3,
48+
crossScalaVersions := List(V.scala3),
4949
organization := "org.scalameta",
5050
licenses := Seq(
5151
"Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0")
@@ -128,7 +128,7 @@ commands ++= Seq(
128128
runMtagsPublishLocal(st, v, localSnapshotVersion)
129129
}
130130
"interfaces/publishLocal" ::
131-
s"++${V.scala213} metals/publishLocal" ::
131+
s"++${V.scala3} metals/publishLocal" ::
132132
"mtags-java/publishLocal" ::
133133
publishMtags
134134
},
@@ -218,6 +218,27 @@ val sharedSettings = sharedJavacOptions ++ sharedScalacOptions ++ List(
218218
)
219219
),
220220
),
221+
excludeDependencies ++= crossSetting(
222+
scalaVersion.value,
223+
if3 = {
224+
// Exclude cross published version dependencies leading to conflicts in Scala 3 vs 2.13
225+
// When using Scala 3 exclude Scala 2.13 standard native libraries,
226+
// when using Scala 2.13 exclude Scala 3 standard native libraries
227+
// Use full name, Maven style published artifacts cannot use artifact/cross version for exclusion rules
228+
List(
229+
ExclusionRule()
230+
.withOrganization("org.scala-lang.modules")
231+
.withName(
232+
"scala-collection-compat_2.13"
233+
),
234+
ExclusionRule()
235+
.withOrganization("org.scala-lang.modules")
236+
.withName(
237+
"scala-xml_2.13"
238+
),
239+
)
240+
},
241+
),
221242
scalacOptions ++= lintingOptions(scalaVersion.value),
222243
)
223244

@@ -299,6 +320,10 @@ def withExcludes(moduleId: ModuleID) =
299320
"com.lihaoyi",
300321
"sourcecode_2.13",
301322
) // avoid 2.13 and 3 on the classpath since it comes in via pprint
323+
.exclude(
324+
"org.scala-lang.modules",
325+
"scala-parallel-collections_2.13",
326+
) // avoid 2.13 and 3 on the classpath since it comes in via pprint
302327

303328
def scala3SemanticdbDependency: ModuleID = withExcludes(
304329
("org.scalameta" % s"semanticdb-shared_${V.scala213}" % V.scalameta)
@@ -309,6 +334,10 @@ def scala3ScalametaDependency: ModuleID = withExcludes(
309334
.cross(CrossVersion.for3Use2_13)
310335
)
311336

337+
def scala3MetapDependency: ModuleID = withExcludes(
338+
"org.scalameta" % s"semanticdb-metap_${V.scala213}" % V.scalameta
339+
)
340+
312341
val mtagsSettings = List(
313342
crossScalaVersions := V.supportedScalaVersions,
314343
crossTarget := target.value / s"scala-${scalaVersion.value}",
@@ -370,22 +399,22 @@ val mtagsSettings = List(
370399
},
371400
)
372401

373-
lazy val mtags3 = project
402+
lazy val mtags2 = project
374403
.in(file(".mtags"))
375404
.settings(
376405
Compile / unmanagedSourceDirectories := Seq(),
377406
sharedSettings,
378407
mtagsSettings,
379408
Compile / unmanagedSourceDirectories += (ThisBuild / baseDirectory).value / "mtags" / "src" / "main" / "scala",
380409
Compile / unmanagedSourceDirectories += (ThisBuild / baseDirectory).value / "mtags-shared" / "src" / "main" / "scala",
381-
Compile / unmanagedSourceDirectories += (ThisBuild / baseDirectory).value / "mtags-shared" / "src" / "main" / "scala-3",
382-
moduleName := "mtags3",
383-
scalaVersion := V.scala3,
384-
target := (ThisBuild / baseDirectory).value / "mtags" / "target" / "target3",
410+
Compile / unmanagedSourceDirectories += (ThisBuild / baseDirectory).value / "mtags-shared" / "src" / "main" / "scala-2.13",
411+
moduleName := "mtags2",
412+
scalaVersion := V.scala213,
413+
target := (ThisBuild / baseDirectory).value / "mtags" / "target" / "target2",
385414
publish / skip := true,
386415
libraryDependencies += V.guava,
387416
scalafixConfig := Some(
388-
(ThisBuild / baseDirectory).value / ".scalafix3.conf"
417+
(ThisBuild / baseDirectory).value / ".scalafix2.conf"
389418
),
390419
)
391420
.dependsOn(interfaces)
@@ -433,26 +462,34 @@ lazy val metals = project
433462
// for BSP
434463
"org.scala-sbt.ipcsocket" % "ipcsocket" % "1.6.2",
435464
"ch.epfl.scala" % "bsp4j" % V.bsp,
436-
"ch.epfl.scala" %% "bloop-rifle" % V.bloop,
465+
("ch.epfl.scala" %% "bloop-rifle" % V.bloop)
466+
.cross(CrossVersion.for3Use2_13),
437467
// for LSP
438468
V.lsp4j,
439469
// for DAP
440470
V.dap4j,
441-
"ch.epfl.scala" %% "scala-debug-adapter" % V.debugAdapter,
471+
("ch.epfl.scala" %% "scala-debug-adapter" % V.debugAdapter)
472+
.cross(CrossVersion.for3Use2_13),
442473
// for finding paths of global log/cache directories
443474
"dev.dirs" % "directories" % "26",
444475
// ==================
445476
// Scala dependencies
446477
// ==================
447478
"org.scalameta" % "mdoc-interfaces" % V.mdoc,
448-
"org.scalameta" %% "scalafmt-dynamic" % V.scalafmt,
479+
("org.scalameta" %% "scalafmt-dynamic" % V.scalafmt)
480+
.cross(CrossVersion.for3Use2_13),
481+
"com.googlecode.java-diff-utils" % "diffutils" % "1.3.0",
449482
"ch.epfl.scala" % "scalafix-interfaces" % V.scalafix,
450483
// For reading classpaths.
451484
// for fetching ch.epfl.scala:bloop-frontend and other library dependencies
452485
"io.get-coursier" % "interface" % V.coursierInterfaces,
453486
// for comparing versions && fetching from sbt maven repository
454-
"io.get-coursier" %% "coursier" % V.coursier,
455-
"io.get-coursier" %% "coursier-sbt-maven-repository" % V.coursier,
487+
("io.get-coursier" %% "versions" % "0.3.2")
488+
.cross(CrossVersion.for3Use2_13),
489+
("io.get-coursier" %% "coursier-sbt-maven-repository" % V.coursier)
490+
.cross(CrossVersion.for3Use2_13),
491+
("io.get-coursier" %% "coursier" % V.coursier)
492+
.cross(CrossVersion.for3Use2_13),
456493
// for logging
457494
"com.outr" %% "scribe" % V.scribe,
458495
"com.outr" %% "scribe-file" % V.scribe,
@@ -462,15 +499,12 @@ lazy val metals = project
462499
// For fetching projects' templates
463500
"com.lihaoyi" %% "requests" % "0.9.0",
464501
// for producing SemanticDB from Scala source files, to be sure we want the same version of scalameta
465-
"org.scalameta" %% "scalameta" % V.semanticdb(scalaVersion.value),
466-
"org.scalameta" %% "semanticdb-metap" % V.semanticdb(
467-
scalaVersion.value
468-
) cross CrossVersion.full,
469-
"org.scalameta" % "semanticdb-shared" % V.semanticdb(
470-
scalaVersion.value
471-
) cross CrossVersion.full,
502+
scala3ScalametaDependency,
503+
scala3MetapDependency,
504+
scala3SemanticdbDependency,
472505
// For starting Ammonite
473-
"io.github.alexarchambault.ammonite" %% "ammonite-runner" % "0.4.0",
506+
("io.github.alexarchambault.ammonite" %% "ammonite-runner" % "0.4.0")
507+
.cross(CrossVersion.for3Use2_13),
474508
"org.scala-lang.modules" %% "scala-xml" % "2.3.0",
475509
"org.scala-lang.modules" %% "scala-parallel-collections" % "1.0.4",
476510
("org.virtuslab.scala-cli" % "scala-cli-bsp" % V.scalaCli)
@@ -540,6 +574,7 @@ lazy val input = project
540574
.in(file("tests/input"))
541575
.settings(
542576
sharedSettings,
577+
scalaVersion := V.scala213,
543578
scalacOptions -= "-Xsource:3",
544579
publish / skip := true,
545580
libraryDependencies ++= List(
@@ -716,6 +751,7 @@ lazy val metalsDependencies = project
716751
.in(file("target/.dependencies"))
717752
.settings(
718753
publish / skip := true,
754+
scalaVersion := V.scala213,
719755
// silent the intransitive dependency warning
720756
publishMavenStyle := false,
721757
libraryDependencies ++= List(
@@ -745,8 +781,10 @@ lazy val unit = project
745781
sharedSettings,
746782
Test / javaOptions += "-Xmx2G",
747783
libraryDependencies ++= List(
748-
"io.get-coursier" %% "coursier" % V.coursier, // for jars
749-
"ch.epfl.scala" %% "bloop-config" % V.bloopConfig,
784+
("io.get-coursier" %% "coursier" % V.coursier)
785+
.cross(CrossVersion.for3Use2_13), // for jars
786+
("ch.epfl.scala" %% "bloop-config" % V.bloopConfig)
787+
.cross(CrossVersion.for3Use2_13),
750788
"org.scalameta" %% "munit" % V.munit,
751789
),
752790
buildInfoPackage := "tests",

metals-bench/src/main/scala/bench/MetalsBench.scala

-43
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package bench
22

3-
import scala.reflect.internal.util.BatchSourceFile
4-
import scala.reflect.io.VirtualFile
5-
import scala.tools.nsc.interactive.Global
6-
73
import scala.meta.dialects
8-
import scala.meta.interactive.InteractiveSemanticdb
94
import scala.meta.internal.metals.EmptyReportContext
105
import scala.meta.internal.metals.IdentifierIndex
116
import scala.meta.internal.metals.JdkSources
@@ -23,7 +18,6 @@ import scala.meta.internal.mtags.SemanticdbClasspath
2318
import scala.meta.internal.parsing.Trees
2419
import scala.meta.internal.semanticdb.TextDocument
2520
import scala.meta.internal.tokenizers.LegacyScanner
26-
import scala.meta.internal.tokenizers.LegacyToken
2721
import scala.meta.io.AbsolutePath
2822
import scala.meta.io.Classpath
2923

@@ -129,22 +123,6 @@ class MetalsBench {
129123
}
130124
}
131125

132-
@Benchmark
133-
@BenchmarkMode(Array(Mode.SingleShotTime))
134-
def scalacTokenize(): Unit = {
135-
val g = global
136-
scalaDependencySources.foreach { input =>
137-
val unit = new g.CompilationUnit(
138-
new BatchSourceFile(new VirtualFile(input.path), input.chars)
139-
)
140-
val scanner = g.newUnitScanner(unit)
141-
scanner.init()
142-
while (scanner.token != LegacyToken.EOF) {
143-
scanner.nextToken()
144-
}
145-
}
146-
}
147-
148126
@Benchmark
149127
@BenchmarkMode(Array(Mode.SingleShotTime))
150128
def scalametaParse(): Unit = {
@@ -154,27 +132,6 @@ class MetalsBench {
154132
}
155133
}
156134

157-
lazy val global: Global = InteractiveSemanticdb.newCompiler()
158-
159-
@Benchmark
160-
@BenchmarkMode(Array(Mode.SingleShotTime))
161-
def scalacParse(): Unit = {
162-
val g = global
163-
scalaDependencySources.foreach { input =>
164-
val unit = new g.CompilationUnit(
165-
new BatchSourceFile(new VirtualFile(input.path), input.chars)
166-
)
167-
val tree = g.newUnitParser(unit).parse()
168-
var i = 0
169-
new g.Traverser {
170-
override def apply[T <: g.Tree](tree: T): T = {
171-
i += 1
172-
super.apply(tree)
173-
}
174-
}.traverse(tree)
175-
}
176-
}
177-
178135
@Benchmark
179136
@BenchmarkMode(Array(Mode.SingleShotTime))
180137
def mtagsJavaParse(): Unit = {

metals/src/main/scala/scala/meta/internal/bsp/BspConfigGenerator.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import scala.meta.internal.builds.BuildServerProvider
1212
import scala.meta.internal.builds.ShellRunner
1313
import scala.meta.internal.metals.Directories
1414
import scala.meta.internal.metals.Messages.BspProvider
15-
import scala.meta.internal.metals.MetalsEnrichments._
16-
import scala.meta.internal.metals.StatusBar
1715
import scala.meta.internal.metals.UserConfiguration
16+
import scala.meta.internal.metals.StatusBar
17+
import scala.meta.internal.metals.MetalsEnrichments.given
1818
import scala.meta.internal.metals.clients.language.MetalsLanguageClient
1919
import scala.meta.io.AbsolutePath
2020

metals/src/main/scala/scala/meta/internal/bsp/BspConnector.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import scala.meta.internal.metals.CreateSession
1818
import scala.meta.internal.metals.GenerateBspConfigAndConnect
1919
import scala.meta.internal.metals.Messages
2020
import scala.meta.internal.metals.Messages.BspSwitch
21-
import scala.meta.internal.metals.MetalsEnrichments._
2221
import scala.meta.internal.metals.SlowConnect
22+
import scala.meta.internal.metals.MetalsEnrichments.given
2323
import scala.meta.internal.metals.StatusBar
2424
import scala.meta.internal.metals.Tables
2525
import scala.meta.internal.metals.UserConfiguration
@@ -192,7 +192,7 @@ class BspConnector(
192192
None,
193193
)
194194
for {
195-
Some(item) <- client
195+
case Some(item) <- client
196196
.showMessageRequest(query.params)
197197
.asScala
198198
.map(item =>

metals/src/main/scala/scala/meta/internal/builds/BloopInstall.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import scala.meta.internal.builds.Digest.Status
1010
import scala.meta.internal.metals.BuildInfo
1111
import scala.meta.internal.metals.Confirmation
1212
import scala.meta.internal.metals.Messages._
13-
import scala.meta.internal.metals.MetalsEnrichments._
13+
import scala.meta.internal.metals.MetalsEnrichments.given
1414
import scala.meta.internal.metals.Tables
1515
import scala.meta.internal.metals.UserConfiguration
1616
import scala.meta.internal.metals.clients.language.MetalsLanguageClient

metals/src/main/scala/scala/meta/internal/builds/BspOnly.scala

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package scala.meta.internal.builds
22

33
import java.security.MessageDigest
44

5-
import scala.meta.internal.builds.Digest
65
import scala.meta.internal.mtags.MD5
76
import scala.meta.io.AbsolutePath
87

0 commit comments

Comments
 (0)