diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt
index 64c5d118d1a..2cb03d42260 100644
--- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt
+++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt
@@ -444,20 +444,21 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura
/**
* Load new configuration and suggest to apply it (only if it is changed)
*/
- fun ensureUpToDatedConfigurationSuggested(file: KtFile, skipNotification: Boolean = false) {
- reloadIfOutOfDate(file, skipNotification)
+ fun ensureUpToDatedConfigurationSuggested(file: KtFile, skipNotification: Boolean = false, forceSync: Boolean = false) {
+ reloadIfOutOfDate(file, skipNotification, forceSync)
}
- private fun reloadIfOutOfDate(file: KtFile, skipNotification: Boolean = false) {
+ private fun reloadIfOutOfDate(file: KtFile, skipNotification: Boolean = false, forceSync: Boolean = false) {
if (!ScriptDefinitionsManager.getInstance(project).isReady()) return
manager.updater.update {
val virtualFile = file.originalFile.virtualFile
if (virtualFile != null) {
val state = cache[virtualFile]
- if (state == null || !state.isUpToDate(project, virtualFile, file)) {
+ if (state == null || forceSync || !state.isUpToDate(project, virtualFile, file)) {
reloadOutOfDateConfiguration(
file,
+ forceSync = forceSync,
isFirstLoad = state == null,
skipNotification = skipNotification
)
diff --git a/idea/resources/META-INF/extensions/ide.xml b/idea/resources/META-INF/extensions/ide.xml
index ef26c494b9a..2c665b65c8a 100644
--- a/idea/resources/META-INF/extensions/ide.xml
+++ b/idea/resources/META-INF/extensions/ide.xml
@@ -38,6 +38,10 @@
interface="kotlin.script.experimental.intellij.ScriptDefinitionsProvider"
area="IDEA_PROJECT" dynamic="true"/>
+
+
@@ -98,6 +102,8 @@
+
+
diff --git a/idea/src/org/jetbrains/kotlin/idea/script/DefaultIdeScriptingConfigurationFacade.kt b/idea/src/org/jetbrains/kotlin/idea/script/DefaultIdeScriptingConfigurationFacade.kt
new file mode 100644
index 00000000000..e5663f02870
--- /dev/null
+++ b/idea/src/org/jetbrains/kotlin/idea/script/DefaultIdeScriptingConfigurationFacade.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * 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.script
+
+import com.intellij.psi.PsiFile
+import org.jetbrains.kotlin.idea.core.script.configuration.DefaultScriptingSupport
+import org.jetbrains.kotlin.psi.KtFile
+import kotlin.script.experimental.intellij.IdeScriptConfigurationControlFacade
+
+class DefaultIdeScriptingConfigurationFacade : IdeScriptConfigurationControlFacade {
+ override fun reloadScriptConfiguration(scriptFile: PsiFile, updateEditorWithoutNotification: Boolean) {
+
+ (scriptFile as? KtFile) ?: error("Should be called with script KtFile, but called with $scriptFile")
+ DefaultScriptingSupport.getInstance(scriptFile.project)
+ .ensureUpToDatedConfigurationSuggested(
+ scriptFile,
+ skipNotification = updateEditorWithoutNotification,
+ forceSync = true
+ )
+ }
+}
\ No newline at end of file
diff --git a/libraries/scripting/intellij/src/kotlin/script/experimental/intellij/scriptConfigurationTools.kt b/libraries/scripting/intellij/src/kotlin/script/experimental/intellij/scriptConfigurationTools.kt
new file mode 100644
index 00000000000..3b68b924539
--- /dev/null
+++ b/libraries/scripting/intellij/src/kotlin/script/experimental/intellij/scriptConfigurationTools.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package kotlin.script.experimental.intellij
+
+import com.intellij.openapi.extensions.ExtensionPointName
+import com.intellij.openapi.extensions.Extensions
+import com.intellij.psi.PsiFile
+
+/**
+ * Force reloading the script definition associated with the passed [scriptFile] in the Kotlin plugin
+ *
+ * [updateEditorWithoutNotification] controls whether the update of the indexes and highlighting of the script files
+ * based on the reloaded definition should be reloaded automatically or using notification and explicit reload action
+ */
+fun reloadScriptConfiguration(scriptFile: PsiFile, updateEditorWithoutNotification: Boolean = false) {
+ val extensions = Extensions.getArea(scriptFile.project).getExtensionPoint(IdeScriptConfigurationControlFacade.EP_NAME).extensions
+ for (extension in extensions) {
+ extension.reloadScriptConfiguration(scriptFile, updateEditorWithoutNotification)
+ }
+}
+
+/**
+ * The IntelliJ extension point needed for the [reloadScriptConfiguration] function. Should not be used directly.
+ */
+interface IdeScriptConfigurationControlFacade {
+
+ fun reloadScriptConfiguration(scriptFile: PsiFile, updateEditorWithoutNotification: Boolean = false)
+
+ companion object {
+ val EP_NAME: ExtensionPointName =
+ ExtensionPointName.create("org.jetbrains.kotlin.ideScriptConfigurationControlFacade")
+ }
+}