User: modmuss50 Date: 07 Aug 22 00:01 Revision: 20b77530cb09cf51d8fb0ea6a90252e301428c6d Summary: Support loom 0.13 and fix decompile options when using split Minecraft jars. (#1876) * Support loom 0.13 and fix decompile options when using split Minecraft jars. * Use SideOnlyUtil TeamCity URL: https://ci.denwav.dev/viewModification.html?tab=vcsModificationFiles&modId=8048&personal=false Index: src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModelBuilderImpl.groovy =================================================================== --- src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModelBuilderImpl.groovy (revision eeb1d96ae4cbede63c0172d4dd5ba961dcfe9d18) +++ src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModelBuilderImpl.groovy (revision 20b77530cb09cf51d8fb0ea6a90252e301428c6d) @@ -30,15 +30,50 @@ } def loomExtension = project.extensions.getByName('loom') + + try { + return build(project, loomExtension) + } catch (GroovyRuntimeException ignored) { + // Must be using an older loom version, fallback. + return buildLegacy(project, loomExtension) + } + } + + FabricLoomModel build(Project project, Object loomExtension) { + def tinyMappings = loomExtension.mappingsFile + def splitMinecraftJar = loomExtension.areEnvironmentSourceSetsSplit() + + def decompilers = [:] + + if (splitMinecraftJar) { + decompilers << ["common": getDecompilers(loomExtension, false)] + decompilers << ["client": getDecompilers(loomExtension, true)] + } else { + decompilers << ["single": getDecompilers(loomExtension, false)] + } + + //noinspection GroovyAssignabilityCheck + return new FabricLoomModelImpl(tinyMappings, decompilers, splitMinecraftJar) + } + + List getDecompilers(Object loomExtension, boolean client) { + loomExtension.decompilerOptions.collect { + def task = loomExtension.getDecompileTask(it, client) + def sourcesPath = task.outputJar.get().getAsFile().getAbsolutePath() + new FabricLoomModelImpl.DecompilerModelImpl(name: it.name, taskName: task.name, sourcesPath: sourcesPath) + } + } + + FabricLoomModel buildLegacy(Project project, Object loomExtension) { def tinyMappings = loomExtension.mappingsProvider.tinyMappings.toFile().getAbsoluteFile() - def decompilers = loomExtension.decompilerOptions.collectEntries { + def decompilers = loomExtension.decompilerOptions.collect { def task = project.tasks.getByName('genSourcesWith' + it.name.capitalize()) def sourcesPath = task.runtimeJar.get().getAsFile().getAbsolutePath().dropRight(4) + "-sources.jar" - [it.name, sourcesPath] + new FabricLoomModelImpl.DecompilerModelImpl(name: it.name, taskName: task.name, sourcesPath: sourcesPath) } //noinspection GroovyAssignabilityCheck - return new FabricLoomModelImpl(tinyMappings, decompilers) + return new FabricLoomModelImpl(tinyMappings, ["single": decompilers], false) } @Override Index: src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModelImpl.groovy =================================================================== --- src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModelImpl.groovy (revision eeb1d96ae4cbede63c0172d4dd5ba961dcfe9d18) +++ src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModelImpl.groovy (revision 20b77530cb09cf51d8fb0ea6a90252e301428c6d) @@ -10,23 +10,18 @@ package com.demonwav.mcdev.platform.mcp.gradle.tooling.fabricloom +import groovy.transform.Immutable + +@Immutable(knownImmutableClasses = [File]) class FabricLoomModelImpl implements FabricLoomModel, Serializable { + File tinyMappings + Map> decompilers + boolean splitMinecraftJar - private final File tinyMappings - private final Map decompilers - - FabricLoomModelImpl(File tinyMappings, Map decompilers) { - this.tinyMappings = tinyMappings - this.decompilers = decompilers + @Immutable + static class DecompilerModelImpl implements DecompilerModel, Serializable { + String name + String taskName + String sourcesPath } - - @Override - File getTinyMappings() { - return tinyMappings - } +} - - @Override - Map getDecompilers() { - return decompilers - } -} Index: src/gradle-tooling-extension/java/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModel.java =================================================================== --- src/gradle-tooling-extension/java/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModel.java (revision eeb1d96ae4cbede63c0172d4dd5ba961dcfe9d18) +++ src/gradle-tooling-extension/java/com/demonwav/mcdev/platform/mcp/gradle/tooling/fabricloom/FabricLoomModel.java (revision 20b77530cb09cf51d8fb0ea6a90252e301428c6d) @@ -11,11 +11,23 @@ package com.demonwav.mcdev.platform.mcp.gradle.tooling.fabricloom; import java.io.File; +import java.util.List; import java.util.Map; public interface FabricLoomModel { File getTinyMappings(); - Map getDecompilers(); + Map> getDecompilers(); + + boolean getSplitMinecraftJar(); + + interface DecompilerModel { + + String getName(); + + String getTaskName(); + + String getSourcesPath(); -} + } +} Index: src/main/kotlin/platform/mcp/fabricloom/FabricLoomData.kt =================================================================== --- src/main/kotlin/platform/mcp/fabricloom/FabricLoomData.kt (revision eeb1d96ae4cbede63c0172d4dd5ba961dcfe9d18) +++ src/main/kotlin/platform/mcp/fabricloom/FabricLoomData.kt (revision 20b77530cb09cf51d8fb0ea6a90252e301428c6d) @@ -19,7 +19,8 @@ data class FabricLoomData( val module: ModuleData, val tinyMappings: File?, - val decompileTasks: Set + val decompileTasks: Map>, + val splitMinecraftJar: Boolean ) : AbstractExternalEntityData(module.owner) { data class Decompiler(val name: String, val taskName: String, val sourcesPath: String) Index: src/main/kotlin/platform/mcp/fabricloom/FabricLoomDecompileSourceProvider.kt =================================================================== --- src/main/kotlin/platform/mcp/fabricloom/FabricLoomDecompileSourceProvider.kt (revision eeb1d96ae4cbede63c0172d4dd5ba961dcfe9d18) +++ src/main/kotlin/platform/mcp/fabricloom/FabricLoomDecompileSourceProvider.kt (revision 20b77530cb09cf51d8fb0ea6a90252e301428c6d) @@ -10,6 +10,8 @@ package com.demonwav.mcdev.platform.mcp.fabricloom +import com.demonwav.mcdev.platform.forge.inspections.sideonly.Side +import com.demonwav.mcdev.platform.forge.inspections.sideonly.SideOnlyUtil import com.demonwav.mcdev.util.findModule import com.demonwav.mcdev.util.runGradleTaskWithCallback import com.intellij.codeInsight.AttachSourcesProvider @@ -36,9 +38,25 @@ val loomData = GradleUtil.findGradleModuleData(module)?.children ?.find { it.key == FabricLoomData.KEY }?.data as? FabricLoomData ?: return emptyList() - return loomData.decompileTasks.map(::DecompileAction) + + val env = if (!loomData.splitMinecraftJar) { + "single" + } else if (isClientClass(psiFile)) { + "client" + } else { + "common" - } + } + val decompileTasks = loomData.decompileTasks[env] ?: return emptyList() + return decompileTasks.map(::DecompileAction) + } + + private fun isClientClass(psiFile: PsiJavaFile): Boolean { + return psiFile.classes.any { psiClass -> + return SideOnlyUtil.getSideForClass(psiClass).second == Side.CLIENT + } + } + private class DecompileAction(val decompiler: FabricLoomData.Decompiler) : AttachSourcesProvider.AttachSourcesAction { Index: src/main/kotlin/platform/mcp/fabricloom/FabricLoomProjectResolverExtension.kt =================================================================== --- src/main/kotlin/platform/mcp/fabricloom/FabricLoomProjectResolverExtension.kt (revision eeb1d96ae4cbede63c0172d4dd5ba961dcfe9d18) +++ src/main/kotlin/platform/mcp/fabricloom/FabricLoomProjectResolverExtension.kt (revision 20b77530cb09cf51d8fb0ea6a90252e301428c6d) @@ -11,7 +11,6 @@ package com.demonwav.mcdev.platform.mcp.fabricloom import com.demonwav.mcdev.platform.mcp.gradle.tooling.fabricloom.FabricLoomModel -import com.demonwav.mcdev.util.capitalize import com.intellij.openapi.externalSystem.model.DataNode import com.intellij.openapi.externalSystem.model.project.ModuleData import org.gradle.tooling.model.idea.IdeaModule @@ -27,14 +26,13 @@ override fun populateModuleExtraModels(gradleModule: IdeaModule, ideModule: DataNode) { val loomData = resolverCtx.getExtraProject(gradleModule, FabricLoomModel::class.java) if (loomData != null) { - val gradleProjectPath = gradleModule.gradleProject.projectIdentifier.projectPath - val suffix = if (gradleProjectPath.endsWith(':')) "" else ":" - val decompileTasksNames = loomData.decompilers.mapTo(mutableSetOf()) { (rawName, sourcesPath) -> - val name = rawName.capitalize() - val taskName = gradleProjectPath + suffix + "genSourcesWith" + name - FabricLoomData.Decompiler(name, taskName, sourcesPath) + val decompilers = loomData.decompilers.mapValues { (_, decompilers) -> + decompilers.mapTo(mutableSetOf()) { decompiler -> + FabricLoomData.Decompiler(decompiler.name, decompiler.taskName, decompiler.sourcesPath) - } + } - val data = FabricLoomData(ideModule.data, loomData.tinyMappings, decompileTasksNames) + } + + val data = FabricLoomData(ideModule.data, loomData.tinyMappings, decompilers, loomData.splitMinecraftJar) ideModule.createChild(FabricLoomData.KEY, data) }