Skip to content

Commit 1127d0f

Browse files
committed
build: add GenerateAccessTransformerTask
1 parent 406120d commit 1127d0f

File tree

4 files changed

+67
-16
lines changed

4 files changed

+67
-16
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ bin/
5353
!.idea/icon.svg
5454

5555
/docs/
56+
/.gradle-home/

build-logic/src/main/kotlin/ModPlatformPlugin.kt

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
@file:Suppress("unused", "DuplicatedCode")
22

33
import dev.kikugie.fletching_table.extension.FletchingTableExtension
4-
import dev.kikugie.postprocess.sourceSets
54
import dev.kikugie.stonecutter.build.StonecutterBuildExtension
65
import me.modmuss50.mpp.ModPublishExtension
76
import me.modmuss50.mpp.ReleaseType
7+
import org.gradle.api.DefaultTask
88
import org.gradle.api.JavaVersion
99
import org.gradle.api.NamedDomainObjectContainer
1010
import org.gradle.api.Plugin
1111
import org.gradle.api.Project
1212
import org.gradle.api.artifacts.dsl.RepositoryHandler
13+
import org.gradle.api.file.RegularFileProperty
1314
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
1415
import org.gradle.api.plugins.JavaPluginExtension
1516
import org.gradle.api.provider.Property
1617
import org.gradle.api.tasks.Copy
18+
import org.gradle.api.tasks.InputFile
19+
import org.gradle.api.tasks.OutputFile
20+
import org.gradle.api.tasks.TaskAction
1721
import org.gradle.internal.extensions.stdlib.toDefaultLowerCase
1822
import org.gradle.jvm.tasks.Jar
1923
import org.gradle.kotlin.dsl.*
@@ -35,6 +39,47 @@ fun RepositoryHandler.strictMaven(
3539
filter { groups.forEach(::includeGroup) }
3640
}
3741

42+
abstract class GenerateAccessTransformerTask : DefaultTask() {
43+
@get:InputFile
44+
abstract val inputFile: RegularFileProperty
45+
46+
@get:OutputFile
47+
abstract val outputFile: RegularFileProperty
48+
49+
@TaskAction
50+
fun generate() {
51+
val output = outputFile.get().asFile
52+
output.parentFile.mkdirs()
53+
54+
val converted = linkedSetOf<String>()
55+
56+
inputFile.get().asFile.readLines()
57+
.map(String::trim)
58+
.filter { it.isNotEmpty() && !it.startsWith("accessWidener") }
59+
.forEach { converted.addAll(convertAccessWidenerLine(it)) }
60+
61+
output.writeText(converted.joinToString(System.lineSeparator()))
62+
}
63+
64+
private fun convertAccessWidenerLine(line: String): List<String> {
65+
val parts = line.split(Regex("\\s+"))
66+
if (parts.isEmpty() || parts[0] != "accessible") return emptyList()
67+
68+
return when (parts.getOrNull(1)) {
69+
"class" -> listOf("public ${parts[2].replace('/', '.')}")
70+
"field" -> listOf(
71+
"public ${parts[2].replace('/', '.')}",
72+
"public ${parts[2].replace('/', '.')} ${parts[3]}"
73+
)
74+
"method" -> listOf(
75+
"public ${parts[2].replace('/', '.')}",
76+
"public ${parts[2].replace('/', '.')} ${parts[3]}${parts[4]}"
77+
)
78+
else -> emptyList()
79+
}
80+
}
81+
}
82+
3883
abstract class ModPlatformPlugin @Inject constructor() : Plugin<Project> {
3984
override fun apply(project: Project) = with(project) {
4085
val inferredLoader = project.buildFile.name.substringAfter('.').replace(".gradle.kts", "")
@@ -52,6 +97,10 @@ abstract class ModPlatformPlugin @Inject constructor() : Plugin<Project> {
5297
"dev.kikugie.fletching-table"
5398
).forEach { apply(plugin = it) }
5499

100+
if (!inferredLoaderIsFabric) {
101+
registerAccessTransformerTask(prop("deps.minecraft"))
102+
}
103+
55104
afterEvaluate {
56105
configureProject(extension)
57106
}
@@ -127,6 +176,11 @@ abstract class ModPlatformPlugin @Inject constructor() : Plugin<Project> {
127176
tasks.named<ProcessResources>("processResources") {
128177
dependsOn(tasks.named("stonecutterGenerate"))
129178
dependsOn("kspKotlin")
179+
if (!isFabric) {
180+
from(tasks.named("generateAccessTransformer")) {
181+
into("META-INF")
182+
}
183+
}
130184

131185
filesMatching("*.mixins.json") {
132186
expand("java" to "JAVA_${requiredJava.majorVersion}")
@@ -180,6 +234,15 @@ abstract class ModPlatformPlugin @Inject constructor() : Plugin<Project> {
180234
}
181235
}
182236

237+
private fun Project.registerAccessTransformerTask(minecraftVersion: String) {
238+
tasks.register<GenerateAccessTransformerTask>("generateAccessTransformer") {
239+
group = "build"
240+
description = "Generates META-INF/accesstransformer.cfg from the current access widener"
241+
inputFile.set(rootProject.layout.projectDirectory.file("src/main/resources/aw/$minecraftVersion.accesswidener"))
242+
outputFile.set(layout.buildDirectory.file("generated/access-transformer/main/META-INF/accesstransformer.cfg"))
243+
}
244+
}
245+
183246
private fun buildDependenciesBlock(
184247
isFabric: Boolean, modId: String, deps: DependenciesConfig
185248
): String = if (isFabric) {
@@ -253,15 +316,6 @@ abstract class ModPlatformPlugin @Inject constructor() : Plugin<Project> {
253316
}
254317
}
255318

256-
if (!isFabric) {
257-
extensions.configure<FletchingTableExtension> {
258-
sourceSets?.let {
259-
accessConverter.register(it["main"]) {
260-
add("aw/${prop("deps.minecraft")}.accesswidener")
261-
}
262-
}
263-
}
264-
}
265319
}
266320

267321
private fun Project.registerBuildAndCollectTask(extension: ModPlatformExtension, modVersion: String) {

build.forge.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ legacyForge {
2121

2222
//validateAccessTransformers = true
2323

24-
rootProject.file("versions/${stonecutter.current.version}-forge/build/resources/main/META-INF/accesstransformer.cfg").let {
25-
if (it.exists()) accessTransformers.from(it)
26-
}
24+
accessTransformers.from(tasks.named("generateAccessTransformer"))
2725

2826
runs {
2927
register("client") {

build.neoforge.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ neoForge {
2020

2121
//validateAccessTransformers = true
2222

23-
rootProject.file("versions/${stonecutter.current.version}-neoforge/build/resources/main/META-INF/accesstransformer.cfg").let {
24-
if (it.exists()) accessTransformers.from(it)
25-
}
23+
accessTransformers.from(tasks.named("generateAccessTransformer"))
2624

2725
if (hasProperty("deps.parchment")) parchment {
2826
val (mc, ver) = (property("deps.parchment") as String).split(':')

0 commit comments

Comments
 (0)