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 a25f53fb2e3..11685b2fdc4 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 @@ -18,6 +18,8 @@ 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.project.Project +import com.intellij.util.messages.Topic import com.intellij.util.ReflectionUtil import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters import com.intellij.util.xmlb.XmlSerializer @@ -26,7 +28,7 @@ import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.config.SettingConstants import kotlin.reflect.KClass -abstract class BaseKotlinCompilerSettings protected constructor() : PersistentStateComponent, Cloneable { +abstract class BaseKotlinCompilerSettings protected constructor(private val project: Project) : PersistentStateComponent, Cloneable { @Suppress("LeakingThis", "UNCHECKED_CAST") private var _settings: T = createSettings().frozen() as T private set(value) { @@ -37,8 +39,8 @@ abstract class BaseKotlinCompilerSettings protected constructor() get() = _settings set(value) { validateNewSettings(value) - @Suppress("UNCHECKED_CAST") _settings = value + project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) } fun update(changer: T.() -> Unit) { @@ -71,6 +73,7 @@ abstract class BaseKotlinCompilerSettings protected constructor() } XmlSerializer.deserializeInto(this, state) } + project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) } public override fun clone(): Any = super.clone() @@ -88,3 +91,11 @@ abstract class BaseKotlinCompilerSettings protected constructor() ) } } + +interface KotlinCompilerSettingsListener { + fun settingsChanged(newSettings: T) + + companion object { + val TOPIC = Topic.create("KotlinCompilerSettingsListener", KotlinCompilerSettingsListener::class.java) + } +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.kt index 5291682b369..eb22f4611cb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JsCompilerArgumentsHolder.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.compiler.configuration.BaseKotlinCompilerSettin @State(name = KOTLIN_TO_JS_COMPILER_ARGUMENTS_SECTION, storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE), Storage(file = KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED))) -class Kotlin2JsCompilerArgumentsHolder : BaseKotlinCompilerSettings() { +class Kotlin2JsCompilerArgumentsHolder(project: Project) : BaseKotlinCompilerSettings(project) { override fun createSettings() = K2JSCompilerArguments() override fun validateNewSettings(settings: K2JSCompilerArguments) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.kt index baea905b605..9a008248b7f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/Kotlin2JvmCompilerArgumentsHolder.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.compiler.configuration.BaseKotlinCompilerSettin @State(name = KOTLIN_TO_JVM_COMPILER_ARGUMENTS_SECTION, storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE), Storage(file = KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED))) -class Kotlin2JvmCompilerArgumentsHolder : BaseKotlinCompilerSettings() { +class Kotlin2JvmCompilerArgumentsHolder(project: Project) : BaseKotlinCompilerSettings(project) { override fun createSettings() = K2JVMCompilerArguments() override fun validateNewSettings(settings: K2JVMCompilerArguments) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt index 51eba87b218..be30cc8b42c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCommonCompilerArgumentsHolder.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.config.getOption storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE), Storage(file = BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED))) -class KotlinCommonCompilerArgumentsHolder : BaseKotlinCompilerSettings() { +class KotlinCommonCompilerArgumentsHolder(project: Project) : BaseKotlinCompilerSettings(project) { private fun Element.dropElementIfDefault() { if (DEFAULT_LANGUAGE_VERSION == getAttribute("value")?.value) { detach() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerSettings.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerSettings.kt index 9a43c283cd3..d6e02b4ecff 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerSettings.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerSettings.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.config.SettingConstants.KOTLIN_COMPILER_SETTINGS_SEC @State(name = KOTLIN_COMPILER_SETTINGS_SECTION, storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE), Storage(file = BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED))) -class KotlinCompilerSettings : BaseKotlinCompilerSettings() { +class KotlinCompilerSettings(project: Project) : BaseKotlinCompilerSettings(project) { override fun createSettings() = CompilerSettings() diff --git a/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt b/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt index 1f270ebc628..4dae1541df6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/scriptTemplatesFromCompilerSettings.kt @@ -16,14 +16,28 @@ package org.jetbrains.kotlin.idea.script +import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.config.CompilerSettings import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings +import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettingsListener import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor +import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplates import org.jetbrains.kotlin.script.KotlinScriptDefinition import java.io.File class ScriptTemplatesFromCompilerSettingsProvider(private val project: Project) : ScriptDefinitionContributor { + init { + project.messageBus.connect().subscribe(KotlinCompilerSettingsListener.TOPIC, object: KotlinCompilerSettingsListener { + override fun settingsChanged(newSettings: T) { + if (newSettings !is CompilerSettings) return + + project.service().reloadDefinitionsBy(this@ScriptTemplatesFromCompilerSettingsProvider) + } + }) + } + override fun getDefinitions(): List { val kotlinSettings = KotlinCompilerSettings.getInstance(project).settings return loadDefinitionsFromTemplates(