Skip to content

Commit

Permalink
Add support for Scala 2.13.5
Browse files Browse the repository at this point in the history
Issues encountered during the update:
- Scala presentation compiler will no longer complete type symbols on `a.b.Name` in positions where type is not allowed, which is actually a bugix, but we needed to change some test
- Ammonite does not have support for 2.13.5 yet and even if it has we can't currently update. In order to make the experience smoother for the users I added the logic in VersionSelector that will fallback to the last Ammonite supported Scala version instead of just failing
- there was a fix in scalameta for indented regions that changed their ends, which needed to be updated in the expect tests
- one test started to fail with 2.13.5 - is unclear if the behaviour was ever fixed in Metals or whether we relied on the compiler #2546
  • Loading branch information
tgodzik committed Feb 23, 2021
1 parent 8162942 commit 41bcf5a
Show file tree
Hide file tree
Showing 12 changed files with 222 additions and 123 deletions.
19 changes: 8 additions & 11 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,10 @@ lazy val V = new {
val sbtScala = "2.12.10"
// TODO https://github.com/scalameta/metals/issues/2392
val ammonite212Version = "2.12.12"
val ammonite213Version = "2.13.4"
val scala212 = "2.12.13"
val scala213 = "2.13.4"
val scalameta = "4.4.9"
val scala213 = "2.13.5"
val scalameta = "4.4.10"
val semanticdb = scalameta
val bsp = "2.0.0-M13"
val bloop = "1.4.8"
Expand All @@ -210,9 +211,9 @@ lazy val V = new {

// Scala 2
def deprecatedScala2Versions =
Seq(scala211, "2.12.8", "2.12.9", "2.13.0", "2.13.1")
Seq(scala211, "2.12.8", "2.12.9", "2.13.0", "2.13.1", "2.13.2")
def nonDeprecatedScala2Versions =
Seq(scala213, scala212, "2.12.12", "2.12.11", "2.12.10", "2.13.2", "2.13.3")
Seq(scala213, scala212, "2.12.12", "2.12.11", sbtScala, "2.13.3", "2.13.4")
def scala2Versions = nonDeprecatedScala2Versions ++ deprecatedScala2Versions

// Scala 3
Expand Down Expand Up @@ -473,6 +474,7 @@ lazy val metals = project
"scala211" -> V.scala211,
"scala212" -> V.scala212,
"ammonite212" -> V.ammonite212Version,
"ammonite213" -> V.ammonite213Version,
"scala213" -> V.scala213,
"scala3" -> V.scala3
)
Expand Down Expand Up @@ -580,6 +582,7 @@ def publishBinaryMtags =
V.scala212,
V.ammonite212Version,
V.scala213,
V.ammonite213Version,
V.scala3
)
)
Expand All @@ -591,13 +594,7 @@ lazy val mtest = project
testSettings,
sharedSettings,
libraryDependencies ++= List(
// munit had to drop support for 3.0.0-M1 and 0.27.0-RC1
if (
scalaVersion.value == "0.27.0-RC1" || scalaVersion.value == "3.0.0-M1"
)
"org.scalameta" %% "munit" % "0.7.19"
else
"org.scalameta" %% "munit" % V.munit,
"org.scalameta" %% "munit" % V.munit,
"io.get-coursier" % "interface" % V.coursierInterfaces
),
buildInfoPackage := "tests",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class Compilers(
PresentationCompilerKey.Default,
(_, value) => {
val scalaVersion =
scalaVersionSelector.fallbackScalaVersion(allowScala3 = true)
scalaVersionSelector.fallbackScalaVersion(isAmmonite = false)
val existingPc = Option(value).flatMap { pc =>
if (pc.scalaVersion == scalaVersion) {
Some(pc)
Expand Down Expand Up @@ -418,7 +418,7 @@ class Compilers(
jworksheetsCache.put(
path, {
val scalaVersion =
scalaVersionSelector.fallbackScalaVersion(allowScala3 = true)
scalaVersionSelector.fallbackScalaVersion(isAmmonite = false)
createStandaloneCompiler(
scalaVersion,
classpath,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package scala.meta.internal.metals

import scala.meta.Dialect
import scala.meta.internal.semver.SemVer

class ScalaVersionSelector(
userConfig: () => UserConfiguration,
buildTargets: BuildTargets
) {

def fallbackScalaVersion(allowScala3: Boolean): String = {
def fallbackScalaVersion(isAmmonite: Boolean): String = {
val selected = userConfig().fallbackScalaVersion match {
case Some(v) => v
case None =>
Expand All @@ -18,16 +19,31 @@ class ScalaVersionSelector(
.getOrElse(BuildInfo.scala212)
}

val binary = ScalaVersions.scalaBinaryVersionFromFullVersion(selected)
// ammonite doesn't support Scala3 yet
if (!allowScala3 && ScalaVersions.isScala3Version(selected))
if (isAmmonite && ScalaVersions.isScala3Version(selected))
BuildInfo.scala213
else if (
isAmmonite && binary == "2.12" && SemVer.isLaterVersion(
BuildInfo.ammonite212,
selected
)
)
BuildInfo.ammonite212
else if (
isAmmonite && binary == "2.13" && SemVer.isLaterVersion(
BuildInfo.ammonite213,
selected
)
)
BuildInfo.ammonite213
else if (ScalaVersions.isSupportedScalaVersion(selected))
selected
else
ScalaVersions.recommendedVersion(selected)
}

def fallbackDialect(allowScala3: Boolean): Dialect = {
ScalaVersions.dialectForScalaVersion(fallbackScalaVersion(allowScala3))
def fallbackDialect(isAmmonite: Boolean): Dialect = {
ScalaVersions.dialectForScalaVersion(fallbackScalaVersion(isAmmonite))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ final class Ammonite(
AmmVersions(
ammoniteVersion = BuildInfo.ammoniteVersion,
scalaVersion =
scalaVersionSelector.fallbackScalaVersion(allowScala3 = false)
scalaVersionSelector.fallbackScalaVersion(isAmmonite = true)
)
)
val res = AmmoniteFetcher(versions)
Expand Down
8 changes: 5 additions & 3 deletions metals/src/main/scala/scala/meta/internal/parsing/Trees.scala
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,19 @@ final class Trees(
Option(path.extension) match {
case Some("scala") =>
dialectFromBuildTarget.getOrElse(
scalaVersionSelector.fallbackDialect(allowScala3 = true)
scalaVersionSelector.fallbackDialect(isAmmonite = false)
)
case Some("sbt") => dialects.Sbt
case Some("sc") =>
// worksheets support Scala 3, but ammonite scripts do not
val dialect = dialectFromBuildTarget.getOrElse(
scalaVersionSelector.fallbackDialect(allowScala3 = path.isWorksheet)
scalaVersionSelector.fallbackDialect(isAmmonite =
path.isAmmoniteScript
)
)
dialect
.copy(allowToplevelTerms = true, toplevelSeparator = "")
case _ => scalaVersionSelector.fallbackDialect(allowScala3 = true)
case _ => scalaVersionSelector.fallbackDialect(isAmmonite = false)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class WorksheetProvider(

private def fallabackMdoc: Mdoc = {
val scalaVersion =
scalaVersionSelector.fallbackScalaVersion(allowScala3 = true)
scalaVersionSelector.fallbackScalaVersion(isAmmonite = false)
mdocs
.get(MdocKey.Default)
.flatMap(ref =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ trait ArgCompletions { this: MetalsGlobal =>
}

completions match {
case CompletionResult.ScopeMembers(_, results, _) =>
results
case members: CompletionResult.ScopeMembers =>
members.results
.collect {
case mem
if mem.sym.tpe <:< paramType && notNothingOrNull(
Expand Down
Loading

0 comments on commit 41bcf5a

Please sign in to comment.