diff --git a/config/src/bloop/config/Config.scala b/config/src/bloop/config/Config.scala index 223ac0a..9732a68 100644 --- a/config/src/bloop/config/Config.scala +++ b/config/src/bloop/config/Config.scala @@ -170,7 +170,13 @@ object Config { object ModuleSplitStyleJS { case object FewestModules extends ModuleSplitStyleJS("FewestModules") case object SmallestModules extends ModuleSplitStyleJS("SmallestModules") - case object SmallModulesFor extends ModuleSplitStyleJS("SmallModulesFor") + final case class SmallModulesFor(packages: List[String]) + extends ModuleSplitStyleJS("SmallModulesFor") + + object SmallModulesFor { + val id: String = SmallModulesFor(List.empty).id + } + val All: List[String] = List(FewestModules.id, SmallestModules.id, SmallModulesFor.id) } @@ -313,7 +319,7 @@ object Config { final val LatestVersion = "1.4.0" private[bloop] val empty = File(LatestVersion, Project.empty) - private[bloop] def dummyForTests: File = { + private[bloop] def dummyForTests(platformType: String): File = { val workingDirectory = PlatformFiles.userDir val sourceFile = PlatformFiles.createTempFile("Foo", ".scala") @@ -331,9 +337,10 @@ object Config { val classpath = List(scalaLibraryJar) val resources = Some(List(PlatformFiles.resolve(outDir, "resource1.xml"))) + val jdk8Path = PlatformFiles.getPath("/usr/lib/jvm/java-8-jdk") + val jdk11Path = PlatformFiles.getPath("/usr/lib/jvm/java-11-jdk") + val platform = { - val jdk8Path = PlatformFiles.getPath("/usr/lib/jvm/java-8-jdk") - val jdk11Path = PlatformFiles.getPath("/usr/lib/jvm/java-11-jdk") Platform.Jvm( JvmConfig(Some(jdk8Path), Nil), Some("module.Main"), @@ -343,6 +350,23 @@ object Config { ) } + val platformJS = { + Platform.Js( + JsConfig( + "1.16.0", + LinkerMode.Release, + ModuleKindJS.ESModule, + false, + None, + None, + None, + List(jdk8Path), + Some(ModuleSplitStyleJS.SmallestModules) + ), + None + ) + } + val project = Project( "dummy-project", workingDirectory, @@ -370,7 +394,11 @@ object Config { Some(Java(List("-version"))), Some(Sbt("1.1.0", Nil)), Some(Test(List(), TestOptions(Nil, Nil))), - Some(platform), + if (platformType == "JVM") { + Some(platform) + } else if (platformType == "JS") { + Some(platformJS) + } else None, Some(Resolution(Nil)), None, None diff --git a/config/src/bloop/config/ConfigCodecs.scala b/config/src/bloop/config/ConfigCodecs.scala index 719bbd4..c9552fc 100644 --- a/config/src/bloop/config/ConfigCodecs.scala +++ b/config/src/bloop/config/ConfigCodecs.scala @@ -133,43 +133,74 @@ object ConfigCodecs { implicit val codecModuleSplitStyleJS : JsonValueCodec[Config.ModuleSplitStyleJS] = { + implicit val codecList: JsonValueCodec[List[String]] = + JsonCodecMaker.makeWithRequiredCollectionFields[List[String]] new JsonValueCodec[Config.ModuleSplitStyleJS] { val nullValue: Config.ModuleSplitStyleJS = null.asInstanceOf[Config.ModuleSplitStyleJS] def encodeValue(x: Config.ModuleSplitStyleJS, out: JsonWriter): Unit = { - val str = x match { + out.writeObjectStart() + out.writeKey("splitStyle") + x match { case Config.ModuleSplitStyleJS.FewestModules => - Config.ModuleSplitStyleJS.FewestModules.id + out.writeVal(Config.ModuleSplitStyleJS.FewestModules.id) case Config.ModuleSplitStyleJS.SmallestModules => - Config.ModuleSplitStyleJS.SmallestModules.id - case Config.ModuleSplitStyleJS.SmallModulesFor => - Config.ModuleSplitStyleJS.SmallModulesFor.id + out.writeVal(Config.ModuleSplitStyleJS.SmallestModules.id) + case Config.ModuleSplitStyleJS.SmallModulesFor(packages) => + val style = Config.ModuleSplitStyleJS.SmallModulesFor(packages) + out.writeVal(style.id) + out.writeKey("packages") + out.writeArrayStart() + style.packages.foreach(out.writeVal) + out.writeArrayEnd() } - out.writeVal(str) + out.writeObjectEnd() } + def decodeValue( in: JsonReader, default: Config.ModuleSplitStyleJS - ): Config.ModuleSplitStyleJS = - if (in.isNextToken('"')) { - in.rollbackToken() - in.readString(null) match { - case Config.ModuleSplitStyleJS.FewestModules.id => - Config.ModuleSplitStyleJS.FewestModules - case Config.ModuleSplitStyleJS.SmallestModules.id => - Config.ModuleSplitStyleJS.SmallestModules - case Config.ModuleSplitStyleJS.SmallModulesFor.id => - Config.ModuleSplitStyleJS.SmallModulesFor - case _ => - in.decodeError( - s"Expected module split style ${Config.ModuleSplitStyleJS.All - .mkString("'", "', '", "'")}" - ) - } - } else { - in.rollbackToken() - nullValue + ): Config.ModuleSplitStyleJS = { + in.setMark() + in.isNextToken('{') + in.skipToKey("splitStyle") + val splitStyle = in.readString(null) + + val packages = + if ( + splitStyle == Config.ModuleSplitStyleJS + .SmallModulesFor(List.empty) + .id + ) { + in.nextToken() + if (in.skipToKey("packages")) { + if (in.isNextToken('[')) { + in.rollbackToken() + codecList.decodeValue(in, Nil) match { + case Nil => + in.decodeError("Field packages can not contain empty array") + case packages => packages + } + } else { + in.decodeError("missing array of packages for field package") + } + } else { + in.requiredFieldError("Missing required field packages ") + } + } else List.empty + + in.isNextToken('}') + + splitStyle match { + case Config.ModuleSplitStyleJS.FewestModules.id => + Config.ModuleSplitStyleJS.FewestModules + case Config.ModuleSplitStyleJS.SmallestModules.id => + Config.ModuleSplitStyleJS.SmallestModules + case Config.ModuleSplitStyleJS.SmallModulesFor.id => + Config.ModuleSplitStyleJS.SmallModulesFor(packages) + case _ => in.decodeError("Invalid splitStyle field") } + } } } diff --git a/config/test/src/bloop/config/ConfigCodecsSpec.scala b/config/test/src/bloop/config/ConfigCodecsSpec.scala index 8d957ef..182e801 100644 --- a/config/test/src/bloop/config/ConfigCodecsSpec.scala +++ b/config/test/src/bloop/config/ConfigCodecsSpec.scala @@ -3,14 +3,19 @@ package bloop.config import java.nio.charset.StandardCharsets import bloop.config.Config.File +import com.github.plokhotnyuk.jsoniter_scala.{core => jsoniter} class ConfigCodecsSpec extends munit.FunSuite { import ConfigCodecsSpec._ override def afterAll() = { val filesToDelete = - dummyFile.project.classpath ++ dummyFile.project.sources :+ dummyFile.project.classesDir :+ dummyFile.project.out + dummyFileJVM.project.classpath ++ dummyFileJVM.project.sources :+ dummyFileJVM.project.classesDir :+ dummyFileJVM.project.out + + val jsFilesToDelete = + dummyFileJS.project.classpath ++ dummyFileJS.project.sources :+ dummyFileJS.project.classesDir :+ dummyFileJS.project.out filesToDelete.foreach(PlatformFiles.deleteTempFile) + jsFilesToDelete.foreach(PlatformFiles.deleteTempFile) } @@ -37,8 +42,62 @@ class ConfigCodecsSpec extends munit.FunSuite { } - test("simple-config-jsons") { - parseFile(dummyFile) + test("simple-config-jsons-jvm") { + parseFile(dummyFileJVM) + } + + test("simple-config-jsonsjs") { + parseFile(dummyFileJS) + } + + test("write-module-split-style-smallestmodules") { + + val config: Config.ModuleSplitStyleJS = + Config.ModuleSplitStyleJS.SmallestModules + val written = jsoniter.writeToString(config)( + implicitly(bloop.config.ConfigCodecs.codecModuleSplitStyleJS) + ) + assertEquals(written, """{"splitStyle":"SmallestModules"}""") + } + + test("read-module-split-style-smallestmodules") { + + val config: Config.ModuleSplitStyleJS = + Config.ModuleSplitStyleJS.SmallestModules + val read = jsoniter.readFromString[Config.ModuleSplitStyleJS]( + """{"splitStyle":"SmallestModules"}""" + )( + implicitly(bloop.config.ConfigCodecs.codecModuleSplitStyleJS) + ) + assertEquals(read, config) + } + + test("write-module-split-style-smallmodulesfor") { + + val config: Config.ModuleSplitStyleJS = + Config.ModuleSplitStyleJS.SmallModulesFor(List("one", "two")) + val written = jsoniter.writeToString(config)( + implicitly(bloop.config.ConfigCodecs.codecModuleSplitStyleJS) + ) + assertEquals( + written, + """{"splitStyle":"SmallModulesFor","packages":["one","two"]}""" + ) + } + + test("read-module-split-style-smallmodulesfor") { + + val config: Config.ModuleSplitStyleJS = + Config.ModuleSplitStyleJS.SmallModulesFor(List("one", "two")) + val read = jsoniter.readFromString[Config.ModuleSplitStyleJS]( + """{"splitStyle":"SmallModulesFor","packages":["one","two"]}""" + )( + implicitly(bloop.config.ConfigCodecs.codecModuleSplitStyleJS) + ) + assertEquals( + read, + config + ) } test("test-idea") { @@ -77,5 +136,6 @@ class ConfigCodecsSpec extends munit.FunSuite { } object ConfigCodecsSpec { - val dummyFile = File.dummyForTests + val dummyFileJVM = File.dummyForTests("JVM") + val dummyFileJS = File.dummyForTests("JS") }