[Scripting] Fix obtaining virtual file for getting compilation configuration

This commit is contained in:
Ilya Muradyan
2022-08-31 21:20:07 +02:00
committed by teamcity
parent a76de14026
commit b801d963a1
2 changed files with 27 additions and 14 deletions
@@ -19,20 +19,34 @@ import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.resolve.KtFileScriptSource import org.jetbrains.kotlin.scripting.resolve.KtFileScriptSource
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
import kotlin.script.experimental.api.SourceCode import kotlin.script.experimental.api.SourceCode
inline fun <T> runReadAction(crossinline runnable: () -> T): T { inline fun <T> runReadAction(crossinline runnable: () -> T): T {
return ApplicationManager.getApplication().runReadAction(Computable { runnable() }) return ApplicationManager.getApplication().runReadAction(Computable { runnable() })
} }
fun PsiFile.findScriptDefinition(): ScriptDefinition? { @OptIn(ExperimentalContracts::class)
fun PsiFile.isScript(): Boolean {
contract {
returns(true) implies (this@isScript is KtFile)
}
// Do not use psiFile.script, see comments in findScriptDefinition // Do not use psiFile.script, see comments in findScriptDefinition
if (this !is KtFile/* || this.script == null*/) return null if (this !is KtFile/* || this.script == null*/) return false
val virtualFile = this.virtualFile ?: this.originalFile.virtualFile ?: return null // Sometimes - i.e. when event system is disabled for a view provider - requesting
if (virtualFile.isNonScript()) return null // virtual file directly from the viewProvider is the only way of obtaining it
val virtualFile = virtualFile ?: originalFile.virtualFile ?: viewProvider.virtualFile
if (virtualFile.isNonScript()) return false
return findScriptDefinition(project, KtFileScriptSource(this)) return true
}
fun PsiFile.findScriptDefinition(): ScriptDefinition? {
return if (isScript()) findScriptDefinition(project, KtFileScriptSource(this))
else null
} }
@Deprecated("Use PsiFile.findScriptDefinition() instead") @Deprecated("Use PsiFile.findScriptDefinition() instead")
@@ -13,15 +13,14 @@ import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.valueOr import kotlin.script.experimental.api.valueOr
fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? { fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? {
// Do not use psiFile.script, see comments in findScriptDefinition return if (isScript()) {
if (this !is KtFile/* || this.script == null*/) return null val provider = ScriptDependenciesProvider.getInstance(project)
val file = virtualFile ?: originalFile.virtualFile ?: return null // Ignoring the error here, assuming that it will be reported elsewhere anyway (this is important scenario in IDE)
if (file.isNonScript()) return null provider?.getScriptConfiguration(this)?.configuration
?: findScriptDefinition()?.compilationConfiguration
val provider = ScriptDependenciesProvider.getInstance(project) } else {
// Ignoring the error here, assuming that it will be reported elsewhere anyway (this is important scenario in IDE) null
return provider?.getScriptConfiguration(this)?.configuration }
?: findScriptDefinition()?.compilationConfiguration
} }
private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure -> private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure ->