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") + } +}