scripting: PsiModificationStamp add virtual file modification stamp

This commit is contained in:
Sergey Rostov
2019-11-06 13:13:41 +03:00
committed by Natalia Selezneva
parent 789ad23e8d
commit 2499c42ac4
3 changed files with 39 additions and 7 deletions
@@ -5,8 +5,11 @@
package org.jetbrains.kotlin.idea.core.script.configuration.cache package org.jetbrains.kotlin.idea.core.script.configuration.cache
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.configuration.utils.getKtFile
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import kotlin.script.experimental.api.ScriptDiagnostic import kotlin.script.experimental.api.ScriptDiagnostic
@@ -52,8 +55,36 @@ interface CachedConfigurationInputs {
override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean = false override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean = false
} }
data class PsiModificationStamp(val modificationStamp: Long) : CachedConfigurationInputs { data class PsiModificationStamp(
val fileModificationStamp: Long,
val psiModificationStamp: Long
) : CachedConfigurationInputs {
override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean = override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean =
ktFile?.modificationStamp == modificationStamp get(project, file, ktFile) == this
companion object {
fun get(project: Project, file: VirtualFile, ktFile: KtFile?): PsiModificationStamp {
val actualKtFile = project.getKtFile(file, ktFile)
return PsiModificationStamp(
file.modificationStamp,
actualKtFile?.modificationStamp ?: 0
)
}
}
}
data class SourceContentsStamp(val source: String) : CachedConfigurationInputs {
override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean =
get(project, file, ktFile) == this
companion object {
fun get(project: Project, file: VirtualFile, ktFile: KtFile?): SourceContentsStamp {
val text = runReadAction {
FileDocumentManager.getInstance().getDocument(file)!!.text
}
return SourceContentsStamp(text)
}
}
} }
} }
@@ -82,8 +82,8 @@ class GradleScriptConfigurationLoader(project: Project) : DefaultScriptConfigura
} }
} }
override fun getInputsStamp(file: KtFile): CachedConfigurationInputs { override fun getInputsStamp(virtualFile: VirtualFile, file: KtFile): CachedConfigurationInputs {
return getGradleScriptInputsStamp(project, file.virtualFile, file) ?: super.getInputsStamp(file) return getGradleScriptInputsStamp(project, virtualFile, file) ?: super.getInputsStamp(virtualFile, file)
} }
} }
@@ -41,7 +41,7 @@ open class DefaultScriptConfigurationLoader(val project: Project) : ScriptConfig
debug(file) { "start dependencies loading" } debug(file) { "start dependencies loading" }
val inputs = getInputsStamp(file) val inputs = getInputsStamp(virtualFile, file)
val scriptingApiResult = try { val scriptingApiResult = try {
refineScriptCompilationConfiguration( refineScriptCompilationConfiguration(
KtFileScriptSource(file), scriptDefinition, file.project KtFileScriptSource(file), scriptDefinition, file.project
@@ -65,6 +65,7 @@ open class DefaultScriptConfigurationLoader(val project: Project) : ScriptConfig
return true return true
} }
protected open fun getInputsStamp(file: KtFile): CachedConfigurationInputs = protected open fun getInputsStamp(virtualFile: VirtualFile, file: KtFile): CachedConfigurationInputs {
CachedConfigurationInputs.PsiModificationStamp(file.modificationStamp) return CachedConfigurationInputs.PsiModificationStamp.get(project, virtualFile, file)
}
} }