@@ -32,7 +32,6 @@ import com.intellij.facet.FacetManager
32
32
import com.intellij.facet.impl.ui.libraries.LibrariesValidatorContextImpl
33
33
import com.intellij.framework.library.LibraryVersionProperties
34
34
import com.intellij.openapi.application.EDT
35
- import com.intellij.openapi.application.runWriteActionAndWait
36
35
import com.intellij.openapi.components.Service
37
36
import com.intellij.openapi.components.service
38
37
import com.intellij.openapi.module.Module
@@ -41,17 +40,20 @@ import com.intellij.openapi.project.Project
41
40
import com.intellij.openapi.roots.ModuleRootEvent
42
41
import com.intellij.openapi.roots.ModuleRootListener
43
42
import com.intellij.openapi.roots.OrderRootType
43
+ import com.intellij.openapi.roots.libraries.Library
44
44
import com.intellij.openapi.roots.libraries.LibraryDetectionManager
45
+ import com.intellij.openapi.roots.libraries.LibraryDetectionManager.LibraryPropertiesProcessor
45
46
import com.intellij.openapi.roots.libraries.LibraryKind
46
47
import com.intellij.openapi.roots.libraries.LibraryProperties
47
- import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager
48
+ import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer
48
49
import com.intellij.openapi.startup.ProjectActivity
49
50
import com.intellij.openapi.util.Key
50
51
import com.intellij.platform.ide.progress.withBackgroundProgress
51
52
import com.intellij.platform.util.progress.forEachWithProgress
52
- import com.intellij.util.application
53
53
import kotlinx.coroutines.CoroutineScope
54
54
import kotlinx.coroutines.Dispatchers
55
+ import kotlinx.coroutines.Job
56
+ import kotlinx.coroutines.cancelAndJoin
55
57
import kotlinx.coroutines.launch
56
58
import org.jetbrains.plugins.gradle.util.GradleUtil
57
59
@@ -65,13 +67,17 @@ class MinecraftFacetDetector : ProjectActivity {
65
67
}
66
68
67
69
override suspend fun execute (project : Project ) {
70
+ val detectorService = project.service<FacetDetectorScopeProvider >()
71
+ detectorService.currentJob?.let { it.cancelAndJoin() }
68
72
withBackgroundProgress(project, " Detecting Minecraft Frameworks" , cancellable = false ) {
69
73
MinecraftModuleRootListener .doCheck(project)
70
74
}
71
75
}
72
76
73
77
@Service(Service .Level .PROJECT )
74
- private class FacetDetectorScopeProvider (val scope : CoroutineScope )
78
+ private class FacetDetectorScopeProvider (val scope : CoroutineScope ) {
79
+ var currentJob: Job ? = null
80
+ }
75
81
76
82
private object MinecraftModuleRootListener : ModuleRootListener {
77
83
override fun rootsChanged (event : ModuleRootEvent ) {
@@ -80,7 +86,9 @@ class MinecraftFacetDetector : ProjectActivity {
80
86
}
81
87
82
88
val project = event.source as ? Project ? : return
83
- project.service<FacetDetectorScopeProvider >().scope.launch(Dispatchers .EDT ) {
89
+ val detectorService = project.service<FacetDetectorScopeProvider >()
90
+ detectorService.scope.launch {
91
+ detectorService.currentJob?.let { it.cancelAndJoin() }
84
92
withBackgroundProgress(project, " Detecting Minecraft Frameworks" , cancellable = false ) {
85
93
doCheck(project)
86
94
}
@@ -96,21 +104,13 @@ class MinecraftFacetDetector : ProjectActivity {
96
104
val facetManager = FacetManager .getInstance(module)
97
105
val minecraftFacet = facetManager.getFacetByType(MinecraftFacet .ID )
98
106
99
- val action = {
100
- if (minecraftFacet == null ) {
101
- checkNoFacet(module)
102
- } else {
103
- checkExistingFacet(module, minecraftFacet)
104
- if (ProjectReimporter .needsReimport(minecraftFacet)) {
105
- needsReimport = true
106
- }
107
- }
108
- }
109
-
110
- if (application.isUnitTestMode) {
111
- action()
107
+ if (minecraftFacet == null ) {
108
+ checkNoFacet(module)
112
109
} else {
113
- runWriteActionAndWait(action)
110
+ checkExistingFacet(module, minecraftFacet)
111
+ if (ProjectReimporter .needsReimport(minecraftFacet)) {
112
+ needsReimport = true
113
+ }
114
114
}
115
115
}
116
116
@@ -168,7 +168,6 @@ class MinecraftFacetDetector : ProjectActivity {
168
168
? : mutableMapOf<LibraryKind , String >().also { module.putUserData(libraryVersionsKey, it) }
169
169
libraryVersions.clear()
170
170
171
- val presentationManager = LibraryPresentationManager .getInstance()
172
171
val context = LibrariesValidatorContextImpl (module)
173
172
174
173
val platformKinds = mutableSetOf<LibraryKind >()
@@ -178,28 +177,12 @@ class MinecraftFacetDetector : ProjectActivity {
178
177
.recursively()
179
178
.librariesOnly()
180
179
.forEachLibrary forEach@{ library ->
181
- MINECRAFT_LIBRARY_KINDS .forEach { kind ->
182
- if (presentationManager.isLibraryOfKind(library, context.librariesContainer, setOf (kind))) {
183
- val libraryFiles =
184
- context.librariesContainer.getLibraryFiles(library, OrderRootType .CLASSES ).toList()
185
- LibraryDetectionManager .getInstance().processProperties(
186
- libraryFiles,
187
- object : LibraryDetectionManager .LibraryPropertiesProcessor {
188
- override fun <P : LibraryProperties <* >> processProperties (
189
- kind : LibraryKind ,
190
- properties : P ,
191
- ): Boolean {
192
- return if (properties is LibraryVersionProperties ) {
193
- libraryVersions[kind] = properties.versionString ? : return true
194
- false
195
- } else {
196
- true
197
- }
198
- }
199
- },
200
- )
201
- platformKinds.add(kind)
180
+ processLibraryMinecraftPlatformKinds(library, context.librariesContainer) { kind, version ->
181
+ platformKinds.add(kind)
182
+ if (version != null ) {
183
+ libraryVersions[kind] = version
202
184
}
185
+ true
203
186
}
204
187
return @forEach true
205
188
}
@@ -236,7 +219,25 @@ class MinecraftFacetDetector : ProjectActivity {
236
219
platformKinds.add(ARCHITECTURY_LIBRARY_KIND )
237
220
platformKinds.removeIf { it == FABRIC_LIBRARY_KIND }
238
221
}
239
- return platformKinds.mapNotNull { kind -> PlatformType .fromLibraryKind(kind) }.toSet()
222
+ return platformKinds.mapNotNullTo(mutableSetOf ()) { kind -> PlatformType .fromLibraryKind(kind) }
223
+ }
224
+
225
+ private fun processLibraryMinecraftPlatformKinds (
226
+ library : Library ,
227
+ container : LibrariesContainer ,
228
+ action : (kind: LibraryKind , version: String? ) -> Boolean
229
+ ): Boolean {
230
+ val libraryFiles = container.getLibraryFiles(library, OrderRootType .CLASSES )
231
+ val propertiesProcessor = object : LibraryPropertiesProcessor {
232
+ override fun <P : LibraryProperties <* >> processProperties (kind : LibraryKind , properties : P ): Boolean {
233
+ if (kind in MINECRAFT_LIBRARY_KINDS ) {
234
+ val version = (properties as ? LibraryVersionProperties )?.versionString
235
+ return action(kind, version)
236
+ }
237
+ return true
238
+ }
239
+ }
240
+ return LibraryDetectionManager .getInstance().processProperties(libraryFiles.asList(), propertiesProcessor)
240
241
}
241
242
}
242
243
}
0 commit comments