diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyAsyncMacroModuleListener.kt b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyAsyncMacroModuleListener.kt new file mode 100644 index 000000000000..a4601dd980d2 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyAsyncMacroModuleListener.kt @@ -0,0 +1,30 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.plugins.groovy.dgm + +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project +import com.intellij.util.asSafely +import com.intellij.workspaceModel.ide.WorkspaceModel +import com.intellij.workspaceModel.ide.impl.legacyBridge.module.ModuleManagerBridgeImpl.Companion.moduleMap +import com.intellij.workspaceModel.storage.bridgeEntities.ModuleEntity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import org.jetbrains.plugins.groovy.transformations.macro.GroovyMacroRegistryService + +class GroovyAsyncMacroModuleListener(private val project: Project, private val cs: CoroutineScope) { + internal fun subscribe() { + cs.launch { + WorkspaceModel.getInstance(project).changesEventFlow.collect { event -> + val moduleChanges = event.getChanges(ModuleEntity::class.java) + if (moduleChanges.none()) { + return@collect + } + for (moduleEntity in moduleChanges) { + val entityToFlush = moduleEntity.oldEntity ?: continue + val bridge = event.storageBefore.moduleMap.getDataByEntity(entityToFlush) ?: continue + project.service().asSafely()?.refreshModule(bridge) + } + } + } + } +} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroModuleListener.kt b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroModuleListener.kt deleted file mode 100644 index 1e24c769ead6..000000000000 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroModuleListener.kt +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package org.jetbrains.plugins.groovy.dgm - -import com.intellij.openapi.components.service -import com.intellij.util.asSafely -import com.intellij.workspaceModel.ide.WorkspaceModelChangeListener -import com.intellij.workspaceModel.ide.impl.legacyBridge.module.ModuleManagerBridgeImpl.Companion.moduleMap -import com.intellij.workspaceModel.storage.EntityChange -import com.intellij.workspaceModel.storage.VersionedStorageChange -import com.intellij.workspaceModel.storage.bridgeEntities.ModuleEntity -import org.jetbrains.plugins.groovy.transformations.macro.GroovyMacroRegistryService - -class GroovyMacroModuleListener : WorkspaceModelChangeListener { - - override fun changed(event: VersionedStorageChange) { - val moduleChanges = event.getChanges(ModuleEntity::class.java) - if (moduleChanges.none()) { - return - } - for (moduleEntity in moduleChanges) { - val entityToFlush = moduleEntity.oldEntity ?: continue - val bridge = event.storageBefore.moduleMap.getDataByEntity(entityToFlush) ?: continue - bridge.project.service().asSafely()?.refreshModule(bridge) - } - } -} \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroRegistryServiceImpl.kt b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroRegistryServiceImpl.kt index 94f15c1c5cfd..b1daabbd2c28 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroRegistryServiceImpl.kt +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GroovyMacroRegistryServiceImpl.kt @@ -13,7 +13,7 @@ import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.* import com.intellij.util.asSafely import com.intellij.util.containers.addIfNotNull -import com.intellij.workspaceModel.ide.WorkspaceModelTopics +import kotlinx.coroutines.CoroutineScope import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall @@ -24,12 +24,12 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames import org.jetbrains.plugins.groovy.transformations.macro.GroovyMacroRegistryService import java.util.concurrent.ConcurrentHashMap -class GroovyMacroRegistryServiceImpl(val project: Project) : GroovyMacroRegistryService, Disposable { +class GroovyMacroRegistryServiceImpl(val project: Project, val cs: CoroutineScope) : GroovyMacroRegistryService, Disposable { private val availableModules: MutableMap>>> = ConcurrentHashMap() init { - project.messageBus.connect().subscribe(WorkspaceModelTopics.CHANGED, GroovyMacroModuleListener()) + GroovyAsyncMacroModuleListener(project, cs).subscribe() } override fun resolveAsMacro(call: GrMethodCall): PsiMethod? {