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
|
package org.jetbrains.kotlin.idea.compiler.configuration
|
||||||
|
|
||||||
import com.intellij.openapi.components.PersistentStateComponent
|
import com.intellij.openapi.components.PersistentStateComponent
|
||||||
import com.intellij.openapi.progress.util.BackgroundTaskUtil
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.Comparing
|
import com.intellij.openapi.util.Comparing
|
||||||
import com.intellij.openapi.util.JDOMUtil
|
import com.intellij.openapi.util.JDOMUtil
|
||||||
@@ -29,6 +28,7 @@ import com.intellij.util.xmlb.XmlSerializer
|
|||||||
import gnu.trove.THashMap
|
import gnu.trove.THashMap
|
||||||
import org.jdom.Element
|
import org.jdom.Element
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.*
|
import org.jetbrains.kotlin.cli.common.arguments.*
|
||||||
|
import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(private val project: Project) : PersistentStateComponent<Element>, Cloneable {
|
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)
|
validateNewSettings(value)
|
||||||
_settings = value
|
_settings = value
|
||||||
|
|
||||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(changer: T.() -> Unit) {
|
fun update(changer: T.() -> Unit) {
|
||||||
@@ -111,7 +111,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
|
|||||||
XmlSerializer.deserializeInto(this, state)
|
XmlSerializer.deserializeInto(this, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun clone(): Any = super.clone()
|
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.PersistentStateComponent
|
||||||
import com.intellij.openapi.components.StoragePathMacros.PROJECT_CONFIG_DIR
|
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.project.Project
|
||||||
import com.intellij.openapi.util.Comparing
|
import com.intellij.openapi.util.Comparing
|
||||||
import com.intellij.openapi.util.JDOMUtil
|
import com.intellij.openapi.util.JDOMUtil
|
||||||
@@ -31,6 +30,7 @@ import gnu.trove.THashMap
|
|||||||
import org.jdom.Element
|
import org.jdom.Element
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.*
|
import org.jetbrains.kotlin.cli.common.arguments.*
|
||||||
import org.jetbrains.kotlin.config.SettingConstants
|
import org.jetbrains.kotlin.config.SettingConstants
|
||||||
|
import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(private val project: Project) : PersistentStateComponent<Element>, Cloneable {
|
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)
|
validateNewSettings(value)
|
||||||
_settings = value
|
_settings = value
|
||||||
|
|
||||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(changer: T.() -> Unit) {
|
fun update(changer: T.() -> Unit) {
|
||||||
@@ -113,7 +113,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
|
|||||||
XmlSerializer.deserializeInto(this, state)
|
XmlSerializer.deserializeInto(this, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun clone(): Any = super.clone()
|
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