aboutsummaryrefslogtreecommitdiff
path: root/build-logic/src/main/kotlin/FabricModTransform.kt
diff options
context:
space:
mode:
Diffstat (limited to 'build-logic/src/main/kotlin/FabricModTransform.kt')
-rw-r--r--build-logic/src/main/kotlin/FabricModTransform.kt80
1 files changed, 80 insertions, 0 deletions
diff --git a/build-logic/src/main/kotlin/FabricModTransform.kt b/build-logic/src/main/kotlin/FabricModTransform.kt
new file mode 100644
index 0000000..53affbe
--- /dev/null
+++ b/build-logic/src/main/kotlin/FabricModTransform.kt
@@ -0,0 +1,80 @@
+import com.github.jengelman.gradle.plugins.shadow.transformers.ResourceTransformer
+import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
+import com.google.gson.Gson
+import com.google.gson.JsonObject
+import com.google.gson.JsonPrimitive
+import java.io.Serializable
+import net.fabricmc.accesswidener.AccessWidenerReader
+import net.fabricmc.accesswidener.AccessWidenerWriter
+import org.apache.tools.zip.ZipEntry
+import org.apache.tools.zip.ZipOutputStream
+import org.gradle.api.file.FileTreeElement
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.Internal
+
+open class FabricModTransform : ResourceTransformer {
+
+ enum class AccessWidenerInclusion : Serializable {
+ ALL,
+ NONE,
+ }
+
+ @get:Input
+ var mergeAccessWideners: AccessWidenerInclusion = AccessWidenerInclusion.ALL
+
+ @get:Internal
+ internal var mergedFmj: JsonObject? = null
+
+ @get:Internal
+ internal val foundAccessWideners = AccessWidenerWriter()
+
+ @get:Internal
+ internal var foundAnyAccessWidener = false
+
+ override fun canTransformResource(element: FileTreeElement): Boolean {
+ if (mergeAccessWideners == AccessWidenerInclusion.ALL && element.name.endsWith(".accesswidener"))
+ return true
+ return element.path == "fabric.mod.json"
+ }
+
+ override fun transform(context: TransformerContext) {
+ if (context.path.endsWith(".accesswidener")) {
+ foundAnyAccessWidener = true
+ // TODO: allow filtering for only those mentioned in a fabric.mod.json, potentially
+ context.inputStream.use { stream ->
+ AccessWidenerReader(foundAccessWideners).read(stream.bufferedReader())
+ }
+ return
+ }
+ // TODO: mixins.json relocations
+ val fmj = context.inputStream.use { stream ->
+ Gson().fromJson(stream.bufferedReader(), JsonObject::class.java)
+ }
+ val mergedFmj = this.mergedFmj
+ println("${fmj["id"]} is first? ${mergedFmj == null}")
+ if (mergedFmj == null) {
+ this.mergedFmj = fmj
+ } else {
+ // TODO: merge stuff
+ }
+ }
+
+ override fun hasTransformedResource(): Boolean {
+ return mergedFmj != null
+ }
+
+ override fun modifyOutputStream(os: ZipOutputStream, preserveFileTimestamps: Boolean) {
+ val mergedFmj = mergedFmj!!
+ if (foundAnyAccessWidener) {
+ val awFile = mergedFmj["accessWidener"]
+ require(awFile is JsonPrimitive && awFile.isString)
+ os.putNextEntry(ZipEntry(awFile.asString))
+ os.write(foundAccessWideners.write())
+ os.closeEntry()
+ }
+ os.putNextEntry(ZipEntry("fabric.mod.json"))
+ os.write(mergedFmj.toString().toByteArray())
+ os.closeEntry()
+ }
+}