Skip to content

Commit 88123b1

Browse files
committed
Fix facet refreshing still blocking EDT sometimes
Also should improve performance of refresh
1 parent 4b7455d commit 88123b1

File tree

1 file changed

+43
-42
lines changed

1 file changed

+43
-42
lines changed

src/main/kotlin/facet/MinecraftFacetDetector.kt

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import com.intellij.facet.FacetManager
3232
import com.intellij.facet.impl.ui.libraries.LibrariesValidatorContextImpl
3333
import com.intellij.framework.library.LibraryVersionProperties
3434
import com.intellij.openapi.application.EDT
35-
import com.intellij.openapi.application.runWriteActionAndWait
3635
import com.intellij.openapi.components.Service
3736
import com.intellij.openapi.components.service
3837
import com.intellij.openapi.module.Module
@@ -41,17 +40,20 @@ import com.intellij.openapi.project.Project
4140
import com.intellij.openapi.roots.ModuleRootEvent
4241
import com.intellij.openapi.roots.ModuleRootListener
4342
import com.intellij.openapi.roots.OrderRootType
43+
import com.intellij.openapi.roots.libraries.Library
4444
import com.intellij.openapi.roots.libraries.LibraryDetectionManager
45+
import com.intellij.openapi.roots.libraries.LibraryDetectionManager.LibraryPropertiesProcessor
4546
import com.intellij.openapi.roots.libraries.LibraryKind
4647
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
4849
import com.intellij.openapi.startup.ProjectActivity
4950
import com.intellij.openapi.util.Key
5051
import com.intellij.platform.ide.progress.withBackgroundProgress
5152
import com.intellij.platform.util.progress.forEachWithProgress
52-
import com.intellij.util.application
5353
import kotlinx.coroutines.CoroutineScope
5454
import kotlinx.coroutines.Dispatchers
55+
import kotlinx.coroutines.Job
56+
import kotlinx.coroutines.cancelAndJoin
5557
import kotlinx.coroutines.launch
5658
import org.jetbrains.plugins.gradle.util.GradleUtil
5759

@@ -65,13 +67,17 @@ class MinecraftFacetDetector : ProjectActivity {
6567
}
6668

6769
override suspend fun execute(project: Project) {
70+
val detectorService = project.service<FacetDetectorScopeProvider>()
71+
detectorService.currentJob?.let { it.cancelAndJoin() }
6872
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
6973
MinecraftModuleRootListener.doCheck(project)
7074
}
7175
}
7276

7377
@Service(Service.Level.PROJECT)
74-
private class FacetDetectorScopeProvider(val scope: CoroutineScope)
78+
private class FacetDetectorScopeProvider(val scope: CoroutineScope) {
79+
var currentJob: Job? = null
80+
}
7581

7682
private object MinecraftModuleRootListener : ModuleRootListener {
7783
override fun rootsChanged(event: ModuleRootEvent) {
@@ -80,7 +86,9 @@ class MinecraftFacetDetector : ProjectActivity {
8086
}
8187

8288
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() }
8492
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
8593
doCheck(project)
8694
}
@@ -96,21 +104,13 @@ class MinecraftFacetDetector : ProjectActivity {
96104
val facetManager = FacetManager.getInstance(module)
97105
val minecraftFacet = facetManager.getFacetByType(MinecraftFacet.ID)
98106

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)
112109
} else {
113-
runWriteActionAndWait(action)
110+
checkExistingFacet(module, minecraftFacet)
111+
if (ProjectReimporter.needsReimport(minecraftFacet)) {
112+
needsReimport = true
113+
}
114114
}
115115
}
116116

@@ -168,7 +168,6 @@ class MinecraftFacetDetector : ProjectActivity {
168168
?: mutableMapOf<LibraryKind, String>().also { module.putUserData(libraryVersionsKey, it) }
169169
libraryVersions.clear()
170170

171-
val presentationManager = LibraryPresentationManager.getInstance()
172171
val context = LibrariesValidatorContextImpl(module)
173172

174173
val platformKinds = mutableSetOf<LibraryKind>()
@@ -178,28 +177,12 @@ class MinecraftFacetDetector : ProjectActivity {
178177
.recursively()
179178
.librariesOnly()
180179
.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
202184
}
185+
true
203186
}
204187
return@forEach true
205188
}
@@ -236,7 +219,25 @@ class MinecraftFacetDetector : ProjectActivity {
236219
platformKinds.add(ARCHITECTURY_LIBRARY_KIND)
237220
platformKinds.removeIf { it == FABRIC_LIBRARY_KIND }
238221
}
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)
240241
}
241242
}
242243
}

0 commit comments

Comments
 (0)