From 661a2626f35cbc013c97de0b12bf1cd893ca8b7a Mon Sep 17 00:00:00 2001 From: Andrei Klunnyi Date: Thu, 16 Feb 2023 12:25:41 +0100 Subject: [PATCH] KT-56632 Script configuration isn't loaded for embedded code snippets From now on we load script configurations for embedded Kotlin code snippets. Potentially this might lead to an extra load during a file analysis. IDEA side test for the change is here: `HighlightingTestGenerated.Uncategorized#testKotlinInJavaInjection` ^KT-56632 fixed --- .../scripting/definitions/definitions.kt | 22 +++++++++++++------ .../definitions/dynamicConfigurations.kt | 14 ------------ .../scripting/resolve/LazyScriptDescriptor.kt | 12 +++++----- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt index 839d64bb625..826341537a9 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/definitions.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.definitions import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.ide.highlighter.JavaFileType +import com.intellij.injected.editor.VirtualFileWindow import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.fileTypes.FileTypeRegistry import com.intellij.openapi.project.Project @@ -61,19 +62,26 @@ fun VirtualFile.findScriptDefinition(project: Project): ScriptDefinition? { return findScriptDefinition(project, VirtualFileScriptSource(this)) } -fun findScriptDefinition(project: Project, script: SourceCode): ScriptDefinition? { +fun findScriptDefinition(project: Project, script: SourceCode): ScriptDefinition { val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null ?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.") return scriptDefinitionProvider.findDefinition(script) ?: scriptDefinitionProvider.getDefaultDefinition() } -fun VirtualFile.isNonScript(): Boolean = - isDirectory || - extension == KotlinFileType.EXTENSION || - extension == JavaFileType.INSTANCE.defaultExtension || - extension == JavaClassFileType.INSTANCE.defaultExtension || - !this.isKotlinFileType() +fun VirtualFile.isNonScript(): Boolean = when (this) { + is VirtualFileWindow -> { + // This file is an embedded Kotlin code snippet. + !this.isKotlinFileType() + } + else -> { + isDirectory || + extension == KotlinFileType.EXTENSION || + extension == JavaFileType.INSTANCE.defaultExtension || + extension == JavaClassFileType.INSTANCE.defaultExtension || + !this.isKotlinFileType() + } +} private fun VirtualFile.isKotlinFileType(): Boolean { if (extension == KotlinParserDefinition.STD_SCRIPT_SUFFIX) return true diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt index de135e28930..9481f00bacb 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt @@ -5,24 +5,10 @@ package org.jetbrains.kotlin.scripting.definitions -import com.intellij.psi.PsiFile -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult -import kotlin.script.experimental.api.ScriptCompilationConfiguration import kotlin.script.experimental.api.ScriptDiagnostic import kotlin.script.experimental.api.valueOr -fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? { - return if (isScript()) { - val provider = ScriptDependenciesProvider.getInstance(project) - // Ignoring the error here, assuming that it will be reported elsewhere anyway (this is important scenario in IDE) - provider?.getScriptConfiguration(this)?.configuration - ?: findScriptDefinition()?.compilationConfiguration - } else { - null - } -} - private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure -> val singleCause = failure.reports.singleOrNull { it.severity == ScriptDiagnostic.Severity.ERROR } if (singleCause != null) diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt index ea99a1b3f75..1de07187e06 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt @@ -36,10 +36,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope import org.jetbrains.kotlin.resolve.source.toSourceElement -import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition -import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider -import org.jetbrains.kotlin.scripting.definitions.ScriptPriorities -import org.jetbrains.kotlin.scripting.definitions.findScriptCompilationConfiguration +import org.jetbrains.kotlin.scripting.definitions.* import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.typeUtil.isNothing @@ -121,7 +118,12 @@ class LazyScriptDescriptor( override fun getPriority() = priority val scriptCompilationConfiguration: () -> ScriptCompilationConfiguration = resolveSession.storageManager.createLazyValue { - scriptInfo.script.containingKtFile.findScriptCompilationConfiguration() + run { + val containingFile = scriptInfo.script.containingKtFile + val provider = ScriptDependenciesProvider.getInstance(containingFile.project) + provider?.getScriptConfiguration(containingFile)?.configuration + ?: containingFile.findScriptDefinition()?.compilationConfiguration + } ?: throw IllegalArgumentException("Unable to find script compilation configuration for the script ${scriptInfo.script.containingFile}") }