Fix deadlock in ScriptTemplatesFromCompilerSettingsProvider

^KT-25373 Fixed
This commit is contained in:
Natalia Selezneva
2018-07-11 11:00:24 +03:00
parent 7bf2cd8054
commit d241c092e2
3 changed files with 25 additions and 7 deletions
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.idea.compiler.configuration package org.jetbrains.kotlin.idea.compiler.configuration
import com.intellij.openapi.application.ApplicationManager
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.project.Project import com.intellij.openapi.project.Project
import com.intellij.util.messages.Topic
import com.intellij.util.ReflectionUtil import com.intellij.util.ReflectionUtil
import com.intellij.util.messages.Topic
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters
import com.intellij.util.xmlb.XmlSerializer import com.intellij.util.xmlb.XmlSerializer
import org.jdom.Element import org.jdom.Element
@@ -40,7 +41,10 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
set(value) { set(value) {
validateNewSettings(value) validateNewSettings(value)
_settings = value _settings = value
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
ApplicationManager.getApplication().invokeLater {
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
}
} }
fun update(changer: T.() -> Unit) { fun update(changer: T.() -> Unit) {
@@ -73,7 +77,10 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
} }
XmlSerializer.deserializeInto(this, state) XmlSerializer.deserializeInto(this, state)
} }
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
ApplicationManager.getApplication().invokeLater {
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
}
} }
public override fun clone(): Any = super.clone() public override fun clone(): Any = super.clone()
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.compiler.configuration package org.jetbrains.kotlin.idea.compiler.configuration
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.util.messages.Topic import com.intellij.util.messages.Topic
@@ -38,7 +39,10 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
set(value) { set(value) {
validateNewSettings(value) validateNewSettings(value)
_settings = value _settings = value
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
ApplicationManager.getApplication().invokeLater {
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
}
} }
fun update(changer: T.() -> Unit) { fun update(changer: T.() -> Unit) {
@@ -71,7 +75,10 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(p
} }
XmlSerializer.deserializeInto(this, state) XmlSerializer.deserializeInto(this, state)
} }
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
ApplicationManager.getApplication().invokeLater {
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
}
} }
public override fun clone(): Any = super.clone() public override fun clone(): Any = super.clone()
@@ -26,7 +26,11 @@ import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplates
import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.KotlinScriptDefinition
import java.io.File import java.io.File
class ScriptTemplatesFromCompilerSettingsProvider(private val project: Project) : ScriptDefinitionContributor { class ScriptTemplatesFromCompilerSettingsProvider(
private val project: Project,
private val compilerSettings: KotlinCompilerSettings
) : ScriptDefinitionContributor {
init { init {
project.messageBus.connect().subscribe(KotlinCompilerSettingsListener.TOPIC, object : KotlinCompilerSettingsListener { project.messageBus.connect().subscribe(KotlinCompilerSettingsListener.TOPIC, object : KotlinCompilerSettingsListener {
override fun <T> settingsChanged(newSettings: T) { override fun <T> settingsChanged(newSettings: T) {
@@ -38,7 +42,7 @@ class ScriptTemplatesFromCompilerSettingsProvider(private val project: Project)
} }
override fun getDefinitions(): List<KotlinScriptDefinition> { override fun getDefinitions(): List<KotlinScriptDefinition> {
val kotlinSettings = KotlinCompilerSettings.getInstance(project).settings val kotlinSettings = compilerSettings.settings
return if (kotlinSettings.scriptTemplates.isBlank()) emptyList() return if (kotlinSettings.scriptTemplates.isBlank()) emptyList()
else loadDefinitionsFromTemplates( else loadDefinitionsFromTemplates(
templateClassNames = kotlinSettings.scriptTemplates.split(',', ' '), templateClassNames = kotlinSettings.scriptTemplates.split(',', ' '),