Skip to content

Commit 771b093

Browse files
authored
Cross-build with Scala 3.2.2 (#332)
Take macro implementations from izumi Subsumes #181
1 parent c445f41 commit 771b093

File tree

11 files changed

+126
-59
lines changed

11 files changed

+126
-59
lines changed

build.sbt

+13-6
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,31 @@ val scalaOpts = scalacOptions ++= ((isSnapshot.value, scalaVersion.value) match
8282
"-Wvalue-discard",
8383
"-Wunused:_",
8484
)
85+
case (_, ScalaVersions.scala_3) => Seq(
86+
"-no-indent",
87+
"-explain",
88+
)
8589
case (_, _) => Seq.empty
8690
})
8791

8892
lazy val sbtmeta = (project in file("sbtmeta"))
8993
.settings(
90-
crossScalaVersions := Seq(ScalaVersions.scala_213, ScalaVersions.scala_212),
94+
crossScalaVersions := Seq(ScalaVersions.scala_3, ScalaVersions.scala_213, ScalaVersions.scala_212),
9195
scalaVersion := crossScalaVersions.value.head,
92-
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided,
96+
libraryDependencies ++= {
97+
if (scalaVersion.value.startsWith("2"))
98+
Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided)
99+
else Seq.empty
100+
},
93101
scalaOpts,
94102
)
95103

96104
lazy val sbtgen = (project in file("sbtgen"))
97105
.dependsOn(sbtmeta)
98106
.settings(
99-
crossScalaVersions := Seq(ScalaVersions.scala_213, ScalaVersions.scala_212),
107+
crossScalaVersions := Seq(ScalaVersions.scala_3, ScalaVersions.scala_213, ScalaVersions.scala_212),
100108
scalaVersion := crossScalaVersions.value.head,
101-
// libraryDependencies += "com.github.scopt" %% "scopt" % "4.0.0-RC2",
102-
libraryDependencies += "com.github.scopt" %% "scopt" % "3.7.1",
109+
libraryDependencies += "com.github.scopt" %% "scopt" % "4.1.0",
103110
libraryDependencies += "org.scala-lang.modules" %% "scala-collection-compat" % "2.11.0",
104111
(ThisBuild / libraryDependencies) += "org.scalatest" %% "scalatest" % "3.2.18" % Test,
105112
scalacOptions ++= Seq(
@@ -216,7 +223,7 @@ lazy val `izumi-sbtgen` = (project in file("."))
216223
action = { st: State =>
217224
val extracted = Project.extract(st)
218225
val ref = extracted.get(`sbt-tests` / thisProjectRef)
219-
extracted.runInputTask((ref / (Global / scripted)), "", st)._1
226+
extracted.runInputTask(ref / (Global / scripted), "", st)._1
220227
}
221228
),
222229
setReleaseVersion, // : ReleaseStep

project/ScalaVersions.scala

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
object ScalaVersions {
22
val scala_212 = "2.12.18"
33
val scala_213 = "2.13.12"
4+
val scala_3 = "3.2.2"
45

56
val scalaJsVersion = "1.15.0"
67
val scalaNativeVersion = "0.4.17"

sbtmeta/src/main/scala/izumi/sbtgen/sbtmeta/ProjectAttributeMacro.scala sbtmeta/src/main/scala-2/izumi/sbtgen/sbtmeta/ProjectAttributeMacro.scala

-26
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,20 @@
11
package izumi.sbtgen.sbtmeta
22

33
import java.nio.file.{Path, Paths}
4-
import java.time.LocalDateTime
54
import scala.annotation.tailrec
65
import scala.reflect.macros.blackbox
76

87
object ProjectAttributeMacro {
98

10-
def buildTimestampMacro(c: blackbox.Context)(): c.Expr[LocalDateTime] = {
11-
import c.universe._
12-
13-
val time = LocalDateTime.now()
14-
c.Expr[LocalDateTime] {
15-
q"{_root_.java.time.LocalDateTime.of(${time.getYear}, ${time.getMonthValue}, ${time.getDayOfMonth}, ${time.getHour}, ${time.getMinute}, ${time.getSecond}, ${time.getNano})}"
16-
}
17-
}
18-
199
def extractAttrMacro(c: blackbox.Context)(name: c.Expr[String]): c.Expr[Option[String]] = {
2010
val nameStr = TreeTools.stringLiteral(c)(c.universe)(name.tree)
2111
extractAttr(c, nameStr, force = true)
2212
}
2313

24-
def extractProjectGroupIdMacro(c: blackbox.Context)(): c.Expr[Option[String]] = {
25-
extractAttr(c, "product-group")
26-
}
27-
28-
def extractSbtVersionMacro(c: blackbox.Context)(): c.Expr[Option[String]] = {
29-
extractAttr(c, "sbt-version")
30-
}
31-
32-
def extractScalatestVersionMacro(c: blackbox.Context)(): c.Expr[Option[String]] = {
33-
extractAttr(c, "scalatest-version")
34-
}
35-
3614
def extractScalaVersionsMacro(c: blackbox.Context)(): c.Expr[Option[String]] = {
3715
extractAttr(c, "scala-versions")
3816
}
3917

40-
def extractScalaVersionMacro(c: blackbox.Context)(): c.Expr[Option[String]] = {
41-
extractAttr(c, "scala-version")
42-
}
43-
4418
def extractProjectVersionMacro(c: blackbox.Context)(): c.Expr[Option[String]] = {
4519
extractAttr(c, "product-version")
4620
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package izumi.sbtgen.sbtmeta
2+
3+
import scala.language.experimental.macros
4+
5+
object SbtgenMeta {
6+
def projectRoot(): Option[String] = macro ProjectAttributeMacro.findProjectRootMacro
7+
8+
def extractSbtProjectVersion(): Option[String] = macro ProjectAttributeMacro.extractProjectVersionMacro
9+
10+
def extractScalaVersions(): Option[String] = macro ProjectAttributeMacro.extractScalaVersionsMacro
11+
12+
def extractMandatory(name: String): Option[String] = macro ProjectAttributeMacro.extractAttrMacro
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package izumi.sbtgen.sbtmeta
2+
3+
import java.time.LocalDateTime
4+
5+
object BuildAttributes {
6+
7+
inline def sbtProjectRoot(): Option[String] = ${ BuildAttributesImpl.sbtProjectRoot() }
8+
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package izumi.sbtgen.sbtmeta
2+
3+
import java.nio.file.Path
4+
import java.time.LocalDateTime
5+
6+
import scala.annotation.tailrec
7+
import scala.quoted.{Expr, Quotes}
8+
9+
object BuildAttributesImpl {
10+
11+
def sbtProjectRoot()(using quotes: Quotes): Expr[Option[String]] = {
12+
import quotes.reflect.*
13+
14+
val result = SourceFile.current.getJPath
15+
.flatMap(findProjectRoot)
16+
.map(_.toFile.getCanonicalPath)
17+
18+
Expr(result)
19+
}
20+
21+
@tailrec
22+
private def findProjectRoot(cp: Path): Option[Path] = {
23+
if (cp.resolve("build.sbt").toFile.exists()) {
24+
Some(cp)
25+
} else {
26+
val parent = cp.getParent
27+
28+
if (parent == null || parent == cp.getRoot) {
29+
None
30+
} else {
31+
findProjectRoot(parent)
32+
}
33+
}
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package izumi.sbtgen.sbtmeta
2+
3+
import scala.quoted.{Expr, Quotes, Type}
4+
5+
object MacroParameters {
6+
7+
inline def scalaCrossVersions(): Option[String] = macroSetting("scala-versions")
8+
9+
inline def artifactVersion(): Option[String] = macroSetting("product-version")
10+
11+
inline def macroSetting(inline name: String): Option[String] = {
12+
${ MacroParametersImpl.extractString('{ name }) }
13+
}
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package izumi.sbtgen.sbtmeta
2+
3+
import scala.annotation.experimental
4+
import scala.quoted.{Expr, Quotes, Type}
5+
6+
@experimental
7+
object MacroParametersImpl {
8+
9+
def extractString(name: Expr[String])(using quotes: Quotes): Expr[Option[String]] = {
10+
Expr(extract(name.valueOrAbort))
11+
}
12+
13+
def extractBool(name: Expr[String])(using quotes: Quotes): Expr[Option[Boolean]] = {
14+
val value = extract(name.valueOrAbort)
15+
val isTrue = value.map(_.toLowerCase).map(v => v == "true" || v == "1")
16+
Expr(isTrue)
17+
}
18+
19+
private def extract(name: String)(using quotes: Quotes): Option[String] = {
20+
import quotes.reflect.*
21+
val prefix = s"$name="
22+
val value = CompilationInfo.XmacroSettings.filter(_.startsWith(prefix)).map(_.stripPrefix(prefix)).lastOption
23+
if (value.isEmpty) {
24+
report.info(s"Undefined macro parameter $name, add `-Xmacro-settings:$prefix<value>` into `scalac` options")
25+
}
26+
value
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package izumi.sbtgen.sbtmeta
2+
3+
object SbtgenMeta {
4+
inline def projectRoot(): Option[String] = ${ BuildAttributesImpl.sbtProjectRoot() }
5+
6+
inline def extractSbtProjectVersion(): Option[String] = MacroParameters.artifactVersion()
7+
8+
inline def extractScalaVersions(): Option[String] = MacroParameters.scalaCrossVersions()
9+
10+
inline def extractMandatory(inline name: String): Option[String] = MacroParameters.macroSetting(name)
11+
}

sbtmeta/src/main/scala/izumi/sbtgen/sbtmeta/SbtgenMeta.scala

-27
This file was deleted.

0 commit comments

Comments
 (0)