User: joseph burton Date: 24 Sep 23 08:20 Revision: 07de16f68440656d4d108de8bd06e4d21cd477d0 Summary: Add external annotations to Minecraft libraries (#2130) * Add external annotations to Minecraft libraries * Don't remove previous annotation roots TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=8761&personal=false Index: build.gradle.kts =================================================================== --- build.gradle.kts (revision 11e17b9ad4866a4e15db2166a4bcf26a8adadf29) +++ build.gradle.kts (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -24,6 +24,7 @@ import org.gradle.internal.os.OperatingSystem import org.jetbrains.gradle.ext.settings import org.jetbrains.gradle.ext.taskTriggers +import org.jetbrains.intellij.tasks.PrepareSandboxTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jlleitschuh.gradle.ktlint.tasks.BaseKtLintCheckTask import org.jlleitschuh.gradle.ktlint.tasks.KtLintFormatTask @@ -72,6 +73,12 @@ archiveClassifier.set("gradle-tooling-extension") } +val externalAnnotationsJar = tasks.register("externalAnnotationsJar") { + from("externalAnnotations") + destinationDirectory.set(layout.buildDirectory.dir("externalAnnotations")) + archiveFileName.set("externalAnnotations.jar") +} + repositories { maven("https://repo.denwav.dev/repository/maven-public/") maven("https://maven.fabricmc.net/") { @@ -298,8 +305,11 @@ register("grammars") { files.from(project.fileTree("src/main/grammars")) } + register("externalAnnotations") { + files.from(project.fileTree("externalAnnotations")) - } -} + } + } +} ktlint { disabledRules.add("filename") @@ -356,6 +366,12 @@ delete(layout.projectDirectory.dir(".sandbox")) } +tasks.withType { + from(externalAnnotationsJar) { + into("Minecraft Development/lib/resources") + } +} + tasks.runIde { maxHeapSize = "4G" Index: externalAnnotations/com/mojang/blaze3d/platform/annotations.xml =================================================================== --- externalAnnotations/com/mojang/blaze3d/platform/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ externalAnnotations/com/mojang/blaze3d/platform/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,25 @@ + + + + + + + Index: externalAnnotations/net/minecraft/client/annotations.xml =================================================================== --- externalAnnotations/net/minecraft/client/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ externalAnnotations/net/minecraft/client/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: externalAnnotations/net/minecraft/client/resources/language/annotations.xml =================================================================== --- externalAnnotations/net/minecraft/client/resources/language/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ externalAnnotations/net/minecraft/client/resources/language/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,30 @@ + + + + + + + + + + + + Index: externalAnnotations/net/minecraft/command/annotations.xml =================================================================== --- externalAnnotations/net/minecraft/command/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ externalAnnotations/net/minecraft/command/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,25 @@ + + + + + + + Index: externalAnnotations/net/minecraft/network/chat/annotations.xml =================================================================== --- externalAnnotations/net/minecraft/network/chat/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ externalAnnotations/net/minecraft/network/chat/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: externalAnnotations/net/minecraftforge/server/command/annotations.xml =================================================================== --- externalAnnotations/net/minecraftforge/server/command/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ externalAnnotations/net/minecraftforge/server/command/annotations.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,25 @@ + + + + + + + Index: src/main/kotlin/facet/ProjectReimporter.kt =================================================================== --- src/main/kotlin/facet/ProjectReimporter.kt (revision 11e17b9ad4866a4e15db2166a4bcf26a8adadf29) +++ src/main/kotlin/facet/ProjectReimporter.kt (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -33,7 +33,7 @@ object ProjectReimporter { private val log = logger() - const val CURRENT_REIMPORT_VERSION = 0 + const val CURRENT_REIMPORT_VERSION = 1 fun needsReimport(facet: MinecraftFacet) = facet.configuration.state.projectReimportVersion < CURRENT_REIMPORT_VERSION Index: src/main/kotlin/translations/identification/TranslationAnnotationsLocationProvider.kt =================================================================== --- src/main/kotlin/translations/identification/TranslationAnnotationsLocationProvider.kt (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ src/main/kotlin/translations/identification/TranslationAnnotationsLocationProvider.kt (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,48 @@ +/* + * Minecraft Development for IntelliJ + * + * https://mcdev.io/ + * + * Copyright (C) 2023 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.translations.identification + +import com.demonwav.mcdev.platform.mcp.framework.MCP_LIBRARY_KIND +import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocation +import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocationProvider +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.OrderRootType +import com.intellij.openapi.roots.libraries.Library +import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager + +class TranslationAnnotationsLocationProvider : AnnotationsLocationProvider { + override fun getLocations( + project: Project, + library: Library, + artifactId: String?, + groupId: String?, + version: String? + ): Collection { + val isMinecraftLibrary = LibraryPresentationManager.getInstance().isLibraryOfKind( + library.getFiles(OrderRootType.CLASSES).toList(), + MCP_LIBRARY_KIND + ) + if (isMinecraftLibrary) { + return listOf(TranslationExternalAnnotationsArtifactsResolver.Util.fakeMavenLocation) + } + return emptyList() + } +} Index: src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt =================================================================== --- src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) +++ src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -0,0 +1,129 @@ +/* + * Minecraft Development for IntelliJ + * + * https://mcdev.io/ + * + * Copyright (C) 2023 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.translations.identification + +import com.demonwav.mcdev.util.invokeAndWait +import com.demonwav.mcdev.util.invokeLater +import com.intellij.codeInsight.ExternalAnnotationsArtifactsResolver +import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocation +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.PathManager +import com.intellij.openapi.application.runWriteAction +import com.intellij.openapi.diagnostic.logger +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.AnnotationOrderRootType +import com.intellij.openapi.roots.impl.libraries.LibraryEx +import com.intellij.openapi.roots.libraries.Library +import com.intellij.openapi.roots.libraries.ui.OrderRoot +import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.vfs.VirtualFileManager +import org.jetbrains.concurrency.AsyncPromise +import org.jetbrains.concurrency.Promise +import org.jetbrains.concurrency.resolvedPromise + +class TranslationExternalAnnotationsArtifactsResolver : ExternalAnnotationsArtifactsResolver { + override fun resolve(project: Project, library: Library, mavenId: String?): Boolean { + if (!Util.isOurFakeMavenLocation(mavenId)) { + return false + } + + return invokeAndWait { + doResolve(library) + } + } + + override fun resolve(project: Project, library: Library, annotationsLocation: AnnotationsLocation): Boolean { + if (annotationsLocation != Util.fakeMavenLocation) { + return false + } + return invokeAndWait { + doResolve(library) + } + } + + override fun resolveAsync(project: Project, library: Library, mavenId: String?): Promise { + if (!Util.isOurFakeMavenLocation(mavenId)) { + return resolvedPromise(library) + } + + val promise = AsyncPromise() + ApplicationManager.getApplication().executeOnPooledThread { + invokeLater { + doResolve(library) + promise.setResult(library) + } + } + + return promise + } + + private fun doResolve(library: Library): Boolean { + if (library !is LibraryEx || library.isDisposed) { + return false + } + + return runWriteAction { + val annotationsPath = findAnnotationsPath(false) + ?: findAnnotationsPath(true) + ?: return@runWriteAction false + + val editor = ExistingLibraryEditor(library, null) + val type = AnnotationOrderRootType.getInstance() + editor.addRoots(listOf(OrderRoot(annotationsPath, type))) + editor.commit() + + true + } + } + + private fun findAnnotationsPath(refresh: Boolean): VirtualFile? { + val mcdevClassesRootPath = + PathManager.getJarForClass(TranslationExternalAnnotationsArtifactsResolver::class.java)?.toAbsolutePath() + if (!log.assertTrue(mcdevClassesRootPath != null)) { + return null + } + mcdevClassesRootPath!! + + val vfm = VirtualFileManager.getInstance() + val annotationsJarPath = mcdevClassesRootPath.resolveSibling("resources/externalAnnotations.jar") + val annotationsJarPathString = FileUtil.toSystemIndependentName(annotationsJarPath.toString()) + val url = "jar://$annotationsJarPathString!/" + return if (refresh) { + vfm.refreshAndFindFileByUrl(url) + } else { + vfm.findFileByUrl(url) + } + } + + companion object { + val log = logger() + } + + object Util { + val fakeMavenLocation = AnnotationsLocation("com.demonwav.mcdev", "external_annotations", "1.0") + + fun isOurFakeMavenLocation(mavenId: String?): Boolean { + return mavenId == "com.demonwav.mcdev:external_annotations:1.0" + } + } +} Index: src/main/resources/META-INF/plugin.xml =================================================================== --- src/main/resources/META-INF/plugin.xml (revision 11e17b9ad4866a4e15db2166a4bcf26a8adadf29) +++ src/main/resources/META-INF/plugin.xml (revision 07de16f68440656d4d108de8bd06e4d21cd477d0) @@ -272,6 +272,8 @@ order="before javaSkipAutopopupInStrings"/> + +