Skip to content

Commit

Permalink
So, I heard you like polymorphism...
Browse files Browse the repository at this point in the history
  • Loading branch information
wagyourtail committed Dec 3, 2024
1 parent ec2ff69 commit 83a995b
Show file tree
Hide file tree
Showing 12 changed files with 137 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import xyz.wagyourtail.unimined.util.FinalizeOnRead
* task responsible for transforming your built jar to production.
* @since 0.1.0
*/
@Suppress("LeakingThis")
abstract class AbstractRemapJarTask : Jar() {

@get:InputFile
Expand All @@ -36,39 +35,4 @@ abstract class AbstractRemapJarTask : Jar() {
@set:Internal
var prodNamespace: MappingNamespaceTree.Namespace? by FinalizeOnRead(null)

/**
* whether to remap AccessTransformers to the legacy format (<=1.7.10)
*/
@get:Input
@get:Optional
abstract val remapATToLegacy: Property<Boolean?>

@get:Internal
@set:Internal
@set:ApiStatus.Experimental
abstract var allowImplicitWildcards: Boolean

abstract fun devNamespace(namespace: String)

abstract fun devFallbackNamespace(namespace: String)

abstract fun prodNamespace(namespace: String)

abstract fun mixinRemap(action: MixinRemapOptions.() -> Unit)

fun mixinRemap(
@DelegatesTo(value = MixinRemapOptions::class, strategy = Closure.DELEGATE_FIRST)
action: Closure<*>
) {
mixinRemap {
action.delegate = this
action.resolveStrategy = Closure.DELEGATE_FIRST
action.call()
}
}

init {
remapATToLegacy.convention(null as Boolean?).finalizeValueOnRead()
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,33 @@
package xyz.wagyourtail.unimined.api.minecraft.task

import groovy.lang.Closure
import groovy.lang.DelegatesTo
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import xyz.wagyourtail.unimined.api.mapping.mixin.MixinRemapOptions
import xyz.wagyourtail.unimined.util.JarInterface

interface RemapJarTask : JarInterface<AbstractRemapJarTask>
interface RemapJarTask : JarInterface<AbstractRemapJarTask>, RemapOptions {

/**
* whether to remap AccessTransformers to the legacy format (<=1.7.10)
*/
@get:Input
@get:Optional
val remapATToLegacy: Property<Boolean?>

fun mixinRemap(action: MixinRemapOptions.() -> Unit)

fun mixinRemap(
@DelegatesTo(value = MixinRemapOptions::class, strategy = Closure.DELEGATE_FIRST)
action: Closure<*>
) {
mixinRemap {
action.delegate = this
action.resolveStrategy = Closure.DELEGATE_FIRST
action.call()
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package xyz.wagyourtail.unimined.api.minecraft.task

import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.Internal
import org.jetbrains.annotations.ApiStatus
import xyz.wagyourtail.unimined.api.mapping.MappingNamespaceTree

interface RemapOptions {

@get:InputFile
val inputFile: RegularFileProperty

@get:Internal
@set:Internal
var devNamespace: MappingNamespaceTree.Namespace?

@get:Internal
@set:Internal
var devFallbackNamespace: MappingNamespaceTree.Namespace?

@get:Internal
@set:Internal
var prodNamespace: MappingNamespaceTree.Namespace?

@get:Internal
@set:Internal
@set:ApiStatus.Experimental
var allowImplicitWildcards: Boolean

fun devNamespace(namespace: String)

fun devFallbackNamespace(namespace: String)

fun prodNamespace(namespace: String)

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ package xyz.wagyourtail.unimined.api.minecraft.task

import xyz.wagyourtail.unimined.util.JarInterface

interface RemapSourcesJarTask : JarInterface<AbstractRemapJarTask>
interface RemapSourcesJarTask : JarInterface<AbstractRemapJarTask>, RemapOptions {

}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ import java.nio.charset.StandardCharsets
import java.nio.file.Path
import java.nio.file.StandardOpenOption
import java.util.*
import java.util.function.BiFunction
import javax.swing.text.html.HTML.Tag.U
import kotlin.collections.ArrayDeque
import kotlin.io.path.*

Expand Down Expand Up @@ -453,11 +455,11 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft
}
}

private inline fun <reified T> applyDefaultRemapJar(
private inline fun <U: JarInterface<*>> applyDefaultRemapJar(
inputTaskName: String,
remappingFunction: (Task, JarInterface<AbstractRemapJarTask>.() -> Unit) -> TaskProvider<*>,
remappingFunction: (Task, U.() -> Unit) -> TaskProvider<U>,
crossinline defaultTaskConfiguration: Jar.() -> Unit
) where T : AbstractRemapJarTask, T : JarInterface<AbstractRemapJarTask> {
) {
val inputTaskNameSS = inputTaskName.withSourceSet(sourceSet)

var inputTask = project.tasks.findByName(inputTaskNameSS)
Expand Down Expand Up @@ -490,7 +492,9 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft
val taskProvider = remappingFunction(inputTask) {
group = "unimined"
description = "Remaps $inputTask's output jar"
asJar.archiveClassifier.set(oldClassifier)
asJar {
archiveClassifier.set(oldClassifier)
}
}
project.tasks.getByName("build").dependsOn(taskProvider)
}
Expand Down Expand Up @@ -592,15 +596,15 @@ open class MinecraftProvider(project: Project, sourceSet: SourceSet) : Minecraft
if (mcPatcher.addVanillaLibraries) addLibraries(minecraftData.metadata.libraries)

if (defaultRemapJar) {
applyDefaultRemapJar<RemapJarTaskImpl>("jar", ::remap) {
applyDefaultRemapJar("jar", ::remap) {
from(sourceSet.output)
archiveClassifier.set("".withSourceSet(sourceSet))
from(combinedWithList.map { it.second.output })
}
}

if (defaultRemapSourcesJar) {
applyDefaultRemapJar<RemapSourcesJarTaskImpl>("sourcesJar", ::remapSources) {
applyDefaultRemapJar("sourcesJar", ::remapSources) {
from(sourceSet.allSource)
archiveClassifier.set("${"".withSourceSet(sourceSet)}-sources")
from(combinedWithList.map { it.second.allSource })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency
import xyz.wagyourtail.unimined.api.minecraft.patch.fabric.LegacyFabricPatcher
import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask
import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask
import xyz.wagyourtail.unimined.api.unimined
import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider
import xyz.wagyourtail.unimined.internal.minecraft.resolver.Library
Expand Down Expand Up @@ -38,8 +39,10 @@ open class LegacyFabricMinecraftTransformer(
override fun configureRemapJar(task: AbstractRemapJarTask) {
if (fabricDep.version?.let { SemVerUtils.matches(it, ">=0.15.0") } == true) {
project.logger.info("enabling mixin extra")
task.mixinRemap {
enableMixinExtra()
if (task is RemapJarTask) {
task.mixinRemap {
enableMixinExtra()
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package xyz.wagyourtail.unimined.internal.minecraft.patch.fabric
import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency
import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask
import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask
import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider
import xyz.wagyourtail.unimined.util.SemVerUtils

Expand All @@ -28,8 +29,10 @@ open class OfficialFabricMinecraftTransformer(
override fun configureRemapJar(task: AbstractRemapJarTask) {
if (fabricDep.version?.let { SemVerUtils.matches(it, ">=0.15.0") } == true) {
project.logger.info("enabling mixin extra")
task.mixinRemap {
enableMixinExtra()
if (task is RemapJarTask) {
task.mixinRemap {
enableMixinExtra()
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency
import xyz.wagyourtail.unimined.api.minecraft.patch.forge.NeoForgedPatcher
import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask
import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask
import xyz.wagyourtail.unimined.api.unimined
import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider
import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.FG3MinecraftTransformer
Expand Down Expand Up @@ -68,11 +69,13 @@ open class NeoForgedMinecraftTransformer(project: Project, provider: MinecraftPr
val forgeDep = forge.dependencies.first()
if (provider.version != "1.20.1") {
project.logger.info("setting `disableRefmap()` in mixinRemap")
task.mixinRemap {
if (SemVerUtils.matches(forgeDep.version!!.substringBefore("-"), ">=20.2.84")) {
enableMixinExtra()
if (task is RemapJarTask) {
task.mixinRemap {
if (SemVerUtils.matches(forgeDep.version!!.substringBefore("-"), ">=20.2.84")) {
enableMixinExtra()
}
disableRefmap()
}
disableRefmap()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.gradle.api.artifacts.ExternalDependency
import xyz.wagyourtail.unimined.api.minecraft.patch.jarmod.JarModAgentPatcher
import xyz.wagyourtail.unimined.api.runs.RunConfig
import xyz.wagyourtail.unimined.api.minecraft.task.AbstractRemapJarTask
import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask
import xyz.wagyourtail.unimined.api.unimined
import xyz.wagyourtail.unimined.internal.minecraft.MinecraftProvider
import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.mcpconfig.SubprocessExecutor
Expand Down Expand Up @@ -104,17 +105,20 @@ open class JarModAgentMinecraftTransformer(
//TODO: add mods to priority classpath, and resolve their jma.transformers
}

override fun beforeRemapJarTask(remapJarTask: AbstractRemapJarTask, input: Path): Path {
remapJarTask.mixinRemap {
enableJarModAgent()
override fun beforeRemapJarTask(task: AbstractRemapJarTask, input: Path): Path {
if (task is RemapJarTask) {
task.mixinRemap {
enableJarModAgent()
}
}

@Suppress("DEPRECATION")
return if (compiletimeTransforms && transforms.isNotEmpty()) {
project.logger.lifecycle("[Unimined/JarModAgentTransformer] Running compile time transforms for ${remapJarTask.name}...")
return if (compiletimeTransforms && transforms.isNotEmpty() && task is RemapJarTask) {
project.logger.lifecycle("[Unimined/JarModAgentTransformer] Running compile time transforms for ${task}...")
val output = getTempFilePath("${input.nameWithoutExtension}-jma", ".jar")
Files.copy(input, output)
try {
val classpath = (remapJarTask as RemapJarTaskImpl).provider.sourceSet.runtimeClasspath.files.toMutableSet()
val classpath = (task as RemapJarTaskImpl).provider.sourceSet.runtimeClasspath.files.toMutableSet()

val result = SubprocessExecutor.exec(project) {
it.jvmArgs = listOf(
Expand All @@ -138,7 +142,7 @@ open class JarModAgentMinecraftTransformer(
}
output
} else {
super.beforeRemapJarTask(remapJarTask, input)
super.beforeRemapJarTask(task, input)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,35 +18,21 @@ import kotlin.io.path.*
@Suppress("UNCHECKED_CAST")
abstract class AbstractRemapJarTaskImpl @Inject constructor(@get:Internal val provider: MinecraftConfig): AbstractRemapJarTask() {

@get:Internal
protected var mixinRemapOptions: MixinRemapOptions.() -> Unit by FinalizeOnRead {}

override fun devNamespace(namespace: String) {
fun devNamespace(namespace: String) {
val delegate: FinalizeOnRead<MappingNamespaceTree.Namespace> = AbstractRemapJarTask::class.getField("devNamespace")!!.getDelegate(this) as FinalizeOnRead<MappingNamespaceTree.Namespace>
delegate.setValueIntl(LazyMutable { provider.mappings.getNamespace(namespace) })
}

override fun devFallbackNamespace(namespace: String) {
fun devFallbackNamespace(namespace: String) {
val delegate: FinalizeOnRead<MappingNamespaceTree.Namespace> = AbstractRemapJarTask::class.getField("devFallbackNamespace")!!.getDelegate(this) as FinalizeOnRead<MappingNamespaceTree.Namespace>
delegate.setValueIntl(LazyMutable { provider.mappings.getNamespace(namespace) })
}

override fun prodNamespace(namespace: String) {
fun prodNamespace(namespace: String) {
val delegate: FinalizeOnRead<MappingNamespaceTree.Namespace> = AbstractRemapJarTask::class.getField("prodNamespace")!!.getDelegate(this) as FinalizeOnRead<MappingNamespaceTree.Namespace>
delegate.setValueIntl(LazyMutable { provider.mappings.getNamespace(namespace) })
}

override fun mixinRemap(action: MixinRemapOptions.() -> Unit) {
val delegate: FinalizeOnRead<MixinRemapOptions.() -> Unit> = AbstractRemapJarTaskImpl::class.getField("mixinRemapOptions")!!.getDelegate(this) as FinalizeOnRead<MixinRemapOptions.() -> Unit>
val old = delegate.value as MixinRemapOptions.() -> Unit
mixinRemapOptions = {
old()
action()
}
}

override var allowImplicitWildcards by FinalizeOnRead(false)

@TaskAction
@Suppress("UNNECESSARY_NOT_NULL_ASSERTION")
fun run() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ import net.fabricmc.loom.util.kotlin.KotlinClasspathService
import net.fabricmc.loom.util.kotlin.KotlinRemapperClassloader
import net.fabricmc.tinyremapper.OutputConsumerPath
import net.fabricmc.tinyremapper.TinyRemapper
import org.gradle.api.tasks.Internal
import xyz.wagyourtail.unimined.api.mapping.MappingNamespaceTree
import xyz.wagyourtail.unimined.api.mapping.mixin.MixinRemapOptions
import xyz.wagyourtail.unimined.api.minecraft.MinecraftConfig
import xyz.wagyourtail.unimined.api.minecraft.patch.forge.ForgeLikePatcher
import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask
import xyz.wagyourtail.unimined.internal.mapping.at.AccessTransformerApplier
import xyz.wagyourtail.unimined.internal.mapping.aw.AccessWidenerApplier
import xyz.wagyourtail.unimined.internal.mapping.extension.MixinRemapExtension
import xyz.wagyourtail.unimined.util.FinalizeOnRead
import xyz.wagyourtail.unimined.util.getField
import xyz.wagyourtail.unimined.util.openZipFileSystem
import java.nio.file.Path
import javax.inject.Inject
Expand All @@ -20,6 +24,24 @@ import kotlin.io.path.deleteIfExists
abstract class RemapJarTaskImpl @Inject constructor(provider: MinecraftConfig):
AbstractRemapJarTaskImpl(provider), RemapJarTask {

@get:Internal
protected var mixinRemapOptions: MixinRemapOptions.() -> Unit by FinalizeOnRead {}

override fun mixinRemap(action: MixinRemapOptions.() -> Unit) {
val delegate: FinalizeOnRead<MixinRemapOptions.() -> Unit> = RemapJarTaskImpl::class.getField("mixinRemapOptions")!!.getDelegate(this) as FinalizeOnRead<MixinRemapOptions.() -> Unit>
val old = delegate.value as MixinRemapOptions.() -> Unit
mixinRemapOptions = {
old()
action()
}
}

override var allowImplicitWildcards by FinalizeOnRead(false)

init {
remapATToLegacy.convention(null as Boolean?).finalizeValueOnRead()
}

@Suppress("UNNECESSARY_NOT_NULL_ASSERTION")
override fun doRemap(
from: Path,
Expand Down
Loading

0 comments on commit 83a995b

Please sign in to comment.