Implement forced script configuration reloading API for plugins
#KT-43288 fixed
This commit is contained in:
+5
-4
@@ -444,20 +444,21 @@ abstract class DefaultScriptingSupportBase(val manager: CompositeScriptConfigura
|
|||||||
/**
|
/**
|
||||||
* Load new configuration and suggest to apply it (only if it is changed)
|
* Load new configuration and suggest to apply it (only if it is changed)
|
||||||
*/
|
*/
|
||||||
fun ensureUpToDatedConfigurationSuggested(file: KtFile, skipNotification: Boolean = false) {
|
fun ensureUpToDatedConfigurationSuggested(file: KtFile, skipNotification: Boolean = false, forceSync: Boolean = false) {
|
||||||
reloadIfOutOfDate(file, skipNotification)
|
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
|
if (!ScriptDefinitionsManager.getInstance(project).isReady()) return
|
||||||
|
|
||||||
manager.updater.update {
|
manager.updater.update {
|
||||||
val virtualFile = file.originalFile.virtualFile
|
val virtualFile = file.originalFile.virtualFile
|
||||||
if (virtualFile != null) {
|
if (virtualFile != null) {
|
||||||
val state = cache[virtualFile]
|
val state = cache[virtualFile]
|
||||||
if (state == null || !state.isUpToDate(project, virtualFile, file)) {
|
if (state == null || forceSync || !state.isUpToDate(project, virtualFile, file)) {
|
||||||
reloadOutOfDateConfiguration(
|
reloadOutOfDateConfiguration(
|
||||||
file,
|
file,
|
||||||
|
forceSync = forceSync,
|
||||||
isFirstLoad = state == null,
|
isFirstLoad = state == null,
|
||||||
skipNotification = skipNotification
|
skipNotification = skipNotification
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -38,6 +38,10 @@
|
|||||||
interface="kotlin.script.experimental.intellij.ScriptDefinitionsProvider"
|
interface="kotlin.script.experimental.intellij.ScriptDefinitionsProvider"
|
||||||
area="IDEA_PROJECT" dynamic="true"/>
|
area="IDEA_PROJECT" dynamic="true"/>
|
||||||
|
|
||||||
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.ideScriptConfigurationControlFacade"
|
||||||
|
interface="kotlin.script.experimental.intellij.IdeScriptConfigurationControlFacade"
|
||||||
|
area="IDEA_PROJECT" dynamic="true"/>
|
||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.syntheticScopeProviderExtension"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.syntheticScopeProviderExtension"
|
||||||
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
|
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
|
||||||
area="IDEA_PROJECT"/>
|
area="IDEA_PROJECT"/>
|
||||||
@@ -98,6 +102,8 @@
|
|||||||
<scriptDefinitionsProvider id="MainKtsScriptDefinitionSource"
|
<scriptDefinitionsProvider id="MainKtsScriptDefinitionSource"
|
||||||
implementation="org.jetbrains.kotlin.idea.script.MainKtsScriptDefinitionSource"/>
|
implementation="org.jetbrains.kotlin.idea.script.MainKtsScriptDefinitionSource"/>
|
||||||
|
|
||||||
|
<ideScriptConfigurationControlFacade implementation="org.jetbrains.kotlin.idea.script.DefaultIdeScriptingConfigurationFacade"/>
|
||||||
|
|
||||||
<scratchFileLanguageProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.scratch.KtScratchFileLanguageProvider"/>
|
<scratchFileLanguageProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.scratch.KtScratchFileLanguageProvider"/>
|
||||||
<scriptAdditionalIdeaDependenciesProvider implementation="org.jetbrains.kotlin.idea.scratch.ScratchAdditionalIdeaDependenciesProvider"/>
|
<scriptAdditionalIdeaDependenciesProvider implementation="org.jetbrains.kotlin.idea.scratch.ScratchAdditionalIdeaDependenciesProvider"/>
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -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<IdeScriptConfigurationControlFacade> =
|
||||||
|
ExtensionPointName.create("org.jetbrains.kotlin.ideScriptConfigurationControlFacade")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user