Skip to content

Commit c90435b

Browse files
committed
Attempt to fix some CME during facet detection
1 parent 181b30d commit c90435b

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/main/kotlin/facet/MinecraftFacetDetector.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,10 @@ import com.intellij.openapi.startup.ProjectActivity
5050
import com.intellij.openapi.util.Key
5151
import com.intellij.platform.ide.progress.withBackgroundProgress
5252
import com.intellij.platform.util.progress.forEachWithProgress
53-
import kotlinx.coroutines.CoroutineScope
54-
import kotlinx.coroutines.Dispatchers
55-
import kotlinx.coroutines.Job
56-
import kotlinx.coroutines.cancelAndJoin
57-
import kotlinx.coroutines.job
58-
import kotlinx.coroutines.launch
53+
import com.intellij.util.concurrency.NonUrgentExecutor
54+
import kotlinx.coroutines.*
55+
import kotlinx.coroutines.sync.Mutex
56+
import kotlinx.coroutines.sync.withLock
5957
import org.jetbrains.plugins.gradle.util.GradleUtil
6058

6159
class MinecraftFacetDetector : ProjectActivity {
@@ -69,15 +67,13 @@ class MinecraftFacetDetector : ProjectActivity {
6967

7068
override suspend fun execute(project: Project) {
7169
val detectorService = project.service<FacetDetectorScopeProvider>()
72-
detectorService.currentJob?.cancelAndJoin()
73-
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
74-
detectorService.currentJob = coroutineContext.job
75-
MinecraftModuleRootListener.doCheck(project)
76-
}
70+
MinecraftModuleRootListener.doCheckUnderProgress(project, detectorService)
7771
}
7872

7973
@Service(Service.Level.PROJECT)
8074
private class FacetDetectorScopeProvider(val scope: CoroutineScope) {
75+
val dispatcher = NonUrgentExecutor.getInstance().asCoroutineDispatcher()
76+
val lock = Mutex()
8177
var currentJob: Job? = null
8278
}
8379

@@ -89,12 +85,18 @@ class MinecraftFacetDetector : ProjectActivity {
8985

9086
val project = event.source as? Project ?: return
9187
val detectorService = project.service<FacetDetectorScopeProvider>()
92-
detectorService.scope.launch {
93-
detectorService.currentJob?.cancelAndJoin()
94-
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
88+
detectorService.scope.launch(detectorService.dispatcher) {
89+
doCheckUnderProgress(project, detectorService)
90+
}
91+
}
92+
93+
suspend fun doCheckUnderProgress(project: Project, detectorService: FacetDetectorScopeProvider) {
94+
withBackgroundProgress(project, "Detecting Minecraft Frameworks", cancellable = false) {
95+
detectorService.lock.withLock {
96+
detectorService.currentJob?.cancelAndJoin()
9597
detectorService.currentJob = coroutineContext.job
96-
doCheck(project)
9798
}
99+
doCheck(project)
98100
}
99101
}
100102

0 commit comments

Comments
 (0)