Skip to content

Commit 7359547

Browse files
committed
Enable Scala 3 cross-compilation for all modules
All modules (core, transpilers, compiler) now cross-compile to both Scala 2.13 and 3.3. Previously blocked by scalameta not supporting Scala 3, which is resolved since scalameta 4.14. Changes: - sbtgen: switch core, transpilers, compiler from cross2/jvm2 to cross3/jvm3 - core: backtick-quote `inline` in parser (keyword in Scala 3) - transpilers: remove deprecated `manifest` from discard() calls - compiler: extract enum codecs to version-specific PlatformEnumCodecs (circe-generic-extras for Scala 2, circe-generic for Scala 3) - sbtgen: exclude sourcecode_2.13 from transpilers and compiler (scalameta's Scala 3 parsers transitively depend on trees_2.13) - Remove outdated "Not available for Scala 3 yet" comment
1 parent a8f1d15 commit 7359547

File tree

17 files changed

+168
-78
lines changed

17 files changed

+168
-78
lines changed

build.sbt

Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,13 @@ lazy val `idealingua-v1-model` = crossProject(JVMPlatform, JSPlatform).crossType
134134
} },
135135
scalacOptions -= "-Wconf:any:error",
136136
scalacOptions += "-Wconf:msg=nowarn:silent",
137-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
137+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
138+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
139+
case (_, "3.3.7") => Seq(
140+
"com.lihaoyi" % "sourcecode_2.13"
141+
)
142+
case (_, _) => Seq.empty
143+
} }
138144
)
139145
.jvmSettings(
140146
crossScalaVersions := Seq(
@@ -274,16 +280,24 @@ lazy val `idealingua-v1-core` = crossProject(JVMPlatform, JSPlatform).crossType(
274280
} },
275281
scalacOptions -= "-Wconf:any:error",
276282
scalacOptions += "-Wconf:msg=nowarn:silent",
277-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
283+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
284+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
285+
case (_, "3.3.7") => Seq(
286+
"com.lihaoyi" % "sourcecode_2.13"
287+
)
288+
case (_, _) => Seq.empty
289+
} }
278290
)
279291
.jvmSettings(
280292
crossScalaVersions := Seq(
293+
"3.3.7",
281294
"2.13.18"
282295
),
283296
scalaVersion := crossScalaVersions.value.head
284297
)
285298
.jsSettings(
286299
crossScalaVersions := Seq(
300+
"3.3.7",
287301
"2.13.18"
288302
),
289303
scalaVersion := crossScalaVersions.value.head,
@@ -427,7 +441,13 @@ lazy val `idealingua-v1-runtime-rpc-scala` = crossProject(JVMPlatform, JSPlatfor
427441
} },
428442
scalacOptions -= "-Wconf:any:error",
429443
scalacOptions += "-Wconf:msg=nowarn:silent",
430-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
444+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
445+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
446+
case (_, "3.3.7") => Seq(
447+
"com.lihaoyi" % "sourcecode_2.13"
448+
)
449+
case (_, _) => Seq.empty
450+
} }
431451
)
432452
.jvmSettings(
433453
crossScalaVersions := Seq(
@@ -583,7 +603,13 @@ lazy val `idealingua-v1-runtime-rpc-http4s` = project.in(file("idealingua-v1/ide
583603
} },
584604
scalacOptions -= "-Wconf:any:error",
585605
scalacOptions += "-Wconf:msg=nowarn:silent",
586-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
606+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
607+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
608+
case (_, "3.3.7") => Seq(
609+
"com.lihaoyi" % "sourcecode_2.13"
610+
)
611+
case (_, _) => Seq.empty
612+
} }
587613
)
588614
.enablePlugins(IzumiPlugin)
589615

@@ -719,17 +745,25 @@ lazy val `idealingua-v1-transpilers` = crossProject(JVMPlatform, JSPlatform).cro
719745
} },
720746
scalacOptions -= "-Wconf:any:error",
721747
scalacOptions += "-Wconf:msg=nowarn:silent",
722-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
748+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
749+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
750+
case (_, "3.3.7") => Seq(
751+
"com.lihaoyi" % "sourcecode_2.13"
752+
)
753+
case (_, _) => Seq.empty
754+
} }
723755
)
724756
.jvmSettings(
725757
crossScalaVersions := Seq(
758+
"3.3.7",
726759
"2.13.18"
727760
),
728761
scalaVersion := crossScalaVersions.value.head,
729762
Test / fork := true
730763
)
731764
.jsSettings(
732765
crossScalaVersions := Seq(
766+
"3.3.7",
733767
"2.13.18"
734768
),
735769
scalaVersion := crossScalaVersions.value.head,
@@ -870,7 +904,13 @@ lazy val `idealingua-v1-test-defs` = project.in(file("idealingua-v1/idealingua-v
870904
} },
871905
scalacOptions -= "-Wconf:any:error",
872906
scalacOptions += "-Wconf:msg=nowarn:silent",
873-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
907+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
908+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
909+
case (_, "3.3.7") => Seq(
910+
"com.lihaoyi" % "sourcecode_2.13"
911+
)
912+
case (_, _) => Seq.empty
913+
} }
874914
)
875915
.enablePlugins(IzumiPlugin)
876916

@@ -992,7 +1032,13 @@ lazy val `idealingua-v1-runtime-rpc-typescript` = project.in(file("idealingua-v1
9921032
} },
9931033
scalacOptions -= "-Wconf:any:error",
9941034
scalacOptions += "-Wconf:msg=nowarn:silent",
995-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
1035+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
1036+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
1037+
case (_, "3.3.7") => Seq(
1038+
"com.lihaoyi" % "sourcecode_2.13"
1039+
)
1040+
case (_, _) => Seq.empty
1041+
} }
9961042
)
9971043
.enablePlugins(IzumiPlugin)
9981044

@@ -1114,7 +1160,13 @@ lazy val `idealingua-v1-runtime-rpc-go` = project.in(file("idealingua-v1/idealin
11141160
} },
11151161
scalacOptions -= "-Wconf:any:error",
11161162
scalacOptions += "-Wconf:msg=nowarn:silent",
1117-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
1163+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
1164+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
1165+
case (_, "3.3.7") => Seq(
1166+
"com.lihaoyi" % "sourcecode_2.13"
1167+
)
1168+
case (_, _) => Seq.empty
1169+
} }
11181170
)
11191171
.enablePlugins(IzumiPlugin)
11201172

@@ -1236,7 +1288,13 @@ lazy val `idealingua-v1-runtime-rpc-csharp` = project.in(file("idealingua-v1/ide
12361288
} },
12371289
scalacOptions -= "-Wconf:any:error",
12381290
scalacOptions += "-Wconf:msg=nowarn:silent",
1239-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
1291+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
1292+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
1293+
case (_, "3.3.7") => Seq(
1294+
"com.lihaoyi" % "sourcecode_2.13"
1295+
)
1296+
case (_, _) => Seq.empty
1297+
} }
12401298
)
12411299
.enablePlugins(IzumiPlugin)
12421300

@@ -1260,6 +1318,7 @@ lazy val `idealingua-v1-compiler` = project.in(file("idealingua-v1/idealingua-v1
12601318
)
12611319
.settings(
12621320
crossScalaVersions := Seq(
1321+
"3.3.7",
12631322
"2.13.18"
12641323
),
12651324
scalaVersion := crossScalaVersions.value.head,
@@ -1366,7 +1425,13 @@ lazy val `idealingua-v1-compiler` = project.in(file("idealingua-v1/idealingua-v1
13661425
} },
13671426
scalacOptions -= "-Wconf:any:error",
13681427
scalacOptions += "-Wconf:msg=nowarn:silent",
1369-
scalacOptions += "-Wconf:msg=pattern var charIn:silent"
1428+
scalacOptions += "-Wconf:msg=pattern var charIn:silent",
1429+
excludeDependencies ++= { (isSnapshot.value, scalaVersion.value) match {
1430+
case (_, "3.3.7") => Seq(
1431+
"com.lihaoyi" % "sourcecode_2.13"
1432+
)
1433+
case (_, _) => Seq.empty
1434+
} }
13701435
)
13711436
.enablePlugins(JavaAppPackaging, IzumiPlugin)
13721437

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package izumi.idealingua.compiler
2+
3+
import io.circe.{Decoder, Encoder}
4+
import io.circe.generic.extras.semiauto
5+
6+
import izumi.idealingua.model.publishing.manifests._
7+
import izumi.idealingua.model.publishing.manifests.ProtobufBuildManifest.ProtobufRepositoryOptions
8+
9+
trait PlatformEnumCodecs {
10+
implicit def decScalaProjectLayout: Decoder[ScalaProjectLayout] = semiauto.deriveEnumerationDecoder
11+
implicit def decTypeScriptProjectLayout: Decoder[TypeScriptProjectLayout] = semiauto.deriveEnumerationDecoder
12+
implicit def decGoProjectLayout: Decoder[GoProjectLayout] = semiauto.deriveEnumerationDecoder
13+
implicit def decCSharpProjectLayout: Decoder[CSharpProjectLayout] = semiauto.deriveEnumerationDecoder
14+
15+
implicit def encScalaProjectLayout: Encoder[ScalaProjectLayout] = semiauto.deriveEnumerationEncoder
16+
implicit def encTypeScriptProjectLayout: Encoder[TypeScriptProjectLayout] = semiauto.deriveEnumerationEncoder
17+
implicit def encGoProjectLayout: Encoder[GoProjectLayout] = semiauto.deriveEnumerationEncoder
18+
implicit def encCSharpProjectLayout: Encoder[CSharpProjectLayout] = semiauto.deriveEnumerationEncoder
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package izumi.idealingua.compiler
2+
3+
import io.circe.{Decoder, Encoder}
4+
import io.circe.generic.semiauto.*
5+
6+
import izumi.idealingua.model.publishing.manifests._
7+
import izumi.idealingua.model.publishing.manifests.ProtobufBuildManifest.ProtobufRepositoryOptions
8+
9+
trait PlatformEnumCodecs {
10+
implicit def decScalaProjectLayout: Decoder[ScalaProjectLayout] = deriveDecoder
11+
implicit def decTypeScriptProjectLayout: Decoder[TypeScriptProjectLayout] = deriveDecoder
12+
implicit def decGoProjectLayout: Decoder[GoProjectLayout] = deriveDecoder
13+
implicit def decCSharpProjectLayout: Decoder[CSharpProjectLayout] = deriveDecoder
14+
15+
implicit def encScalaProjectLayout: Encoder[ScalaProjectLayout] = deriveEncoder
16+
implicit def encTypeScriptProjectLayout: Encoder[TypeScriptProjectLayout] = deriveEncoder
17+
implicit def encGoProjectLayout: Encoder[GoProjectLayout] = deriveEncoder
18+
implicit def encCSharpProjectLayout: Encoder[CSharpProjectLayout] = deriveEncoder
19+
}

idealingua-v1/idealingua-v1-compiler/src/main/scala/izumi/idealingua/compiler/Codecs.scala

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import izumi.idealingua.model.publishing.manifests._
55
import izumi.idealingua.model.publishing.manifests.ProtobufBuildManifest.ProtobufRepositoryOptions
66
import izumi.idealingua.model.publishing.{ProjectNamingRule, ProjectVersion, Publisher}
77

8-
trait Codecs {
8+
trait Codecs extends PlatformEnumCodecs {
99

1010
import _root_.io.circe._
11-
import _root_.io.circe.generic.extras.semiauto
1211
import _root_.io.circe.generic.semiauto._
1312

1413
implicit def decMFUrl: Decoder[MFUrl] = deriveDecoder
@@ -23,23 +22,16 @@ trait Codecs {
2322

2423
implicit def decProjectNamingRule: Decoder[ProjectNamingRule] = deriveDecoder
2524

26-
//
27-
implicit def decScalaProjectLayout: Decoder[ScalaProjectLayout] = semiauto.deriveEnumerationDecoder
28-
2925
implicit def decSbtOptions: Decoder[SbtOptions] = deriveDecoder
3026

3127
implicit def decScalaBuildManifest: Decoder[ScalaBuildManifest] = deriveDecoder
3228

3329
implicit def decTs: Decoder[TypeScriptBuildManifest] = deriveDecoder
3430

35-
implicit def decTypeScriptProjectLayout: Decoder[TypeScriptProjectLayout] = semiauto.deriveEnumerationDecoder
36-
3731
implicit def decYarnOptions: Decoder[YarnOptions] = deriveDecoder
3832

3933
implicit def decGo: Decoder[GoLangBuildManifest] = deriveDecoder
4034

41-
implicit def decGoProjectLayout: Decoder[GoProjectLayout] = semiauto.deriveEnumerationDecoder
42-
4335
implicit def decGoRepositoryOptions: Decoder[GoRepositoryOptions] = deriveDecoder
4436

4537
implicit def decCs: Decoder[CSharpBuildManifest] = deriveDecoder
@@ -48,10 +40,7 @@ trait Codecs {
4840

4941
implicit def decProtobuf: Decoder[ProtobufBuildManifest] = deriveDecoder
5042

51-
implicit def decCSharpProjectLayout: Decoder[CSharpProjectLayout] = semiauto.deriveEnumerationDecoder
52-
5343
implicit def decNugetOptions: Decoder[NugetOptions] = deriveDecoder
54-
//
5544

5645
implicit def encMFUrl: Encoder[MFUrl] = deriveEncoder
5746

@@ -65,29 +54,20 @@ trait Codecs {
6554

6655
implicit def encProjectNamingRule: Encoder[ProjectNamingRule] = deriveEncoder
6756

68-
//
69-
implicit def encScalaProjectLayout: Encoder[ScalaProjectLayout] = semiauto.deriveEnumerationEncoder
70-
7157
implicit def encSbtOptions: Encoder[SbtOptions] = deriveEncoder
7258

7359
implicit def encScalaBuildManifest: Encoder[ScalaBuildManifest] = deriveEncoder
7460

7561
implicit def encTs: Encoder[TypeScriptBuildManifest] = deriveEncoder
7662

77-
implicit def encTypeScriptProjectLayout: Encoder[TypeScriptProjectLayout] = semiauto.deriveEnumerationEncoder
78-
7963
implicit def encYarnOptions: Encoder[YarnOptions] = deriveEncoder
8064

8165
implicit def encGo: Encoder[GoLangBuildManifest] = deriveEncoder
8266

83-
implicit def encGoProjectLayout: Encoder[GoProjectLayout] = semiauto.deriveEnumerationEncoder
84-
8567
implicit def encGoRepositoryOptions: Encoder[GoRepositoryOptions] = deriveEncoder
8668

8769
implicit def encCs: Encoder[CSharpBuildManifest] = deriveEncoder
8870

89-
implicit def encCSharpProjectLayout: Encoder[CSharpProjectLayout] = semiauto.deriveEnumerationEncoder
90-
9171
implicit def encNugetOptions: Encoder[NugetOptions] = deriveEncoder
9272

9373
implicit def encProtobufRepo: Encoder[ProtobufRepositoryOptions] = deriveEncoder

idealingua-v1/idealingua-v1-core/src/main/scala/izumi/idealingua/il/parser/DefConst.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ class DefConst(context: IDLParserContext) extends Identifiers {
1515
import DefConst._
1616
import context._
1717

18-
def defAnno[$: P]: P[RawAnno] = P(defPositions.positioned("@" ~ idShort ~ "(" ~ inline ~ constantsNoDoc ~ inline ~ ")"))
18+
def defAnno[$: P]: P[RawAnno] = P(defPositions.positioned("@" ~ idShort ~ "(" ~ `inline` ~ constantsNoDoc ~ `inline` ~ ")"))
1919
.map {
2020
case (pos, (id, value)) =>
2121
defns.RawAnno(id.name, value, pos)
2222
}
2323

24-
def defAnnos[$: P]: P[Seq[RawAnno]] = P(defAnno.rep(min = 1, sep = any) ~ NLC ~ inline).?.map(_.toSeq.flatten)
24+
def defAnnos[$: P]: P[Seq[RawAnno]] = P(defAnno.rep(min = 1, sep = any) ~ NLC ~ `inline`).?.map(_.toSeq.flatten)
2525

26-
def constBlock[$: P]: P[TLDConsts] = kw(kw.consts, inline ~ enclosedConsts)
26+
def constBlock[$: P]: P[TLDConsts] = kw(kw.consts, `inline` ~ enclosedConsts)
2727
.map {
2828
v => TLDConsts(RawConstBlock(v.toList))
2929
}
3030

31-
def constValue[$: P]: P[Aux] = P(("(" ~ inline ~ anyValue ~ inline ~ ")") | anyValue)
31+
def constValue[$: P]: P[Aux] = P(("(" ~ `inline` ~ anyValue ~ `inline` ~ ")") | anyValue)
3232

3333
private def const[$: P]: P[RawConst] = P(metaAgg.withMeta(constNoDoc)).map {
3434
case (meta, constVal) =>
@@ -42,7 +42,7 @@ class DefConst(context: IDLParserContext) extends Identifiers {
4242
private def constantsNoDoc[$: P]: P[RawVal.CMap] = P(constNoDoc.rep(min = 0, sep = sepStruct) ~ sepStruct.?)
4343
.map(v => RawVal.CMap(v.map(c => (c.id.name, c.const)).toMap))
4444

45-
private def constNoDoc[$: P]: P[RawConst] = P(defPositions.positioned(idShort ~ (inline ~ ":" ~ inline ~ idGeneric).? ~ inline ~ "=" ~ inline ~ constValue))
45+
private def constNoDoc[$: P]: P[RawConst] = P(defPositions.positioned(idShort ~ (`inline` ~ ":" ~ `inline` ~ idGeneric).? ~ `inline` ~ "=" ~ `inline` ~ constValue))
4646
.map {
4747
case (pos, (name, tpe, value: Aux.ObjAux)) =>
4848
tpe match {
@@ -98,7 +98,7 @@ class DefConst(context: IDLParserContext) extends Identifiers {
9898

9999
private def justValue[$: P]: P[Aux] = P(literal | objdef | listdef)
100100

101-
private def typedValue[$: P]: P[Aux] = (idGeneric ~ inline ~ "(" ~ inline ~ justValue ~ inline ~ ")").map {
101+
private def typedValue[$: P]: P[Aux] = (idGeneric ~ `inline` ~ "(" ~ `inline` ~ justValue ~ `inline` ~ ")").map {
102102
case (id, agg) =>
103103
agg match {
104104
case Aux.Just(value) =>

idealingua-v1/idealingua-v1-core/src/main/scala/izumi/idealingua/il/parser/DefDomain.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class DefDomain(context: IDLParserContext)
1515

1616
def domainBlock[$: P]: P[DomainId] = P(kw.domain ~/ domainId)
1717

18-
def importBlock[$: P]: P[Import] = kw(kw.`import`, domainId ~ ("." ~ inline ~ enclosed(defStructure.imports(sep.sepStruct) ~ sepStruct.?)).?)
18+
def importBlock[$: P]: P[Import] = kw(kw.`import`, domainId ~ ("." ~ `inline` ~ enclosed(defStructure.imports(sep.sepStruct) ~ sepStruct.?)).?)
1919
.map {
2020
case (id, names) =>
2121
names match {

idealingua-v1/idealingua-v1-core/src/main/scala/izumi/idealingua/il/parser/DefSignature.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ class DefSignature(context: IDLParserContext) {
1717

1818

1919
def baseSignature[$: P](keyword: => P[Unit]): P[(String, RawSimpleStructure)] = P(
20-
keyword ~ inline ~
20+
keyword ~ `inline` ~
2121
ids.symbol ~ any ~
2222
defStructure.inlineStruct
2323
)
2424

25-
def void[$: P]: P[Output.Void] = P("(" ~ inline ~ ")").map(_ => RawMethod.Output.Void())
25+
def void[$: P]: P[Output.Void] = P("(" ~ `inline` ~ ")").map(_ => RawMethod.Output.Void())
2626

2727
def adt[$: P]: P[Output.Algebraic] = defStructure.adtOut.map(v => RawMethod.Output.Algebraic(v.alternatives))
2828

0 commit comments

Comments
 (0)