Add appropriate script extension to the source name, if not provided

#KT-31704 fixed
This commit is contained in:
Ilya Chernikov
2019-09-05 17:30:17 +02:00
parent 92778cc5b5
commit 45f5c42a53
4 changed files with 50 additions and 11 deletions
@@ -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<SimpleScript>(basicJvmScriptingHost.hostConfiguration) {
jvm {
dependenciesFromCurrentContext(wholeClasspath = true)
}
},
createJvmEvaluationConfigurationFromTemplate<SimpleScript>(basicJvmScriptingHost.hostConfiguration)
).throwOnFailure()
}
Assert.assertEquals(greeting, output)
}
@Test
fun testValueResult() {
val resVal = evalScriptWithResult("42") as ResultValue.Value
@@ -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()
@@ -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"}"
@@ -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<String, ByteArray>()) { 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 <T> withMessageCollectorAndDisposable(
script: SourceCode? = null,
parentMessageCollector: MessageCollector? = null,