From fac49df177931de672d58924c126a7f6203a9e3f Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Tue, 1 Oct 2019 15:44:29 +0300 Subject: [PATCH] Invoke in CompilerSettingsListeners in invokeLater script templates that are loaded from compiler settings are subscribed on this topic. When ScriptTemplatesFromCompilerSettingsProvider invokes KotlinCompilerSettings.getInstance, deadlock may happen if those settings aren't initialized yet. ^KT-25373 --- .../compiler/configuration/BaseKotlinCompilerSettings.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt index 231e33bd31b..6ec219a5af6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.compiler.configuration +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.project.Project import com.intellij.openapi.util.Comparing @@ -76,7 +77,9 @@ abstract class BaseKotlinCompilerSettings protected constructor(p validateNewSettings(value) _settings = value - project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) + ApplicationManager.getApplication().invokeLater { + project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) + } } fun update(changer: T.() -> Unit) { @@ -111,7 +114,9 @@ abstract class BaseKotlinCompilerSettings protected constructor(p XmlSerializer.deserializeInto(this, state) } - project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) + ApplicationManager.getApplication().invokeLater { + project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) + } } public override fun clone(): Any = super.clone()