11@file:Suppress(" unused" , " DuplicatedCode" )
22
33import dev.kikugie.fletching_table.extension.FletchingTableExtension
4- import dev.kikugie.postprocess.sourceSets
54import dev.kikugie.stonecutter.build.StonecutterBuildExtension
65import me.modmuss50.mpp.ModPublishExtension
76import me.modmuss50.mpp.ReleaseType
7+ import org.gradle.api.DefaultTask
88import org.gradle.api.JavaVersion
99import org.gradle.api.NamedDomainObjectContainer
1010import org.gradle.api.Plugin
1111import org.gradle.api.Project
1212import org.gradle.api.artifacts.dsl.RepositoryHandler
13+ import org.gradle.api.file.RegularFileProperty
1314import org.gradle.api.artifacts.repositories.MavenArtifactRepository
1415import org.gradle.api.plugins.JavaPluginExtension
1516import org.gradle.api.provider.Property
1617import 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
1721import org.gradle.internal.extensions.stdlib.toDefaultLowerCase
1822import org.gradle.jvm.tasks.Jar
1923import 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+
3883abstract 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 ) {
0 commit comments