@@ -26,6 +26,7 @@ import com.intellij.codeInsight.ExternalAnnotationsArtifactsResolver
26
26
import com.intellij.codeInsight.externalAnnotation.location.AnnotationsLocation
27
27
import com.intellij.openapi.application.ApplicationManager
28
28
import com.intellij.openapi.application.PathManager
29
+ import com.intellij.openapi.application.runReadAction
29
30
import com.intellij.openapi.application.runWriteAction
30
31
import com.intellij.openapi.diagnostic.logger
31
32
import com.intellij.openapi.project.Project
@@ -34,9 +35,19 @@ import com.intellij.openapi.roots.impl.libraries.LibraryEx
34
35
import com.intellij.openapi.roots.libraries.Library
35
36
import com.intellij.openapi.roots.libraries.ui.OrderRoot
36
37
import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor
38
+ import com.intellij.openapi.util.Disposer
37
39
import com.intellij.openapi.util.io.FileUtil
38
40
import com.intellij.openapi.vfs.VirtualFile
39
41
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
40
51
import org.jetbrains.concurrency.AsyncPromise
41
52
import org.jetbrains.concurrency.Promise
42
53
import org.jetbrains.concurrency.resolvedPromise
@@ -61,6 +72,34 @@ class TranslationExternalAnnotationsArtifactsResolver : ExternalAnnotationsArtif
61
72
}
62
73
}
63
74
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
+
64
103
override fun resolveAsync (project : Project , library : Library , mavenId : String? ): Promise <Library > {
65
104
if (! Util .isOurFakeMavenLocation(mavenId)) {
66
105
return resolvedPromise(library)
@@ -82,18 +121,22 @@ class TranslationExternalAnnotationsArtifactsResolver : ExternalAnnotationsArtif
82
121
return false
83
122
}
84
123
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
89
126
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) {
92
131
editor.addRoots(listOf (OrderRoot (annotationsPath, type)))
93
- editor.commit()
94
-
95
- true
132
+ runWriteAction {
133
+ editor.commit()
134
+ }
135
+ } else {
136
+ Disposer .dispose(editor)
96
137
}
138
+
139
+ return true
97
140
}
98
141
99
142
private fun findAnnotationsPath (refresh : Boolean ): VirtualFile ? {
0 commit comments