diff --git a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt index 8c08ab9ff77..4a5844c62fc 100644 --- a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt +++ b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt @@ -27,7 +27,9 @@ import kotlin.script.experimental.host.BasicScriptingHost import kotlin.script.experimental.host.FileBasedScriptSource import kotlin.script.experimental.host.toScriptSource import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration +import kotlin.script.experimental.jvm.dependenciesFromCurrentContext import kotlin.script.experimental.jvm.impl.KJvmCompiledScript +import kotlin.script.experimental.jvm.jvm import kotlin.script.experimental.jvm.updateClasspath import kotlin.script.experimental.jvm.util.KotlinJars import kotlin.script.experimental.jvm.util.classpathFromClass @@ -54,6 +56,24 @@ class ScriptingHostTest : TestCase() { Assert.assertEquals(greeting, output2) } + @Test + fun testSourceWithName() { + val greeting = "Hello from script!" + val output = captureOut { + val basicJvmScriptingHost = BasicJvmScriptingHost() + basicJvmScriptingHost.eval( + "println(\"$greeting\")".toScriptSource("name"), + createJvmCompilationConfigurationFromTemplate(basicJvmScriptingHost.hostConfiguration) { + jvm { + dependenciesFromCurrentContext(wholeClasspath = true) + } + }, + createJvmEvaluationConfigurationFromTemplate(basicJvmScriptingHost.hostConfiguration) + ).throwOnFailure() + } + Assert.assertEquals(greeting, output) + } + @Test fun testValueResult() { val resVal = evalScriptWithResult("42") as ResultValue.Value diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt index 68bf0fe4082..58a831b35e8 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition +import org.jetbrains.kotlin.scripting.withCorrectExtension import java.io.File import java.net.URL import kotlin.reflect.KClass @@ -290,7 +291,7 @@ fun SourceCode.getVirtualFile(definition: ScriptDefinition): VirtualFile { val vFile = LocalFileSystem.getInstance().findFileByIoFile(file) if (vFile != null) return vFile } - val scriptName = name ?: "script.${definition.fileExtension}" + val scriptName = withCorrectExtension(name ?: "script", definition.fileExtension) val scriptPath = when (this) { is FileScriptSource -> file.path is ExternalSourceCode -> externalLocation.toString() diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/utils.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/utils.kt new file mode 100644 index 00000000000..f8f994db2b5 --- /dev/null +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/utils.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2019 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.scripting + +import kotlin.script.experimental.api.ScriptCompilationConfiguration +import kotlin.script.experimental.api.SourceCode +import kotlin.script.experimental.api.fileExtension + +fun SourceCode.scriptFileName( + mainScript: SourceCode, + scriptCompilationConfiguration: ScriptCompilationConfiguration +): String { + val mainExtension = scriptCompilationConfiguration[ScriptCompilationConfiguration.fileExtension] + return when { + name != null -> withCorrectExtension(name!!, mainExtension) + mainScript == this -> withCorrectExtension("script", mainExtension) + else -> throw Exception("Unexpected script without name: $this") + } +} + +internal fun withCorrectExtension(name: String, mainExtension: String?): String = + // TODO: consider checking for all registered extensions + if ((mainExtension != null && name.endsWith(".$mainExtension")) || name.endsWith(".kts")) name else "$name.${mainExtension ?: "kts"}" + diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/jvmCompilationUtil.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/jvmCompilationUtil.kt index 8fb01f3340d..00ab1e57b7f 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/jvmCompilationUtil.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/jvmCompilationUtil.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.ScriptsCompilationDependencies import org.jetbrains.kotlin.scripting.resolve.ScriptLightVirtualFile +import org.jetbrains.kotlin.scripting.scriptFileName import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import java.util.* import kotlin.script.experimental.api.* @@ -32,16 +33,6 @@ internal fun makeCompiledModule(generationState: GenerationState) = .associateTo(sortedMapOf()) { it.relativePath to it.asByteArray() } ) -internal fun SourceCode.scriptFileName( - mainScript: SourceCode, - scriptCompilationConfiguration: ScriptCompilationConfiguration -): String = - when { - name != null -> name!! - mainScript == this -> "script.${scriptCompilationConfiguration[ScriptCompilationConfiguration.fileExtension]}" - else -> throw Exception("Unexpected script without name: $this") - } - internal inline fun withMessageCollectorAndDisposable( script: SourceCode? = null, parentMessageCollector: MessageCollector? = null,