Configuration: Do not use read action during conpiler settings loading
It may lead to deadlock (see KT-27298) #KT-27298 Fixed
This commit is contained in:
+3
-3
@@ -17,7 +17,6 @@
|
||||
package org.jetbrains.kotlin.idea.compiler.configuration
|
||||
|
||||
import com.intellij.openapi.components.PersistentStateComponent
|
||||
import com.intellij.openapi.progress.util.BackgroundTaskUtil
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.Comparing
|
||||
import com.intellij.openapi.util.JDOMUtil
|
||||
@@ -29,6 +28,7 @@ import com.intellij.util.xmlb.XmlSerializer
|
||||
import gnu.trove.THashMap
|
||||
import org.jdom.Element
|
||||
import org.jetbrains.kotlin.cli.common.arguments.*
|
||||
import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(private val project: Project) : PersistentStateComponent<Element>, Cloneable {
|
||||
@@ -76,7 +76,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
|
||||
validateNewSettings(value)
|
||||
_settings = value
|
||||
|
||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||
}
|
||||
|
||||
fun update(changer: T.() -> Unit) {
|
||||
@@ -111,7 +111,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
|
||||
XmlSerializer.deserializeInto(this, state)
|
||||
}
|
||||
|
||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||
}
|
||||
|
||||
public override fun clone(): Any = super.clone()
|
||||
|
||||
+3
-3
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.compiler.configuration
|
||||
|
||||
import com.intellij.openapi.components.PersistentStateComponent
|
||||
import com.intellij.openapi.components.StoragePathMacros.PROJECT_CONFIG_DIR
|
||||
import com.intellij.openapi.progress.util.BackgroundTaskUtil
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.Comparing
|
||||
import com.intellij.openapi.util.JDOMUtil
|
||||
@@ -31,6 +30,7 @@ import gnu.trove.THashMap
|
||||
import org.jdom.Element
|
||||
import org.jetbrains.kotlin.cli.common.arguments.*
|
||||
import org.jetbrains.kotlin.config.SettingConstants
|
||||
import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(private val project: Project) : PersistentStateComponent<Element>, Cloneable {
|
||||
@@ -78,7 +78,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
|
||||
validateNewSettings(value)
|
||||
_settings = value
|
||||
|
||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||
}
|
||||
|
||||
fun update(changer: T.() -> Unit) {
|
||||
@@ -113,7 +113,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
|
||||
XmlSerializer.deserializeInto(this, state)
|
||||
}
|
||||
|
||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||
}
|
||||
|
||||
public override fun clone(): Any = super.clone()
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea
|
||||
|
||||
import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.util.messages.Topic
|
||||
|
||||
fun <L> Project.syncPublisherWithDisposeCheck(topic: Topic<L>) =
|
||||
if (isDisposed) throw ProcessCanceledException() else messageBus.syncPublisher(topic)
|
||||
Reference in New Issue
Block a user