User: joe Date: 24 Sep 23 10:35 Revision: 7cf51144bc28fc388596825850a9528f8dce5d09 Summary: Fix TranslationExternalAnnotationsArtifactsResolver for 2023.2.2 TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=8796&personal=false Index: src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt =================================================================== --- src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt (revision ee84635eaee3a6405af2039ca534fa0d04682c49) +++ src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt (revision 7cf51144bc28fc388596825850a9528f8dce5d09) @@ -26,6 +26,7 @@ import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocation import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.PathManager +import com.intellij.openapi.application.runReadAction import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project @@ -34,9 +35,19 @@ 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.Disposer import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager +import com.intellij.platform.backend.workspace.toVirtualFileUrl +import com.intellij.platform.workspace.jps.entities.LibraryRoot +import com.intellij.platform.workspace.jps.entities.LibraryRootTypeId +import com.intellij.platform.workspace.jps.entities.modifyEntity +import com.intellij.platform.workspace.storage.MutableEntityStorage +import com.intellij.platform.workspace.storage.url.VirtualFileUrlManager +import com.intellij.workspaceModel.ide.getInstance +import com.intellij.workspaceModel.ide.impl.legacyBridge.library.LibraryBridge +import com.intellij.workspaceModel.ide.impl.legacyBridge.library.ProjectLibraryTableBridgeImpl.Companion.findLibraryEntity import org.jetbrains.concurrency.AsyncPromise import org.jetbrains.concurrency.Promise import org.jetbrains.concurrency.resolvedPromise @@ -61,6 +72,34 @@ } } + override fun resolve( + project: Project, + library: Library, + annotationsLocation: AnnotationsLocation, + diff: MutableEntityStorage + ): Boolean { + if (library !is LibraryBridge || library.isDisposed) { + return true + } + + val annotationsPath = findAnnotationsPath(false) ?: findAnnotationsPath(true) ?: return false + + val libraryEntity = diff.findLibraryEntity(library) ?: return true + val vfUrlManager = VirtualFileUrlManager.getInstance(project) + val newUrl = annotationsPath.toVirtualFileUrl(vfUrlManager) + val annotationsRootType = LibraryRootTypeId(AnnotationOrderRootType.ANNOTATIONS_ID) + + val alreadyExists = libraryEntity.roots.any { it.type == annotationsRootType && it.url == newUrl } + if (alreadyExists) { + return true + } + + diff.modifyEntity(libraryEntity) { + roots += LibraryRoot(newUrl, annotationsRootType) + } + return true + } + override fun resolveAsync(project: Project, library: Library, mavenId: String?): Promise { if (!Util.isOurFakeMavenLocation(mavenId)) { return resolvedPromise(library) @@ -82,20 +121,24 @@ return false } - return runWriteAction { - val annotationsPath = findAnnotationsPath(false) - ?: findAnnotationsPath(true) - ?: return@runWriteAction false + val annotationsPath = runReadAction { findAnnotationsPath(false) ?: findAnnotationsPath(true) } + ?: return false - val editor = ExistingLibraryEditor(library, null) - val type = AnnotationOrderRootType.getInstance() + val editor = ExistingLibraryEditor(library, null) + val type = AnnotationOrderRootType.getInstance() + val alreadyExists = editor.getUrls(type).contains(annotationsPath.url) + if (!alreadyExists) { editor.addRoots(listOf(OrderRoot(annotationsPath, type))) + runWriteAction { - editor.commit() + editor.commit() - - true - } + } + } else { + Disposer.dispose(editor) - } + } + return true + } + private fun findAnnotationsPath(refresh: Boolean): VirtualFile? { val mcdevClassesRootPath = PathManager.getJarForClass(TranslationExternalAnnotationsArtifactsResolver::class.java)?.toAbsolutePath()