Skip to content

Commit 2372a2f

Browse files
committed
Workaround for Intellij "Open cross-compiled projects as Scala 2" option pending upstream merge of JetBrains/sbt-structure#73
1 parent 8d550ab commit 2372a2f

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

build.sbt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,45 @@ enablePlugins(SbtgenVerificationPlugin)
1111

1212
disablePlugins(AssemblyPlugin)
1313

14+
Global / Keys.commands ~= {
15+
// Workaround for Intellij "Open cross-compiled projects as Scala 2" option pending upstream merge of https://github.com/JetBrains/sbt-structure/pull/73
16+
xs =>
17+
def numbersOf(version: String): (Int, Int, Int) = {
18+
val prefix = version.split('.').filter(s => s.nonEmpty && s.forall(_.isDigit)).map(_.toInt).take(3)
19+
val xs = prefix ++ Seq.fill(3 - prefix.length)(0)
20+
(xs(0), xs(1), xs(2))
21+
}
22+
23+
val preferScala2: Command = Command.command("preferScala2") { state =>
24+
val (structure, data) = {
25+
val extracted = Project.extract(state)
26+
(extracted.structure, extracted.structure.data)
27+
}
28+
29+
val scala3Projects = structure.allProjectRefs.filter { project =>
30+
(project / Keys.scalaVersion).get(data).exists(_.startsWith("3."))
31+
}
32+
33+
val (scala2Versions, crossScala2And3ProjectsCount) = scala3Projects.foldLeft((Set.empty[String], 0)) {
34+
case ((scala2Versions, crossCount), project) =>
35+
val projectScala2Versions = (project / Keys.crossScalaVersions).get(data).getOrElse(Seq.empty).filter(_.startsWith("2."))
36+
(scala2Versions ++ projectScala2Versions, crossCount + (if (projectScala2Versions.nonEmpty) 1 else 0))
37+
}
38+
39+
// We can only do this when all sbt projects cross-compile to Scala 2 & Scala 3
40+
// See https://youtrack.jetbrains.com/issue/SCL-22619/
41+
val canSetScala2VersionGlobally = crossScala2And3ProjectsCount > 0 &&
42+
scala3Projects.length == crossScala2And3ProjectsCount
43+
if (canSetScala2VersionGlobally) {
44+
"++" + scala2Versions.maxBy(numbersOf) :: state
45+
} else {
46+
state
47+
}
48+
}
49+
50+
xs.filterNot(_.nameOption.contains("preferScala2")) :+ preferScala2
51+
}
52+
1453
lazy val `fundamentals-basics` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-basics"))
1554
.settings(
1655
libraryDependencies ++= Seq(

project/Deps.sc

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,48 @@ object Izumi {
236236

237237
final val crossScalaSources = Defaults.CrossScalaPlusSources
238238

239-
final val topLevelSettings = Seq()
239+
final val topLevelSettings = Seq(
240+
"Keys.commands".in(
241+
SettingScope.Raw("Global")
242+
) ~= """{
243+
| // Workaround for Intellij "Open cross-compiled projects as Scala 2" option pending upstream merge of https://github.com/JetBrains/sbt-structure/pull/73
244+
| xs =>
245+
| def numbersOf(version: String): (Int, Int, Int) = {
246+
| val prefix = version.split('.').filter(s => s.nonEmpty && s.forall(_.isDigit)).map(_.toInt).take(3)
247+
| val xs = prefix ++ Seq.fill(3 - prefix.length)(0)
248+
| (xs(0), xs(1), xs(2))
249+
| }
250+
|
251+
| val preferScala2: Command = Command.command("preferScala2") { state =>
252+
| val (structure, data) = {
253+
| val extracted = Project.extract(state)
254+
| (extracted.structure, extracted.structure.data)
255+
| }
256+
|
257+
| val scala3Projects = structure.allProjectRefs.filter { project =>
258+
| (project / Keys.scalaVersion).get(data).exists(_.startsWith("3."))
259+
| }
260+
|
261+
| val (scala2Versions, crossScala2And3ProjectsCount) = scala3Projects.foldLeft((Set.empty[String], 0)) {
262+
| case ((scala2Versions, crossCount), project) =>
263+
| val projectScala2Versions = (project / Keys.crossScalaVersions).get(data).getOrElse(Seq.empty).filter(_.startsWith("2."))
264+
| (scala2Versions ++ projectScala2Versions, crossCount + (if (projectScala2Versions.nonEmpty) 1 else 0))
265+
| }
266+
|
267+
| // We can only do this when all sbt projects cross-compile to Scala 2 & Scala 3
268+
| // See https://youtrack.jetbrains.com/issue/SCL-22619/
269+
| val canSetScala2VersionGlobally = crossScala2And3ProjectsCount > 0 &&
270+
| scala3Projects.length == crossScala2And3ProjectsCount
271+
| if (canSetScala2VersionGlobally) {
272+
| "++" + scala2Versions.maxBy(numbersOf) :: state
273+
| } else {
274+
| state
275+
| }
276+
| }
277+
|
278+
| xs.filterNot(_.nameOption.contains("preferScala2")) :+ preferScala2
279+
|}""".stripMargin.raw
280+
)
240281

241282
final val sharedAggSettings = outOfSource ++ Seq(
242283
"""SettingKey[Boolean]("ide-skip-project")""" := true,

0 commit comments

Comments
 (0)