User: rednesto
Date: 21 Jun 24 08:04
Revision: 6de337673004d203fd7ee14f891ea16f5c75c697
Summary:
Initial support for NeoForge's ModDevGradle
Mappings don't work currently, the TSRG file seems to contain
indices to an array in another JSON file?
TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9335&personal=false
Index: src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/neomoddev/NeoModDevGradleModelBuilderImpl.groovy
===================================================================
--- src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/neomoddev/NeoModDevGradleModelBuilderImpl.groovy (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
+++ src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/neomoddev/NeoModDevGradleModelBuilderImpl.groovy (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
@@ -0,0 +1,75 @@
+/*
+ * Minecraft Development for IntelliJ
+ *
+ * https://mcdev.io/
+ *
+ * Copyright (C) 2024 minecraft-dev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, version 3.0 only.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.demonwav.mcdev.platform.mcp.gradle.tooling.neomoddev
+
+import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelNMD
+import org.gradle.api.Project
+import org.jetbrains.annotations.NotNull
+import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder
+import org.jetbrains.plugins.gradle.tooling.ModelBuilderService
+
+import java.nio.file.Files
+
+final class NeoModDevGradleModelBuilderImpl implements ModelBuilderService {
+
+ @Override
+ boolean canBuild(String modelName) {
+ return McpModelNMD.name == modelName
+ }
+
+ @Override
+ Object buildAll(String modelName, Project project) {
+ def extension = project.extensions.findByName('neoForge')
+ if (extension == null) {
+ return null
+ }
+
+ if (!project.plugins.findPlugin("net.neoforged.moddev")) {
+ return null
+ }
+
+ def neoforgeVersion = extension.version.get()
+ if (neoforgeVersion == null) {
+ return null
+ }
+
+ def accessTransformers = extension.accessTransformers.get().collect { project.file(it) }
+
+ // Hacky way to guess where the mappings file is, but I could not find a proper way to find it
+ def neoformDir = project.buildDir.toPath().resolve("neoForm")
+ def mappingsFile = Files.list(neoformDir)
+ .map { it.resolve("config/joined.tsrg") }
+ .filter { Files.exists(it) }
+ .findFirst()
+ .orElse(null)
+ ?.toFile()
+
+ //noinspection GroovyAssignabilityCheck
+ return new NeoModDevGradleModelImpl(neoforgeVersion, mappingsFile, accessTransformers)
+ }
+
+ @Override
+ ErrorMessageBuilder getErrorMessageBuilder(@NotNull Project project, @NotNull Exception e) {
+ return ErrorMessageBuilder.create(
+ project, e, "MinecraftDev import errors"
+ ).withDescription("Unable to build MinecraftDev MCP project configuration")
+ }
+}
Index: src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/neomoddev/NeoModDevGradleModelImpl.groovy
===================================================================
--- src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/neomoddev/NeoModDevGradleModelImpl.groovy (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
+++ src/gradle-tooling-extension/groovy/com/demonwav/mcdev/platform/mcp/gradle/tooling/neomoddev/NeoModDevGradleModelImpl.groovy (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
@@ -0,0 +1,43 @@
+/*
+ * Minecraft Development for IntelliJ
+ *
+ * https://mcdev.io/
+ *
+ * Copyright (C) 2024 minecraft-dev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, version 3.0 only.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.demonwav.mcdev.platform.mcp.gradle.tooling.neomoddev
+
+
+import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelNMD
+import groovy.transform.CompileStatic
+
+@CompileStatic
+final class NeoModDevGradleModelImpl implements McpModelNMD, Serializable {
+
+ final String neoForgeVersion
+ final File mappingsFile
+ final List accessTransformers
+
+ NeoModDevGradleModelImpl(
+ final String neoForgeVersion,
+ final File mappingsFile,
+ final List accessTransformers
+ ) {
+ this.neoForgeVersion = neoForgeVersion
+ this.mappingsFile = mappingsFile
+ this.accessTransformers = accessTransformers
+ }
+}
Index: src/gradle-tooling-extension/java/com/demonwav/mcdev/platform/mcp/gradle/tooling/McpModelNMD.java
===================================================================
--- src/gradle-tooling-extension/java/com/demonwav/mcdev/platform/mcp/gradle/tooling/McpModelNMD.java (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
+++ src/gradle-tooling-extension/java/com/demonwav/mcdev/platform/mcp/gradle/tooling/McpModelNMD.java (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
@@ -0,0 +1,30 @@
+/*
+ * Minecraft Development for IntelliJ
+ *
+ * https://mcdev.io/
+ *
+ * Copyright (C) 2024 minecraft-dev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, version 3.0 only.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.demonwav.mcdev.platform.mcp.gradle.tooling;
+
+import java.io.File;
+import java.util.List;
+
+public interface McpModelNMD {
+ String getNeoForgeVersion();
+ File getMappingsFile();
+ List getAccessTransformers();
+}
Index: src/gradle-tooling-extension/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService
===================================================================
--- src/gradle-tooling-extension/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService (revision 41240cad956f4148291c28c4c25775de27cc874e)
+++ src/gradle-tooling-extension/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
@@ -1,6 +1,7 @@
com.demonwav.mcdev.platform.mcp.gradle.tooling.archloom.ArchitecturyModelBuilderImpl
com.demonwav.mcdev.platform.mcp.gradle.tooling.fabricloom.FabricLoomModelBuilderImpl
com.demonwav.mcdev.platform.mcp.gradle.tooling.neogradle.NeoGradle7ModelBuilderImpl
+com.demonwav.mcdev.platform.mcp.gradle.tooling.neomoddev.NeoModDevGradleModelBuilderImpl
com.demonwav.mcdev.platform.mcp.gradle.tooling.vanillagradle.VanillaGradleModelBuilderImpl
com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelFG2BuilderImpl
com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelFG3BuilderImpl
Index: src/main/kotlin/platform/mcp/gradle/McpProjectResolverExtension.kt
===================================================================
--- src/main/kotlin/platform/mcp/gradle/McpProjectResolverExtension.kt (revision 41240cad956f4148291c28c4c25775de27cc874e)
+++ src/main/kotlin/platform/mcp/gradle/McpProjectResolverExtension.kt (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
@@ -23,9 +23,11 @@
import com.demonwav.mcdev.platform.mcp.gradle.datahandler.McpModelFG2Handler
import com.demonwav.mcdev.platform.mcp.gradle.datahandler.McpModelFG3Handler
import com.demonwav.mcdev.platform.mcp.gradle.datahandler.McpModelNG7Handler
+import com.demonwav.mcdev.platform.mcp.gradle.datahandler.McpModelNMDHandler
import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelFG2
import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelFG3
import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelNG7
+import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelNMD
import com.demonwav.mcdev.util.runGradleTask
import com.intellij.openapi.externalSystem.model.DataNode
import com.intellij.openapi.externalSystem.model.project.ModuleData
@@ -38,7 +40,7 @@
// Register our custom Gradle tooling API model in IntelliJ's project resolver
override fun getExtraProjectModelClasses(): Set> =
- setOf(McpModelFG2::class.java, McpModelFG3::class.java, McpModelNG7::class.java)
+ setOf(McpModelFG2::class.java, McpModelFG3::class.java, McpModelNG7::class.java, McpModelNMD::class.java)
override fun getToolingExtensionsClasses() = extraProjectModelClasses
@@ -91,6 +93,6 @@
}
companion object {
- private val handlers = listOf(McpModelFG2Handler, McpModelFG3Handler, McpModelNG7Handler)
+ private val handlers = listOf(McpModelFG2Handler, McpModelFG3Handler, McpModelNG7Handler, McpModelNMDHandler)
}
}
Index: src/main/kotlin/platform/mcp/gradle/datahandler/McpModelNMDHandler.kt
===================================================================
--- src/main/kotlin/platform/mcp/gradle/datahandler/McpModelNMDHandler.kt (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
+++ src/main/kotlin/platform/mcp/gradle/datahandler/McpModelNMDHandler.kt (revision 6de337673004d203fd7ee14f891ea16f5c75c697)
@@ -0,0 +1,76 @@
+/*
+ * Minecraft Development for IntelliJ
+ *
+ * https://mcdev.io/
+ *
+ * Copyright (C) 2024 minecraft-dev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, version 3.0 only.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.demonwav.mcdev.platform.mcp.gradle.datahandler
+
+import com.demonwav.mcdev.platform.mcp.McpModuleSettings
+import com.demonwav.mcdev.platform.mcp.at.AtFileType
+import com.demonwav.mcdev.platform.mcp.gradle.McpModelData
+import com.demonwav.mcdev.platform.mcp.gradle.tooling.McpModelNMD
+import com.demonwav.mcdev.platform.mcp.srg.SrgType
+import com.demonwav.mcdev.util.runWriteTaskLater
+import com.intellij.openapi.externalSystem.model.DataNode
+import com.intellij.openapi.externalSystem.model.project.ModuleData
+import com.intellij.openapi.fileTypes.ExactFileNameMatcher
+import com.intellij.openapi.fileTypes.FileTypeManager
+import com.intellij.openapi.vfs.LocalFileSystem
+import org.gradle.tooling.model.idea.IdeaModule
+import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
+import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext
+
+object McpModelNMDHandler : McpModelDataHandler {
+
+ override fun build(
+ gradleModule: IdeaModule,
+ node: DataNode,
+ resolverCtx: ProjectResolverContext,
+ ) {
+ val data = resolverCtx.getExtraProject(gradleModule, McpModelNMD::class.java) ?: return
+
+ val state = McpModuleSettings.State(
+ "1." + data.neoForgeVersion.substringBefore('.'),
+ null,
+ data.mappingsFile?.absolutePath,
+ SrgType.TSRG,
+ data.neoForgeVersion,
+ )
+
+ val ats = data.accessTransformers
+ if (ats != null && ats.isNotEmpty()) {
+ runWriteTaskLater {
+ for (at in ats) {
+ val fileTypeManager = FileTypeManager.getInstance()
+ val atFile = LocalFileSystem.getInstance().findFileByIoFile(at) ?: continue
+ fileTypeManager.associate(AtFileType, ExactFileNameMatcher(atFile.name))
+ }
+ }
+ }
+
+ val modelData = McpModelData(node.data, state, null, data.accessTransformers)
+ node.createChild(McpModelData.KEY, modelData)
+
+ for (child in node.children) {
+ val childData = child.data
+ if (childData is GradleSourceSetData) {
+ child.createChild(McpModelData.KEY, modelData.copy(module = childData))
+ }
+ }
+ }
+}