BuildHelper.scala 4.5 KB
Newer Older
D
Dejan Mijić 已提交
1
import sbt._
D
Dejan Mijić 已提交
2
import Keys._
D
Dejan Mijić 已提交
3 4
import sbtbuildinfo._
import BuildInfoKeys._
D
Dejan Mijić 已提交
5
import scalafix.sbt.ScalafixPlugin.autoImport._
D
Dejan Mijić 已提交
6 7

object BuildHelper {
D
Dejan Mijić 已提交
8
  private val versions: Map[String, String] = {
D
Dejan Mijić 已提交
9
    import org.snakeyaml.engine.v2.api.{Load, LoadSettings}
D
Dejan Mijić 已提交
10

D
Dejan Mijić 已提交
11
    import java.util.{List => JList, Map => JMap}
D
Dejan Mijić 已提交
12 13 14 15
    import scala.jdk.CollectionConverters._

    val doc = new Load(LoadSettings.builder().build())
      .loadFromReader(scala.io.Source.fromFile(".github/workflows/ci.yml").bufferedReader())
D
Dejan Mijić 已提交
16

D
Dejan Mijić 已提交
17
    val yaml = doc.asInstanceOf[JMap[String, JMap[String, JMap[String, JMap[String, JMap[String, JList[String]]]]]]]
D
Dejan Mijić 已提交
18

D
Dejan Mijić 已提交
19
    val list = yaml.get("jobs").get("test").get("strategy").get("matrix").get("scala").asScala
D
Dejan Mijić 已提交
20

D
Dejan Mijić 已提交
21 22 23 24 25 26
    list.map { v =>
      val vs  = v.split('.')
      val len = if (vs(0) == "2") 2 else 1

      (vs.take(len).mkString("."), v)
    }.toMap
D
Dejan Mijić 已提交
27 28
  }

D
Dejan Mijić 已提交
29 30 31
  val Scala212 = versions("2.12")
  val Scala213 = versions("2.13")
  val Scala3   = versions("3")
D
Dejan Mijić 已提交
32

33
  val zioVersion       = "2.0.11"
34
  val zioSchemaVersion = "0.4.10"
35

D
Dejan Mijić 已提交
36
  def buildInfoSettings(packageName: String) =
D
Dejan Mijić 已提交
37
    List(
D
Dejan Mijić 已提交
38
      buildInfoKeys    := List[BuildInfoKey](name, version, scalaVersion, sbtVersion, isSnapshot),
D
Dejan Mijić 已提交
39
      buildInfoPackage := packageName,
D
Dejan Mijić 已提交
40
      buildInfoObject  := "BuildInfo"
D
Dejan Mijić 已提交
41 42
    )

43 44 45 46
  def macroDefinitionSettings =
    List(
      scalacOptions += "-language:experimental.macros",
      libraryDependencies ++= {
D
Dejan Mijić 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
        if (scalaVersion.value == Scala3) Seq()
        else
          Seq(
            "org.scala-lang" % "scala-reflect"  % scalaVersion.value % Provided,
            "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided
          )
      }
    )

  def scala3Settings =
    List(
      crossScalaVersions += Scala3,
      scalacOptions --= {
        if (scalaVersion.value == Scala3) List("-Xfatal-warnings") else Nil
      },
      Compile / doc / sources := {
        val old = (Compile / doc / sources).value
        if (scalaVersion.value == Scala3) Nil else old
      },
      Test / parallelExecution := {
        val old = (Test / parallelExecution).value
        if (scalaVersion.value == Scala3) false else old
69 70 71
      }
    )

D
Dejan Mijić 已提交
72
  def stdSettings(prjName: String) =
D
Dejan Mijić 已提交
73
    List(
D
Dejan Mijić 已提交
74
      name                     := s"$prjName",
D
Dejan Mijić 已提交
75
      crossScalaVersions       := List(Scala212, Scala213, Scala3),
D
Dejan Mijić 已提交
76 77
      ThisBuild / scalaVersion := Scala213,
      scalacOptions            := stdOptions ++ extraOptions(scalaVersion.value, optimize = !isSnapshot.value),
D
Dejan Mijić 已提交
78
      semanticdbEnabled        := scalaVersion.value != Scala3,
D
Dejan Mijić 已提交
79 80 81 82 83
      semanticdbOptions += "-P:semanticdb:synthetics:on",
      semanticdbVersion                                          := scalafixSemanticdb.revision,
      ThisBuild / scalafixScalaBinaryVersion                     := CrossVersion.binaryScalaVersion(scalaVersion.value),
      ThisBuild / scalafixDependencies += "com.github.liancheng" %% "organize-imports" % "0.6.0",
      Test / parallelExecution                                   := true,
D
Dejan Mijić 已提交
84 85 86
      incOptions ~= (_.withLogRecompileOnMacro(false)),
      autoAPIMappings := true
    )
D
Dejan Mijić 已提交
87 88 89

  private def extraOptions(scalaVersion: String, optimize: Boolean) =
    CrossVersion.partialVersion(scalaVersion) match {
D
Dejan Mijić 已提交
90 91
      case Some((3, _)) =>
        List("-language:implicitConversions", "-Xignore-scala2-macros")
D
Dejan Mijić 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
      case Some((2, 13)) =>
        List("-Ywarn-unused:params,-implicits") ++ std2xOptions ++ optimizerOptions(optimize)
      case Some((2, 12)) =>
        List(
          "-opt-warnings",
          "-Ywarn-extra-implicit",
          "-Ywarn-unused:_,imports",
          "-Ywarn-unused:imports",
          "-Ypartial-unification",
          "-Yno-adapted-args",
          "-Ywarn-inaccessible",
          "-Ywarn-infer-any",
          "-Ywarn-nullary-override",
          "-Ywarn-nullary-unit",
          "-Ywarn-unused:params,-implicits",
          "-Xfuture",
          "-Xsource:2.13",
          "-Xmax-classfile-name",
          "242"
        ) ++ std2xOptions ++ optimizerOptions(optimize)
      case _ => Nil
    }

  private def optimizerOptions(optimize: Boolean): List[String] =
    if (optimize) List("-opt:l:inline", "-opt-inline-from:zio.internal.**") else Nil

  private val stdOptions =
    List("-deprecation", "-encoding", "UTF-8", "-feature", "-unchecked", "-Xfatal-warnings")

  private val std2xOptions =
    List(
      "-language:higherKinds",
      "-language:existentials",
      "-explaintypes",
      "-Yrangepos",
D
Dejan Mijić 已提交
127
      "-Xlint:_,-missing-interpolator,-type-parameter-shadow,-infer-any",
D
Dejan Mijić 已提交
128 129 130
      "-Ywarn-numeric-widen",
      "-Ywarn-value-discard"
    )
D
Dejan Mijić 已提交
131
}