Skip to content

Commit 4f69db5

Browse files
authored
Merge pull request #186 from cucumber/scala3rc1
Scala 3 support
2 parents ce707b5 + c523489 commit 4f69db5

File tree

30 files changed

+2091
-54
lines changed

30 files changed

+2091
-54
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.idea
22
**/*.iml
33
**/target/
4+
.bsp/
45
release.properties
56
pom.xml.releaseBackup
67
pom.xml.versionsBackup

.scalafmt.conf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
version = 2.7.5
22

3-
preset=default
3+
preset=default
4+
5+
runner.dialect = dotty

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ See also the [CHANGELOG](https://github.com/cucumber/cucumber-jvm/blob/master/CH
1111

1212
### Added
1313

14+
- [Scala] Support Scala 3 RC1
15+
- Check out the [v7.x upgrade guide](./docs/upgrade_v7.md)
16+
1417
### Changed
1518

1619
- [Build] Use Github Actions instead of Travis CI

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ The minor version might differ because Cucumber Scala may add Scala-related feat
2525

2626
- [Installation](./docs/install.md)
2727
- Upgrade notes
28+
- [Version 7.x](docs/upgrade_v7.md)
2829
- [Version 6.x](docs/upgrade_v6.md)
2930
- [Version 5.x](docs/upgrade_v5.md)
3031
- Documentation

build.sbt

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ThisBuild / homepage := Some(
3333
val scala211 = "2.11.12"
3434
val scala212 = "2.12.13"
3535
val scala213 = "2.13.5"
36+
val scala3 = "3.0.0-RC1"
3637

3738
scalaVersion := scala213
3839

@@ -52,6 +53,7 @@ lazy val commonSettings = Seq(
5253
case Some((2, 11)) => ScalacOptions.scalacOptions211
5354
case Some((2, 12)) => ScalacOptions.scalacOptions212
5455
case Some((2, 13)) => ScalacOptions.scalacOptions213
56+
case Some((3, 0)) => ScalacOptions.scalacOptions3
5557
case _ => Seq()
5658
}
5759
}
@@ -75,23 +77,44 @@ lazy val cucumberScala = (projectMatrix in file("cucumber-scala"))
7577
libraryDependencies ++= Seq(
7678
"io.cucumber" % "cucumber-core" % cucumberVersion,
7779
// Users have to provide it (for JacksonDefaultDataTableTransformer)
78-
"com.fasterxml.jackson.module" %% "jackson-module-scala" % jacksonVersion % Provided,
80+
("com.fasterxml.jackson.module" %% "jackson-module-scala" % jacksonVersion % Provided)
81+
.withDottyCompat(scalaVersion.value),
7982
"junit" % "junit" % junitVersion % Test,
8083
"io.cucumber" % "cucumber-junit" % cucumberVersion % Test,
81-
"org.mockito" %% "mockito-scala" % mockitoScalaVersion % Test
84+
("org.mockito" %% "mockito-scala" % mockitoScalaVersion % Test)
85+
.withDottyCompat(scalaVersion.value)
8286
),
8387
libraryDependencies ++= {
8488
CrossVersion.partialVersion(scalaVersion.value) match {
8589
case Some((2, n)) if n <= 12 =>
8690
List("org.scala-lang.modules" %% "scala-collection-compat" % "2.4.2")
91+
case Some((3, 0)) =>
92+
List("io.github.gaeljw" %% "typetrees" % "0.2.0")
8793
case _ => Nil
8894
}
8995
},
9096
unmanagedSourceDirectories in Compile ++= {
9197
val sourceDir = (sourceDirectory in Compile).value
9298
CrossVersion.partialVersion(scalaVersion.value) match {
93-
case Some((2, n)) if n <= 11 => Seq(sourceDir / "scala-2.11")
94-
case _ => Seq()
99+
case Some((2, n)) if n <= 11 =>
100+
Seq(sourceDir / "scala-2", sourceDir / "scala-2.11")
101+
case Some((2, n)) if n > 11 =>
102+
Seq(sourceDir / "scala-2")
103+
case Some((3, 0)) =>
104+
Seq(sourceDir / "scala-3")
105+
case _ =>
106+
Seq()
107+
}
108+
},
109+
unmanagedSourceDirectories in Test ++= {
110+
val testSourceDir = (sourceDirectory in Test).value
111+
CrossVersion.partialVersion(scalaVersion.value) match {
112+
case Some((2, _)) =>
113+
Seq(testSourceDir / "scala-2")
114+
case Some((3, 0)) =>
115+
Seq(testSourceDir / "scala-3")
116+
case _ =>
117+
Seq()
95118
}
96119
},
97120
// Generate I18n traits
@@ -102,7 +125,7 @@ lazy val cucumberScala = (projectMatrix in file("cucumber-scala"))
102125
Seq(file)
103126
}.taskValue
104127
)
105-
.jvmPlatform(scalaVersions = Seq(scala213, scala212, scala211))
128+
.jvmPlatform(scalaVersions = Seq(scala3, scala213, scala212, scala211))
106129

107130
// Examples project
108131
lazy val examples = (projectMatrix in file("examples"))
@@ -116,7 +139,7 @@ lazy val examples = (projectMatrix in file("examples"))
116139
publishArtifact := false
117140
)
118141
.dependsOn(cucumberScala % Test)
119-
.jvmPlatform(scalaVersions = Seq(scala213, scala212))
142+
.jvmPlatform(scalaVersions = Seq(scala3, scala213, scala212))
120143

121144
// Version policy check
122145

cucumber-scala/src/main/codegen/gen.scala

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*
3-
* Generates the evil looking apply methods in ScalaDsl#StepBody for Function1 to Function22
3+
* Generates the evil looking apply methods in StepDsl#StepBody for Function1 to Function22
44
*/
55
for (i <- 1 to 22) {
66
val ts = (1 to i).map("T".+).mkString(", ")
@@ -15,6 +15,29 @@ for (i <- 1 to 22) {
1515
println(p1 + p2 + ": Unit = { " + register + pf + otherwise + closeRegister + "\n")
1616
}
1717

18+
/*
19+
* Generates the evil looking apply methods in StepDsl#StepBody for Function1 to Function22
20+
* Scala 3
21+
*/
22+
for (i <- 1 to 22) {
23+
val ts = (1 to i).map("T".+).mkString(", ")
24+
val tagsDef = (1 to i).map(n => s"val t$n: TypeTreeTag = typeTreeTag[T$n]").mkString("\n")
25+
val tagsParam = (1 to i).map(n => s"t$n").mkString(", ")
26+
val listParams = (1 to i).map("a" + _ + ":AnyRef").mkString(", ")
27+
val pf = (1 to i).map(n => "a" + n + ".asInstanceOf[T" + n + "]").mkString(",\n ")
28+
29+
println(s"""
30+
|inline def apply[$ts](f: ($ts) => Any): Unit = {
31+
| $tagsDef
32+
| register($tagsParam) {
33+
| case List($listParams) =>
34+
| f($pf)
35+
| case _ =>
36+
| throw new IncorrectStepDefinitionException()
37+
| }
38+
|}""".stripMargin)
39+
}
40+
1841
/*
1942
* Generates the apply methods in ParameterTypeDsl for Function1 to Function22
2043
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.cucumber.scala
2+
3+
import io.github.gaeljw.typetrees.TypeTreeTag
4+
import java.lang.reflect.{ParameterizedType, Type}
5+
6+
object ScalaTypeHelper {
7+
8+
def asJavaType(tag: TypeTreeTag): Type = {
9+
if (tag.args.isEmpty) {
10+
tag.self.runtimeClass
11+
} else {
12+
new ScalaParameterizedType(tag)
13+
}
14+
}
15+
16+
}
17+
18+
class ScalaParameterizedType(tag: TypeTreeTag) extends ParameterizedType {
19+
20+
override def getActualTypeArguments: Array[Type] =
21+
tag.args.map(ScalaTypeHelper.asJavaType).toArray
22+
23+
override def getRawType: Type = tag.self.runtimeClass
24+
25+
override def getOwnerType: Type = null
26+
27+
}

0 commit comments

Comments
 (0)