Skip to content

Commit 1b3e208

Browse files
committed
cross-build to sbt 2.x
1 parent 2d04dfd commit 1b3e208

File tree

24 files changed

+248
-222
lines changed

24 files changed

+248
-222
lines changed

.github/workflows/ci.yml

+19-53
Original file line numberDiff line numberDiff line change
@@ -5,65 +5,31 @@ on:
55
- main
66
pull_request:
77
jobs:
8-
jdk8:
9-
name: JDK8 tests
8+
ubuntu:
9+
strategy:
10+
fail-fast: false
11+
matrix:
12+
jvm: ["8", "11", "17", "21", "23"]
13+
scala: ["2.12", "3.6"]
14+
name: Ubuntu / JDK${{ matrix.jvm }} / Scala ${{ matrix.scala }}
1015
runs-on: ubuntu-latest
1116
steps:
1217
- uses: actions/checkout@v4
1318
- uses: coursier/setup-action@v1
1419
with:
1520
apps: sbt
16-
jvm: temurin:8
17-
- run: rm -rf src/sbt-test/skip-sbt1.4
18-
- run: sbt test scripted
19-
jdk11:
20-
name: JDK11 tests
21-
runs-on: ubuntu-latest
22-
steps:
23-
- uses: actions/checkout@v4
24-
- uses: coursier/setup-action@v1
25-
with:
26-
apps: sbt
27-
jvm: temurin:11
28-
- run: rm -rf src/sbt-test/skip-sbt1.4
29-
- run: sbt test scripted
30-
jdk17:
31-
name: JDK17 tests
32-
runs-on: ubuntu-latest
33-
steps:
34-
- uses: actions/checkout@v4
35-
- uses: coursier/setup-action@v1
36-
with:
37-
apps: sbt
38-
jvm: temurin:17
39-
- run: rm -rf src/sbt-test/skip-java17+
40-
- run: rm -rf src/sbt-test/skip-sbt1.4
41-
- run: sbt test scripted
42-
43-
jdk21:
44-
name: JDK21 tests
45-
runs-on: ubuntu-latest
46-
steps:
47-
- uses: actions/checkout@v4
48-
- uses: coursier/setup-action@v1
49-
with:
50-
apps: sbt
51-
jvm: temurin:21
52-
- run: rm -rf src/sbt-test/skip-java17+
53-
- run: sbt test scripted
54-
jdk23:
55-
name: JDK23 tests
56-
runs-on: ubuntu-latest
57-
steps:
58-
- uses: actions/checkout@v4
59-
- uses: coursier/setup-action@v1
60-
with:
61-
apps: sbt
62-
jvm: temurin:23
63-
- run: rm -rf src/sbt-test/skip-java17+
64-
- run: sbt test scripted
21+
jvm: temurin:${{ matrix.jvm }}
22+
- if: matrix.jvm == '8' || matrix.jvm == '11' || matrix.jvm == '17'
23+
run: rm -rf src/sbt-test/skip-sbt1.4
24+
- if: matrix.jvm == '17' || matrix.jvm == '21' || matrix.jvm == '23'
25+
run: rm -rf src/sbt-test/skip-java17+
26+
- run: sbt ++${{ matrix.scala }} test scripted
6527
windows:
66-
name: Windows tests
28+
strategy:
29+
fail-fast: false
30+
matrix:
31+
scala: ["2.12", "3.6"]
32+
name: Windows / Scala ${{ matrix.scala }}
6733
runs-on: windows-latest
6834
steps:
6935
- uses: actions/checkout@v4
@@ -72,7 +38,7 @@ jobs:
7238
apps: sbt
7339
- run: rm -r -fo src\sbt-test\skip-sbt1.4
7440
- run: rm -r -fo src\sbt-test\skip-windows
75-
- run: sbt test-skip-windows scripted
41+
- run: sbt ++${{ matrix.scala }} test-skip-windows scripted
7642
shell: bash
7743
checks:
7844
name: Scalafmt

bin/test-release.sh

+4
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ version=$1
66
cs resolve \
77
--sbt-version 1.0 \
88
--sbt-plugin "ch.epfl.scala:sbt-scalafix:$version"
9+
10+
cs resolve \
11+
--sbt-version 2.0.0-SNAPSHOT \
12+
--sbt-plugin "ch.epfl.scala:sbt-scalafix:$version"

build.sbt

+41-11
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,59 @@ libraryDependencies ++= List(
4444
"org.scalatest" %% "scalatest" % "3.2.19" % Test
4545
)
4646

47-
scalaVersion := "2.12.20"
47+
lazy val scala212 = "2.12.20"
48+
lazy val scala3 = "3.6.4"
49+
50+
scalaVersion := scala212
51+
crossScalaVersions := Seq(scala212, scala3)
4852

4953
// keep this as low as possible to avoid running into binary incompatibility such as https://github.com/sbt/sbt/issues/5049
50-
pluginCrossBuild / sbtVersion := "1.4.0"
54+
pluginCrossBuild / sbtVersion := {
55+
scalaBinaryVersion.value match {
56+
case "2.12" =>
57+
"1.4.0"
58+
case _ =>
59+
"2.0.0-SNAPSHOT"
60+
}
61+
}
5162

5263
scriptedSbt := {
5364
val jdk = System.getProperty("java.specification.version").toDouble
5465

5566
if (jdk >= 21)
56-
"1.9.0" // first release that supports JDK21
67+
Ordering[String].max(
68+
(pluginCrossBuild / sbtVersion).value,
69+
"1.9.0" // first release that supports JDK21
70+
)
5771
else
5872
(pluginCrossBuild / sbtVersion).value
5973
}
6074

61-
libraryDependencies += compilerPlugin(scalafixSemanticdb)
62-
63-
scalacOptions ++= List("-Ywarn-unused", "-Yrangepos")
75+
libraryDependencies ++= {
76+
scalaBinaryVersion.value match {
77+
case "2.12" =>
78+
List(compilerPlugin(scalafixSemanticdb))
79+
case _ =>
80+
Nil
81+
}
82+
}
6483

65-
scalacOptions ++= List(
66-
"-target:jvm-1.8",
67-
"-Xfatal-warnings",
68-
"-Xlint"
69-
)
84+
scalacOptions ++= {
85+
scalaBinaryVersion.value match {
86+
case "2.12" =>
87+
List(
88+
"-Ywarn-unused",
89+
"-Yrangepos",
90+
"-Xlint"
91+
)
92+
case _ =>
93+
List(
94+
"-Wunused:all",
95+
"-Werror",
96+
"-Wconf:msg=scalafixScalaBinaryVersion.*deprecated:silent"
97+
)
98+
}
99+
}
70100

71101
// Scripted
72102
enablePlugins(ScriptedPlugin)

project/Dependencies.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ object Dependencies {
77
val all = List(
88
"org.eclipse.jgit" % "org.eclipse.jgit" % "5.13.3.202401111512-r",
99
"ch.epfl.scala" % "scalafix-interfaces" % scalafixVersion,
10-
"io.get-coursier" % "interface" % "1.0.28"
10+
"io.get-coursier" % "interface" % "1.0.28",
11+
"org.scala-lang.modules" %% "scala-collection-compat" % "2.13.0"
1112
)
1213
}

project/plugins.sbt

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Compile / unmanagedSourceDirectories ++= {
66
val root = (ThisBuild / baseDirectory).value.getParentFile / "src" / "main"
77
List(
88
root / "scala",
9-
root / "scala-sbt-1.0"
9+
root / "scala-2.12"
1010
)
1111
}
1212
libraryDependencies ++= Dependencies.all
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package scalafix.internal.sbt
2+
3+
import sbt._
4+
import sbt.librarymanagement.ModuleID
5+
6+
object Compat {
7+
8+
def extractModuleID(
9+
attributed: Attributed[File]
10+
): Option[ModuleID] =
11+
attributed.get(Keys.moduleID.key)
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package scalafix.internal.sbt
2+
3+
import sbt._
4+
import sbt.librarymanagement.ModuleID
5+
6+
object Compat {
7+
8+
def extractModuleID(
9+
attributed: Attributed[xsbti.HashedVirtualFileRef]
10+
): Option[ModuleID] =
11+
attributed
12+
.get(Keys.moduleIDStr)
13+
.map(Classpaths.moduleIdJsonKeyFormat.read)
14+
}

src/main/scala/scalafix/internal/sbt/CoursierRepoResolvers.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import sbt.util.Logger
77

88
import java.net.MalformedURLException
99
import java.nio.file.Paths
10-
import scala.collection.JavaConverters.*
10+
import scala.jdk.CollectionConverters.*
1111

1212
// vendor from sbt-coursier/lmcoursier.internal.Resolvers
1313
object CoursierRepoResolvers {
@@ -122,7 +122,7 @@ object CoursierRepoResolvers {
122122

123123
private object IBiblioRepository {
124124

125-
private def stringVector(v: java.util.List[_]): Vector[String] =
125+
private def stringVector(v: java.util.List[?]): Vector[String] =
126126
Option(v).map(_.asScala.toVector).getOrElse(Vector.empty).collect {
127127
case s: String => s
128128
}

src/main/scala/scalafix/internal/sbt/JGitCompletions.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import org.eclipse.jgit.util.FS
1010
import org.eclipse.jgit.util.GitDateFormatter
1111

1212
import java.nio.file.Path
13-
import scala.collection.JavaConverters._
13+
import scala.jdk.CollectionConverters._
1414
import scala.util.Try
1515

1616
class JGitCompletion(cwd: Path) {

src/main/scala/scalafix/internal/sbt/ScalafixInterface.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import sbt.io.RegularFileFilter
88
import scalafix.interfaces.{Scalafix => ScalafixAPI, _}
99
import scalafix.sbt.InvalidArgument
1010

11-
import scala.collection.JavaConverters._
11+
import scala.jdk.CollectionConverters._
1212
import java.io.PrintStream
1313

1414
sealed trait Arg extends (ScalafixArguments => ScalafixArguments)
@@ -38,7 +38,7 @@ object Arg {
3838
.map(uri => java.nio.file.Paths.get(uri).toFile)
3939
.flatMap {
4040
case classDirectory if classDirectory.isDirectory =>
41-
classDirectory.**(RegularFileFilter).get
41+
classDirectory.**(RegularFileFilter).get()
4242
case jar =>
4343
Seq(jar)
4444
}
@@ -113,10 +113,10 @@ class ScalafixInterface private (
113113
scalafixArguments.run().toSeq
114114

115115
def availableRules(): Seq[ScalafixRule] =
116-
scalafixArguments.availableRules().asScala
116+
scalafixArguments.availableRules().asScala.toSeq
117117

118118
def rulesThatWillRun(): Seq[ScalafixRule] =
119-
try scalafixArguments.rulesThatWillRun().asScala
119+
try scalafixArguments.rulesThatWillRun().asScala.toSeq
120120
catch {
121121
case e: ScalafixException => throw new InvalidArgument(e.getMessage)
122122
}

src/main/scala/scalafix/internal/sbt/SemanticRuleValidator.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class SemanticRuleValidator(ifNotFound: SemanticdbNotFound) {
2525
invalidArguments.foreach { invalidArgument =>
2626
errors += invalidArgument.getMessage
2727
}
28-
errors
28+
errors.toSeq
2929
}
3030
}
3131
}

src/main/scala/scalafix/sbt/ScalafixEnable.scala

+17-17
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import sbt.VersionNumber.SemVer
66

77
import ScalafixPlugin.autoImport.scalafixResolvers
88

9-
import collection.JavaConverters._
9+
import scala.jdk.CollectionConverters._
1010
import scala.util._
1111
import coursierapi.Repository
1212

@@ -96,7 +96,7 @@ object ScalafixEnable {
9696
VersionNumber(BuildInfo.scalametaVersion)
9797
val compatibleSemanticdbVs = Try(
9898
coursierapi.Versions.create
99-
.withRepositories(project.scalafixResolvers0: _*)
99+
.withRepositories(project.scalafixResolvers0*)
100100
.withModule(semanticdbScalacModule)
101101
.versions()
102102
.getMergedListings
@@ -160,21 +160,21 @@ object ScalafixEnable {
160160
} else {
161161
val latestAvailable =
162162
tail.lastOption.getOrElse(earliestAvailable)
163-
Seq(
164-
semanticdbVersion := {
165-
val v = latestAvailable.toString
166-
sLog.value.info(
167-
s"Setting semanticdbVersion to $v in project " +
168-
s"${project.ref.project} since the version " +
169-
s"${recommendedSemanticdbV} tracked by scalafix " +
170-
s"${BuildInfo.scalafixVersion} is no longer " +
171-
s"published for scala " +
172-
s"${project.scalaVersion0.toString} - " +
173-
s"consider bumping scala"
174-
)
175-
v
176-
}
177-
)
163+
Seq(
164+
semanticdbVersion := {
165+
val v = latestAvailable.toString
166+
sLog.value.info(
167+
s"Setting semanticdbVersion to $v in project " +
168+
s"${project.ref.project} since the version " +
169+
s"${recommendedSemanticdbV} tracked by scalafix " +
170+
s"${BuildInfo.scalafixVersion} is no longer " +
171+
s"published for scala " +
172+
s"${project.scalaVersion0.toString} - " +
173+
s"consider bumping scala"
174+
)
175+
v
176+
}
177+
)
178178
}
179179
}
180180
} :+ (semanticdbEnabled := true)

0 commit comments

Comments
 (0)