Pass provided script configuration to refining code

when script compilation configuration refinement
happening during parsing, the updated configuration
passed to the script compiler/REPL compile function
is now used.
#KT-44580 fixed
This commit is contained in:
Ilya Chernikov
2021-02-08 21:47:20 +01:00
committed by Space
parent 6dd331d7e8
commit ef4fa3381d
8 changed files with 82 additions and 18 deletions
@@ -13,6 +13,7 @@ import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.valueOrNull
import kotlin.script.experimental.dependencies.ScriptDependencies
@@ -35,6 +36,11 @@ open class ScriptDependenciesProvider constructor(
open fun getScriptConfigurationResult(file: KtFile): ScriptCompilationConfigurationResult? = null
// TODO: consider fixing implementations and removing default implementation
open fun getScriptConfigurationResult(
file: KtFile, providedConfiguration: ScriptCompilationConfiguration?
): ScriptCompilationConfigurationResult? = getScriptConfigurationResult(file)
open fun getScriptConfiguration(file: KtFile): ScriptCompilationConfigurationWrapper? = getScriptConfigurationResult(file)?.valueOrNull()
companion object {
@@ -103,7 +103,7 @@ class ScriptLightVirtualFile(name: String, private val _path: String?, text: Str
override fun getPath(): String = _path ?: if (parent != null) parent.path + "/" + name else name
override fun getCanonicalPath(): String? = path
override fun getCanonicalPath() = path
}
abstract class ScriptCompilationConfigurationWrapper(val script: SourceCode) {
@@ -187,8 +187,8 @@ abstract class ScriptCompilationConfigurationWrapper(val script: SourceCode) {
override val configuration: ScriptCompilationConfiguration?
get() {
val legacy = legacyDependencies ?: return null
return definition?.compilationConfiguration?.let {
ScriptCompilationConfiguration(it) {
return definition?.compilationConfiguration?.let { config ->
ScriptCompilationConfiguration(config) {
updateClasspath(legacy.classpath)
defaultImports.append(legacy.imports)
importScripts.append(legacy.scripts.map { FileScriptSource(it) })
@@ -221,13 +221,14 @@ typealias ScriptCompilationConfigurationResult = ResultWithDiagnostics<ScriptCom
fun refineScriptCompilationConfiguration(
script: SourceCode,
definition: ScriptDefinition,
project: Project
project: Project,
providedConfiguration: ScriptCompilationConfiguration? = null // if null - take from definition
): ScriptCompilationConfigurationResult {
// TODO: add location information on refinement errors
val ktFileSource = script.toKtFileSource(definition, project)
val legacyDefinition = definition.asLegacyOrNull<KotlinScriptDefinition>()
if (legacyDefinition == null) {
val compilationConfiguration = definition.compilationConfiguration
val compilationConfiguration = providedConfiguration ?: definition.compilationConfiguration
val collectedData =
runReadAction {
getScriptCollectedData(ktFileSource.ktFile, compilationConfiguration, project, definition.contextClassLoader)