Skip to content

Commit 7cf5114

Browse files
committed
Fix TranslationExternalAnnotationsArtifactsResolver for 2023.2.2
1 parent ee84635 commit 7cf5114

File tree

1 file changed

+52
-9
lines changed

1 file changed

+52
-9
lines changed

src/main/kotlin/translations/identification/TranslationExternalAnnotationsArtifactsResolver.kt

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.intellij.codeInsight.ExternalAnnotationsArtifactsResolver
2626
import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocation
2727
import com.intellij.openapi.application.ApplicationManager
2828
import com.intellij.openapi.application.PathManager
29+
import com.intellij.openapi.application.runReadAction
2930
import com.intellij.openapi.application.runWriteAction
3031
import com.intellij.openapi.diagnostic.logger
3132
import com.intellij.openapi.project.Project
@@ -34,9 +35,19 @@ import com.intellij.openapi.roots.impl.libraries.LibraryEx
3435
import com.intellij.openapi.roots.libraries.Library
3536
import com.intellij.openapi.roots.libraries.ui.OrderRoot
3637
import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor
38+
import com.intellij.openapi.util.Disposer
3739
import com.intellij.openapi.util.io.FileUtil
3840
import com.intellij.openapi.vfs.VirtualFile
3941
import com.intellij.openapi.vfs.VirtualFileManager
42+
import com.intellij.platform.backend.workspace.toVirtualFileUrl
43+
import com.intellij.platform.workspace.jps.entities.LibraryRoot
44+
import com.intellij.platform.workspace.jps.entities.LibraryRootTypeId
45+
import com.intellij.platform.workspace.jps.entities.modifyEntity
46+
import com.intellij.platform.workspace.storage.MutableEntityStorage
47+
import com.intellij.platform.workspace.storage.url.VirtualFileUrlManager
48+
import com.intellij.workspaceModel.ide.getInstance
49+
import com.intellij.workspaceModel.ide.impl.legacyBridge.library.LibraryBridge
50+
import com.intellij.workspaceModel.ide.impl.legacyBridge.library.ProjectLibraryTableBridgeImpl.Companion.findLibraryEntity
4051
import org.jetbrains.concurrency.AsyncPromise
4152
import org.jetbrains.concurrency.Promise
4253
import org.jetbrains.concurrency.resolvedPromise
@@ -61,6 +72,34 @@ class TranslationExternalAnnotationsArtifactsResolver : ExternalAnnotationsArtif
6172
}
6273
}
6374

75+
override fun resolve(
76+
project: Project,
77+
library: Library,
78+
annotationsLocation: AnnotationsLocation,
79+
diff: MutableEntityStorage
80+
): Boolean {
81+
if (library !is LibraryBridge || library.isDisposed) {
82+
return true
83+
}
84+
85+
val annotationsPath = findAnnotationsPath(false) ?: findAnnotationsPath(true) ?: return false
86+
87+
val libraryEntity = diff.findLibraryEntity(library) ?: return true
88+
val vfUrlManager = VirtualFileUrlManager.getInstance(project)
89+
val newUrl = annotationsPath.toVirtualFileUrl(vfUrlManager)
90+
val annotationsRootType = LibraryRootTypeId(AnnotationOrderRootType.ANNOTATIONS_ID)
91+
92+
val alreadyExists = libraryEntity.roots.any { it.type == annotationsRootType && it.url == newUrl }
93+
if (alreadyExists) {
94+
return true
95+
}
96+
97+
diff.modifyEntity(libraryEntity) {
98+
roots += LibraryRoot(newUrl, annotationsRootType)
99+
}
100+
return true
101+
}
102+
64103
override fun resolveAsync(project: Project, library: Library, mavenId: String?): Promise<Library> {
65104
if (!Util.isOurFakeMavenLocation(mavenId)) {
66105
return resolvedPromise(library)
@@ -82,18 +121,22 @@ class TranslationExternalAnnotationsArtifactsResolver : ExternalAnnotationsArtif
82121
return false
83122
}
84123

85-
return runWriteAction {
86-
val annotationsPath = findAnnotationsPath(false)
87-
?: findAnnotationsPath(true)
88-
?: return@runWriteAction false
124+
val annotationsPath = runReadAction { findAnnotationsPath(false) ?: findAnnotationsPath(true) }
125+
?: return false
89126

90-
val editor = ExistingLibraryEditor(library, null)
91-
val type = AnnotationOrderRootType.getInstance()
127+
val editor = ExistingLibraryEditor(library, null)
128+
val type = AnnotationOrderRootType.getInstance()
129+
val alreadyExists = editor.getUrls(type).contains(annotationsPath.url)
130+
if (!alreadyExists) {
92131
editor.addRoots(listOf(OrderRoot(annotationsPath, type)))
93-
editor.commit()
94-
95-
true
132+
runWriteAction {
133+
editor.commit()
134+
}
135+
} else {
136+
Disposer.dispose(editor)
96137
}
138+
139+
return true
97140
}
98141

99142
private fun findAnnotationsPath(refresh: Boolean): VirtualFile? {

0 commit comments

Comments
 (0)