提交 09ea4116 编写于 作者: I Ilya Chernikov 提交者: Space

Implement forced script configuration reloading API for plugins

#KT-43288 fixed
上级 2673261b
......@@ -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
)
......
......@@ -38,6 +38,10 @@
interface="kotlin.script.experimental.intellij.ScriptDefinitionsProvider"
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"
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
area="IDEA_PROJECT"/>
......@@ -98,6 +102,8 @@
<scriptDefinitionsProvider id="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"/>
<scriptAdditionalIdeaDependenciesProvider implementation="org.jetbrains.kotlin.idea.scratch.ScratchAdditionalIdeaDependenciesProvider"/>
......
/*
* 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
/*
* 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")
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册