Apply remap to production jar

This commit is contained in:
shedaniel
2023-11-17 22:59:27 +08:00
parent d56e09b281
commit b3baa3ff7b
3 changed files with 62 additions and 0 deletions

View File

@@ -3,8 +3,14 @@ package dev.architectury.plugin
import dev.architectury.plugin.utils.GradleSupport
import dev.architectury.transformer.Transform
import dev.architectury.transformer.Transformer
import dev.architectury.transformer.input.OpenedFileAccess
import dev.architectury.transformer.shadowed.impl.com.google.gson.Gson
import dev.architectury.transformer.shadowed.impl.org.objectweb.asm.ClassReader
import dev.architectury.transformer.shadowed.impl.org.objectweb.asm.ClassWriter
import dev.architectury.transformer.shadowed.impl.org.objectweb.asm.Opcodes
import dev.architectury.transformer.shadowed.impl.org.objectweb.asm.tree.ClassNode
import dev.architectury.transformer.transformers.BuiltinProperties
import dev.architectury.transformer.transformers.base.ClassEditTransformer
import dev.architectury.transformer.util.Logger
import org.gradle.api.Project
import org.gradle.api.file.RegularFileProperty
@@ -14,6 +20,7 @@ import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.jvm.tasks.Jar
import java.io.File
import java.nio.file.Files
import java.nio.file.Path
import java.util.*
import java.util.function.BiConsumer
@@ -27,6 +34,9 @@ open class TransformingTask : Jar() {
@Internal
val transformers: ListProperty<Transformer> = project.objects.listProperty(Transformer::class.java)
@Internal
val postTransformers: ListProperty<ClassEditTransformer> = project.objects.listProperty(ClassEditTransformer::class.java)
@Internal
var platform: String? = null
@@ -47,6 +57,32 @@ open class TransformingTask : Jar() {
Logger.debug("============================")
Logger.debug("")
Transform.runTransformers(input, output, transformers.get())
if (postTransformers.get().isNotEmpty()) {
val postTransformers = postTransformers.get()
val apply = { access: OpenedFileAccess ->
access.handle({ path: String -> path.endsWith(".class") }) { path: String, bytes: ByteArray ->
val reader = ClassReader(bytes)
if (reader.access and Opcodes.ACC_MODULE == 0) {
var node = ClassNode(Opcodes.ASM9)
reader.accept(node, 0)
postTransformers.forEach { node = it.doEdit(path, node) }
access.modifyFile(path, node.toByteArray())
}
}
}
if (Files.isDirectory(output)) {
OpenedFileAccess.ofDirectory(output).use(apply)
} else {
OpenedFileAccess.ofJar(output).use(apply)
}
}
}
private fun ClassNode.toByteArray(): ByteArray {
val writer = ClassWriter(0)
this.accept(writer)
return writer.toByteArray()
}
operator fun invoke(transformer: Transformer) {
@@ -66,6 +102,10 @@ open class TransformingTask : Jar() {
})
}
fun addPost(transformer: ClassEditTransformer) {
postTransformers.add(transformer)
}
fun add(transformer: Transformer, config: MutableMap<String, Any>.(file: Path) -> Unit) {
add(transformer, BiConsumer { file, map ->
config(map, file)