Reload script definitions on compiler settings changes
Provide API to track compiler settings changes
This commit is contained in:
+13
-2
@@ -18,6 +18,8 @@ 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.project.Project
|
||||||
|
import com.intellij.util.messages.Topic
|
||||||
import com.intellij.util.ReflectionUtil
|
import com.intellij.util.ReflectionUtil
|
||||||
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters
|
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters
|
||||||
import com.intellij.util.xmlb.XmlSerializer
|
import com.intellij.util.xmlb.XmlSerializer
|
||||||
@@ -26,7 +28,7 @@ import org.jetbrains.kotlin.cli.common.arguments.*
|
|||||||
import org.jetbrains.kotlin.config.SettingConstants
|
import org.jetbrains.kotlin.config.SettingConstants
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor() : PersistentStateComponent<Element>, Cloneable {
|
abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor(private val project: Project) : PersistentStateComponent<Element>, Cloneable {
|
||||||
@Suppress("LeakingThis", "UNCHECKED_CAST")
|
@Suppress("LeakingThis", "UNCHECKED_CAST")
|
||||||
private var _settings: T = createSettings().frozen() as T
|
private var _settings: T = createSettings().frozen() as T
|
||||||
private set(value) {
|
private set(value) {
|
||||||
@@ -37,8 +39,8 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor()
|
|||||||
get() = _settings
|
get() = _settings
|
||||||
set(value) {
|
set(value) {
|
||||||
validateNewSettings(value)
|
validateNewSettings(value)
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
_settings = value
|
_settings = value
|
||||||
|
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(changer: T.() -> Unit) {
|
fun update(changer: T.() -> Unit) {
|
||||||
@@ -71,6 +73,7 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor()
|
|||||||
}
|
}
|
||||||
XmlSerializer.deserializeInto(this, state)
|
XmlSerializer.deserializeInto(this, state)
|
||||||
}
|
}
|
||||||
|
project.messageBus.syncPublisher(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun clone(): Any = super.clone()
|
public override fun clone(): Any = super.clone()
|
||||||
@@ -88,3 +91,11 @@ abstract class BaseKotlinCompilerSettings<T : Freezable> protected constructor()
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface KotlinCompilerSettingsListener {
|
||||||
|
fun <T> settingsChanged(newSettings: T)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val TOPIC = Topic.create("KotlinCompilerSettingsListener", KotlinCompilerSettingsListener::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.compiler.configuration.BaseKotlinCompilerSettin
|
|||||||
@State(name = KOTLIN_TO_JS_COMPILER_ARGUMENTS_SECTION,
|
@State(name = KOTLIN_TO_JS_COMPILER_ARGUMENTS_SECTION,
|
||||||
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
||||||
Storage(file = KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED)))
|
Storage(file = KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED)))
|
||||||
class Kotlin2JsCompilerArgumentsHolder : BaseKotlinCompilerSettings<K2JSCompilerArguments>() {
|
class Kotlin2JsCompilerArgumentsHolder(project: Project) : BaseKotlinCompilerSettings<K2JSCompilerArguments>(project) {
|
||||||
override fun createSettings() = K2JSCompilerArguments()
|
override fun createSettings() = K2JSCompilerArguments()
|
||||||
|
|
||||||
override fun validateNewSettings(settings: K2JSCompilerArguments) {
|
override fun validateNewSettings(settings: K2JSCompilerArguments) {
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.compiler.configuration.BaseKotlinCompilerSettin
|
|||||||
@State(name = KOTLIN_TO_JVM_COMPILER_ARGUMENTS_SECTION,
|
@State(name = KOTLIN_TO_JVM_COMPILER_ARGUMENTS_SECTION,
|
||||||
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
||||||
Storage(file = KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED)))
|
Storage(file = KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED)))
|
||||||
class Kotlin2JvmCompilerArgumentsHolder : BaseKotlinCompilerSettings<K2JVMCompilerArguments>() {
|
class Kotlin2JvmCompilerArgumentsHolder(project: Project) : BaseKotlinCompilerSettings<K2JVMCompilerArguments>(project) {
|
||||||
override fun createSettings() = K2JVMCompilerArguments()
|
override fun createSettings() = K2JVMCompilerArguments()
|
||||||
|
|
||||||
override fun validateNewSettings(settings: K2JVMCompilerArguments) {
|
override fun validateNewSettings(settings: K2JVMCompilerArguments) {
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.config.getOption
|
|||||||
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
||||||
Storage(file = BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH,
|
Storage(file = BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH,
|
||||||
scheme = StorageScheme.DIRECTORY_BASED)))
|
scheme = StorageScheme.DIRECTORY_BASED)))
|
||||||
class KotlinCommonCompilerArgumentsHolder : BaseKotlinCompilerSettings<CommonCompilerArguments>() {
|
class KotlinCommonCompilerArgumentsHolder(project: Project) : BaseKotlinCompilerSettings<CommonCompilerArguments>(project) {
|
||||||
private fun Element.dropElementIfDefault() {
|
private fun Element.dropElementIfDefault() {
|
||||||
if (DEFAULT_LANGUAGE_VERSION == getAttribute("value")?.value) {
|
if (DEFAULT_LANGUAGE_VERSION == getAttribute("value")?.value) {
|
||||||
detach()
|
detach()
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.config.SettingConstants.KOTLIN_COMPILER_SETTINGS_SEC
|
|||||||
@State(name = KOTLIN_COMPILER_SETTINGS_SECTION,
|
@State(name = KOTLIN_COMPILER_SETTINGS_SECTION,
|
||||||
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
storages = arrayOf(Storage(file = StoragePathMacros.PROJECT_FILE),
|
||||||
Storage(file = BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED)))
|
Storage(file = BaseKotlinCompilerSettings.KOTLIN_COMPILER_SETTINGS_PATH, scheme = StorageScheme.DIRECTORY_BASED)))
|
||||||
class KotlinCompilerSettings : BaseKotlinCompilerSettings<CompilerSettings>() {
|
class KotlinCompilerSettings(project: Project) : BaseKotlinCompilerSettings<CompilerSettings>(project) {
|
||||||
override fun createSettings() = CompilerSettings()
|
override fun createSettings() = CompilerSettings()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,14 +16,28 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.script
|
package org.jetbrains.kotlin.idea.script
|
||||||
|
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
import com.intellij.openapi.project.Project
|
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.KotlinCompilerSettings
|
||||||
|
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettingsListener
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
|
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.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) : ScriptDefinitionContributor {
|
||||||
|
init {
|
||||||
|
project.messageBus.connect().subscribe(KotlinCompilerSettingsListener.TOPIC, object: KotlinCompilerSettingsListener {
|
||||||
|
override fun <T> settingsChanged(newSettings: T) {
|
||||||
|
if (newSettings !is CompilerSettings) return
|
||||||
|
|
||||||
|
project.service<ScriptDefinitionsManager>().reloadDefinitionsBy(this@ScriptTemplatesFromCompilerSettingsProvider)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
override fun getDefinitions(): List<KotlinScriptDefinition> {
|
override fun getDefinitions(): List<KotlinScriptDefinition> {
|
||||||
val kotlinSettings = KotlinCompilerSettings.getInstance(project).settings
|
val kotlinSettings = KotlinCompilerSettings.getInstance(project).settings
|
||||||
return loadDefinitionsFromTemplates(
|
return loadDefinitionsFromTemplates(
|
||||||
|
|||||||
Reference in New Issue
Block a user