diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt index 5dd5da6f2b0..c63ab722fab 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDependenciesUpdater.kt @@ -29,6 +29,7 @@ import com.intellij.openapi.vfs.newvfs.events.VFileEvent import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.core.script.dependencies.FromFileAttributeScriptDependenciesLoader import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptDependenciesLoader +import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings import org.jetbrains.kotlin.psi.NotNullableUserDataProperty import org.jetbrains.kotlin.script.ScriptDefinitionProvider import org.jetbrains.kotlin.script.findScriptDefinition @@ -94,6 +95,10 @@ class ScriptDependenciesUpdater( } } requestUpdate(modifiedScripts) + + if (KotlinScriptingSettings.getInstance(project).isAutoReloadEnabled) { + reloadModifiedScripts() + } } }) } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt index 95c9e5afcea..b29ce24ba19 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.core.script.dependencies import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import kotlinx.coroutines.experimental.* +import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings import org.jetbrains.kotlin.idea.core.util.cancelOnDisposal import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.LegacyResolverWrapper @@ -31,12 +32,14 @@ class AsyncScriptDependenciesLoader( lastRequest?.cancel() lastRequest = sendRequest().stampBy(file) - runBlocking { - lastRequest?.job?.actualJob?.join() + if (shouldUseBackgroundThread()) { + runBlocking { + lastRequest?.job?.actualJob?.join() + } } } - override fun shouldUseBackgroundThread() = true + override fun shouldUseBackgroundThread() = KotlinScriptingSettings.getInstance(project).isAutoReloadEnabled private var lastRequest: ModStampedRequest? = null diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/settings/KotlinScriptingSettings.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/settings/KotlinScriptingSettings.kt new file mode 100644 index 00000000000..a2392d1fe01 --- /dev/null +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/settings/KotlinScriptingSettings.kt @@ -0,0 +1,34 @@ +/* + * 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.core.script.settings + +import com.intellij.openapi.components.PersistentStateComponent +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.components.State +import com.intellij.openapi.components.Storage +import com.intellij.openapi.project.Project +import com.intellij.util.xmlb.XmlSerializerUtil + +@State( + name = "KotlinScriptingSettings", + storages = [Storage("kotlinScripting.xml")] +) +class KotlinScriptingSettings : PersistentStateComponent { + var isAutoReloadEnabled = false + + override fun loadState(element: KotlinScriptingSettings) { + XmlSerializerUtil.copyBean(state, this) + } + + override fun getState(): KotlinScriptingSettings { + return this + } + + companion object { + fun getInstance(project: Project): KotlinScriptingSettings = + ServiceManager.getService(project, KotlinScriptingSettings::class.java) + } +} \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index cc091ba7f81..593040e1841 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -357,6 +357,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.172 b/idea/src/META-INF/plugin.xml.172 index 4be1b96e24f..d77603e379f 100644 --- a/idea/src/META-INF/plugin.xml.172 +++ b/idea/src/META-INF/plugin.xml.172 @@ -352,6 +352,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.173 b/idea/src/META-INF/plugin.xml.173 index 7c1abbfa176..1a34f7f8814 100644 --- a/idea/src/META-INF/plugin.xml.173 +++ b/idea/src/META-INF/plugin.xml.173 @@ -352,6 +352,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.182 b/idea/src/META-INF/plugin.xml.182 index 1a195c5fe12..f07a91cf965 100644 --- a/idea/src/META-INF/plugin.xml.182 +++ b/idea/src/META-INF/plugin.xml.182 @@ -358,6 +358,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.as31 b/idea/src/META-INF/plugin.xml.as31 index 89ac2aa7f1b..65fc7315ad7 100644 --- a/idea/src/META-INF/plugin.xml.as31 +++ b/idea/src/META-INF/plugin.xml.as31 @@ -352,6 +352,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.as32 b/idea/src/META-INF/plugin.xml.as32 index 83f2ae3d3ab..af637b018f0 100644 --- a/idea/src/META-INF/plugin.xml.as32 +++ b/idea/src/META-INF/plugin.xml.as32 @@ -352,6 +352,9 @@ + + diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form index 7d89bc8c52a..054d47b6c4f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.form @@ -142,7 +142,7 @@ - + @@ -155,18 +155,9 @@ - - - - - - - - - - + @@ -174,7 +165,7 @@ - + @@ -183,12 +174,30 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java index 5efbbec5b25..be76913f856 100644 --- a/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java +++ b/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants; import org.jetbrains.kotlin.config.*; import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.PluginStartupComponent; +import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings; import org.jetbrains.kotlin.idea.facet.DescriptionListCellRenderer; import org.jetbrains.kotlin.idea.facet.KotlinFacet; import org.jetbrains.kotlin.idea.util.application.ApplicationUtilsKt; @@ -88,6 +89,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co private ThreeStateCheckBox keepAliveCheckBox; private JCheckBox enablePreciseIncrementalCheckBox; private JComboBox moduleKindComboBox; + private JCheckBox scriptDependenciesAutoReload; private JTextField scriptTemplatesField; private JTextField scriptTemplatesClasspathField; private JLabel scriptTemplatesLabel; @@ -426,6 +428,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co !getSelectedAPIVersionView().equals(KotlinFacetSettingsKt.getApiVersionView(commonCompilerArguments)) || !coroutineSupportComboBox.getSelectedItem().equals(CoroutineSupport.byCompilerArguments(commonCompilerArguments)) || !additionalArgsOptionsField.getText().equals(compilerSettings.getAdditionalArguments()) || + isModified(scriptDependenciesAutoReload, getScriptingSettings().isAutoReloadEnabled()) || isModified(scriptTemplatesField, compilerSettings.getScriptTemplates()) || isModified(scriptTemplatesClasspathField, compilerSettings.getScriptTemplatesClasspath()) || isModified(copyRuntimeFilesCheckBox, compilerSettings.getCopyJsLibraryFiles()) || @@ -519,6 +522,8 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co compilerSettings.setCopyJsLibraryFiles(copyRuntimeFilesCheckBox.isSelected()); compilerSettings.setOutputDirectoryForJsLibraryFiles(outputDirectory.getText()); + getScriptingSettings().setAutoReloadEnabled(scriptDependenciesAutoReload.isSelected()); + if (compilerWorkspaceSettings != null) { compilerWorkspaceSettings.setPreciseIncrementalEnabled(enablePreciseIncrementalCheckBox.isSelected()); @@ -564,6 +569,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co apiVersionComboBox.setSelectedItem(KotlinFacetSettingsKt.getApiVersionView(commonCompilerArguments)); coroutineSupportComboBox.setSelectedItem(CoroutineSupport.byCompilerArguments(commonCompilerArguments)); additionalArgsOptionsField.setText(compilerSettings.getAdditionalArguments()); + scriptDependenciesAutoReload.setSelected(getScriptingSettings().isAutoReloadEnabled()); scriptTemplatesField.setText(compilerSettings.getScriptTemplates()); scriptTemplatesClasspathField.setText(compilerSettings.getScriptTemplatesClasspath()); copyRuntimeFilesCheckBox.setSelected(compilerSettings.getCopyJsLibraryFiles()); @@ -699,6 +705,11 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co this.compilerSettings = compilerSettings; } + @NotNull + private KotlinScriptingSettings getScriptingSettings() { + return KotlinScriptingSettings.Companion.getInstance(project); + } + private void createUIComponents() { // Workaround: ThreeStateCheckBox doesn't send suitable notification on state change // TODO: replace with PropertyChangerListener after fix is available in IDEA