Skip to content

Commit

Permalink
Merge pull request #89 from KristianAN/main
Browse files Browse the repository at this point in the history
Fix to module split-style to include packages for smallmodulesfor
  • Loading branch information
tgodzik authored Jun 20, 2024
2 parents 4003978 + 9f91a19 commit 12bc554
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 34 deletions.
38 changes: 33 additions & 5 deletions config/src/bloop/config/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down Expand Up @@ -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")

Expand All @@ -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"),
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down
81 changes: 56 additions & 25 deletions config/src/bloop/config/ConfigCodecs.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}
}
}

Expand Down
68 changes: 64 additions & 4 deletions config/test/src/bloop/config/ConfigCodecsSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)

}

Expand All @@ -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") {
Expand Down Expand Up @@ -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")
}

0 comments on commit 12bc554

Please sign in to comment.