diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt index 3eaea1863d4..8c26226500a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt @@ -38,6 +38,7 @@ val KOTLIN_CONSOLE_KEY = Key.create("kotlin.console") /** * Tested in OutOfBlockModificationTestGenerated */ +// BUNCH: 193 class KotlinCodeBlockModificationListener( modificationTracker: PsiModificationTracker, project: Project, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 index c0567b3377a..1d6a1c08358 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 @@ -39,6 +39,7 @@ val KOTLIN_CONSOLE_KEY = Key.create("kotlin.console") /** * Tested in OutOfBlockModificationTestGenerated */ + // BUNCH: 193 class KotlinCodeBlockModificationListener(project: Project) : PsiTreeChangePreprocessor { private val treeAspect: TreeAspect = TreeAspect.getInstance(project) diff --git a/idea/idea-gradle-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeABICompatibilityChecker.kt b/idea/idea-gradle-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeABICompatibilityChecker.kt index 3e353444022..d7939d7c723 100644 --- a/idea/idea-gradle-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeABICompatibilityChecker.kt +++ b/idea/idea-gradle-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativeABICompatibilityChecker.kt @@ -9,7 +9,6 @@ import com.intellij.ProjectTopics import com.intellij.notification.Notification import com.intellij.notification.NotificationType import com.intellij.openapi.Disposable -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.ReadAction.nonBlocking import com.intellij.openapi.project.Project @@ -27,6 +26,8 @@ import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.isGradleLibraryName import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.parseIDELibraryName import org.jetbrains.kotlin.idea.klib.KlibCompatibilityInfo.IncompatibleMetadata +import org.jetbrains.kotlin.idea.util.application.getServiceSafe +import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME @@ -34,6 +35,20 @@ import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME // BUNCH: 192 /** TODO: merge [KotlinNativeABICompatibilityChecker] in the future with [UnsupportedAbiVersionNotificationPanelProvider], KT-34525 */ class KotlinNativeABICompatibilityChecker : StartupActivity { + override fun runActivity(project: Project) { + val service = KotlinNativeABICompatibilityCheckerService.getInstance(project) + project.messageBus.connect().subscribe(ProjectTopics.PROJECT_ROOTS, object : ModuleRootListener { + override fun rootsChanged(event: ModuleRootEvent) { + // run when project roots are changes, e.g. on project import + service.validateKotlinNativeLibraries() + } + }) + + service.validateKotlinNativeLibraries() + } +} + +class KotlinNativeABICompatibilityCheckerService(private val project: Project) { private sealed class LibraryGroup(private val ordinal: Int) : Comparable { @@ -48,34 +63,21 @@ class KotlinNativeABICompatibilityChecker : StartupActivity { object User : LibraryGroup(2) } - private val cachedIncompatibleLibrariesPerProject = mutableMapOf>() + private val cachedIncompatibleLibraries = mutableSetOf() - override fun runActivity(project: Project) { - project.messageBus.connect(project).subscribe(ProjectTopics.PROJECT_ROOTS, object : ModuleRootListener { - override fun rootsChanged(event: ModuleRootEvent) { - // run when project roots are changes, e.g. on project import - validateKotlinNativeLibraries(project) - } - }) - - validateKotlinNativeLibraries(project) - } - - private fun validateKotlinNativeLibraries(project: Project) { - if (ApplicationManager.getApplication().isUnitTestMode || project.isDisposed) - return + internal fun validateKotlinNativeLibraries() { + if (isUnitTestMode() || project.isDisposed) return val backgroundJob: Ref> = Ref() val disposable = Disposable { - cachedIncompatibleLibrariesPerProject.remove(project) backgroundJob.get()?.let(CancellablePromise<*>::cancel) } Disposer.register(project, disposable) backgroundJob.set( nonBlocking> { - val librariesToNotify = getLibrariesToNotifyAbout(project) - prepareNotifications(project, librariesToNotify) + val librariesToNotify = getLibrariesToNotifyAbout() + prepareNotifications(librariesToNotify) } .finishOnUiThread(ModalityState.defaultModalityState()) { notifications -> notifications.forEach { @@ -83,7 +85,7 @@ class KotlinNativeABICompatibilityChecker : StartupActivity { } } .expireWith(project) // cancel job when project is disposed - .coalesceBy(this@KotlinNativeABICompatibilityChecker) // cancel previous job when new one is submitted + .coalesceBy(this@KotlinNativeABICompatibilityCheckerService) // cancel previous job when new one is submitted .withDocumentsCommitted(project) .submit(AppExecutorUtil.getAppExecutorService()) .onProcessed { @@ -92,13 +94,12 @@ class KotlinNativeABICompatibilityChecker : StartupActivity { }) } - private fun getLibrariesToNotifyAbout(project: Project): Map { + private fun getLibrariesToNotifyAbout(): Map { val incompatibleLibraries = getModuleInfosFromIdeaModel(project) .filterIsInstance() .filter { !it.compatibilityInfo.isCompatible } .associateBy { it.libraryRoot } - val cachedIncompatibleLibraries = cachedIncompatibleLibrariesPerProject.computeIfAbsent(project) { mutableSetOf() } val newEntries = if (cachedIncompatibleLibraries.isNotEmpty()) incompatibleLibraries.filterKeys { it !in cachedIncompatibleLibraries } else @@ -110,7 +111,7 @@ class KotlinNativeABICompatibilityChecker : StartupActivity { return newEntries } - private fun prepareNotifications(project: Project, librariesToNotify: Map): List { + private fun prepareNotifications(librariesToNotify: Map): List { if (librariesToNotify.isEmpty()) return emptyList() @@ -222,5 +223,7 @@ class KotlinNativeABICompatibilityChecker : StartupActivity { private val NOTIFICATION_TITLE get() = KotlinGradleNativeBundle.message("error.incompatible.libraries.title") private const val NOTIFICATION_GROUP_ID = "Incompatible Kotlin/Native libraries" + + fun getInstance(project: Project): KotlinNativeABICompatibilityCheckerService = project.getServiceSafe() } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt index b945e3ded59..f606109975d 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/GradleScriptDefinitionsProvider.kt @@ -66,7 +66,7 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD reload() } } - project.messageBus.connect(project).subscribe(GradleSettingsListener.TOPIC, listener) + project.messageBus.connect().subscribe(GradleSettingsListener.TOPIC, listener) } // NOTE: control flow here depends on suppressing exceptions from loadGradleTemplates calls diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/JvmStartupActivity.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/JvmStartupActivity.kt index 90b4d853c12..4870bfbfcd9 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/JvmStartupActivity.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/JvmStartupActivity.kt @@ -19,7 +19,7 @@ import com.intellij.ui.EditorNotifications class JvmStartupActivity : StartupActivity { override fun runActivity(project: Project) { - val connection = project.messageBus.connect(project) + val connection = project.messageBus.connect() connection.subscribe(ProjectTopics.PROJECT_ROOTS, object : ModuleRootListener { override fun rootsChanged(event: ModuleRootEvent) { EditorNotifications.getInstance(project).updateAllNotifications() diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt index 7b6c266babc..c9fa24fc480 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ui/KotlinConfigurationCheckerService.kt @@ -32,7 +32,6 @@ import org.jetbrains.kotlin.idea.configuration.getModulesWithKotlinFiles import org.jetbrains.kotlin.idea.configuration.notifyOutdatedBundledCompilerIfNecessary import org.jetbrains.kotlin.idea.configuration.ui.notifications.notifyKotlinStyleUpdateIfNeeded import org.jetbrains.kotlin.idea.project.getAndCacheLanguageLevelByDependencies -import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils import org.jetbrains.kotlin.idea.util.application.getServiceSafe import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import java.util.concurrent.Callable @@ -46,7 +45,7 @@ class KotlinConfigurationCheckerStartupActivity : StartupActivity { NotificationDisplayType.STICKY_BALLOON, true ) - val connection = project.messageBus.connect(project) + val connection = project.messageBus.connect() connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { notifyOutdatedBundledCompilerIfNecessary(project) }) diff --git a/idea/resources/META-INF/native.xml b/idea/resources/META-INF/native.xml index 620ed18ed14..7a98dd3fab2 100644 --- a/idea/resources/META-INF/native.xml +++ b/idea/resources/META-INF/native.xml @@ -3,5 +3,6 @@ + diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index 2f25b58a4ee..e101170edd2 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -11,7 +11,7 @@ - + diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt index 1406daf0ecf..89d4602d584 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectComponent.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.idea.util.ProgressIndicatorUtils.runUnderDisposeAwar class KotlinMigrationProjectComponent : StartupActivity { override fun runActivity(project: Project) { - val connection = project.messageBus.connect(project) + val connection = project.messageBus.connect() connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { runUnderDisposeAwareIndicator(project) { KotlinMigrationProjectService.getInstance(project).onImportFinished() diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt index 0ffa7461191..f800f703bda 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetSettingsProviderImpl.kt @@ -22,7 +22,7 @@ class KotlinFacetSettingsProviderImpl(private val project: Project) : KotlinFace } init { - project.messageBus.connect(project).subscribe( + project.messageBus.connect().subscribe( ProjectTopics.PROJECT_ROOTS, object : ModuleRootListener { override fun rootsChanged(event: ModuleRootEvent) { diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt index 71e88678629..b3db2f8da60 100644 --- a/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt @@ -20,7 +20,7 @@ class LibraryEffectiveKindProviderImpl(project: Project) : LibraryEffectiveKindP } init { - project.messageBus.connect(project).subscribe( + project.messageBus.connect().subscribe( ProjectTopics.PROJECT_ROOTS, object : ModuleRootListener { override fun rootsChanged(event: ModuleRootEvent) {