From 195a90d3339746d4163de87708d127055a45f65b Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 6 Apr 2020 13:12:56 +0200 Subject: [PATCH] Cleanup warnings in scripting code --- .../common/messages/XmlMessageRenderer.java | 2 +- libraries/scripting/common/build.gradle.kts | 1 + .../experimental/util/propertiesCollection.kt | 73 ++++++++++--------- .../jsr223/test/KotlinJsr223ScriptEngineIT.kt | 2 +- .../experimental/jvmhost/test/CachingTest.kt | 24 +++--- .../jvmhost/test/ScriptingHostTest.kt | 6 +- .../jvmhost/repl/legacyReplEvaluation.kt | 2 +- .../kotlin/mainKts/test/mainKtsIT.kt | 2 +- .../kotlin/mainKts/test/mainKtsTest.kt | 1 + .../jetbrains/kotlin/mainKts/impl/resolve.kt | 2 +- .../org/jetbrains/kotlin/mainKts/scriptDef.kt | 2 +- ...KotlinJsr223ScriptEngineFactoryExamples.kt | 33 +++++---- .../kotlin/script/util/ScriptUtilIT.kt | 50 +++++++------ .../resolve/refineCompilationConfiguration.kt | 4 +- .../compiler/plugin/configuration.kt | 4 - .../compiler/plugin/pluginRegisrar.kt | 6 +- .../plugin/repl/GenericReplCompiler.kt | 1 + .../messages/IdeDiagnosticMessageHolder.kt | 2 +- .../compiler/plugin/ScriptProviderTest.kt | 35 +++++---- .../plugin/ScriptingCompilerPluginTest.kt | 1 - 20 files changed, 134 insertions(+), 119 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java index a4633f55d38..dc9e0292f48 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java @@ -45,7 +45,7 @@ public class XmlMessageRenderer implements MessageRenderer { } private static String e(String str) { - return StringUtil.escapeXml(str); + return StringUtil.escapeXmlEntities(str); } @Override diff --git a/libraries/scripting/common/build.gradle.kts b/libraries/scripting/common/build.gradle.kts index 7a2b4aa3c79..b7cc3404f2f 100644 --- a/libraries/scripting/common/build.gradle.kts +++ b/libraries/scripting/common/build.gradle.kts @@ -9,6 +9,7 @@ jvmTarget = "1.6" dependencies { compile(kotlinStdlib()) compile(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core")) { isTransitive = false } + compileOnly(project(":kotlin-reflect-api")) testCompile(commonDep("junit")) } diff --git a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt index 2b8a3e70abb..3972845544a 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt @@ -50,19 +50,19 @@ open class PropertiesCollection(protected var properties: Map, Any?> = em } @Suppress("UNCHECKED_CAST") - operator fun get(key: PropertiesCollection.Key): T? = + operator fun get(key: Key): T? = (properties[key] ?: if (properties.containsKey(key)) null else key.getDefaultValue(this)) as? T @Suppress("UNCHECKED_CAST") - fun getNoDefault(key: PropertiesCollection.Key): T? = + fun getNoDefault(key: Key): T? = properties[key]?.let { it as T } - fun containsKey(key: PropertiesCollection.Key): Boolean = + fun containsKey(key: Key): Boolean = properties.containsKey(key) fun entries(): Set, Any?>> = properties.entries - val notTransientData: Map, Any?> get() = properties.filterKeys { it !is TransientKey<*>} + val notTransientData: Map, Any?> get() = properties.filterKeys { it !is TransientKey<*> } fun isEmpty(): Boolean = properties.isEmpty() @@ -97,159 +97,162 @@ open class PropertiesCollection(protected var properties: Map, Any?> = em open class Builder(baseProperties: Iterable = emptyList()) { - val data: MutableMap, Any?> = LinkedHashMap, Any?>().apply { + val data: MutableMap, Any?> = LinkedHashMap, Any?>().apply { baseProperties.forEach { putAll(it.properties) } } // generic for all properties - operator fun PropertiesCollection.Key.invoke(v: T) { + operator fun Key.invoke(v: T) { data[this] = v } - fun PropertiesCollection.Key.put(v: T) { + fun Key.put(v: T) { data[this] = v } - fun PropertiesCollection.Key.putIfNotNull(v: T?) { + fun Key.putIfNotNull(v: T?) { if (v != null) { data[this] = v } } - fun PropertiesCollection.Key.replaceOnlyDefault(v: T?) { + fun Key.replaceOnlyDefault(v: T?) { if (!data.containsKey(this) || data[this] == this.getDefaultValue(PropertiesCollection(data))) { data[this] = v } } - fun PropertiesCollection.Key.update(body: (T?) -> T?) { - putIfNotNull(body(data[this]?.let { it as T })) + fun Key.update(body: (T?) -> T?) { + putIfNotNull(body(data[this]?.let { + @Suppress("UNCHECKED_CAST") + it as T + })) } // generic for lists - fun PropertiesCollection.Key>.putIfAny(vals: Iterable?) { + fun Key>.putIfAny(vals: Iterable?) { if (vals?.any() == true) { data[this] = if (vals is List) vals else vals.toList() } } - operator fun PropertiesCollection.Key>.invoke(vararg vals: T) { + operator fun Key>.invoke(vararg vals: T) { append(vals.asIterable()) } // generic for maps: @JvmName("putIfAny_map") - fun PropertiesCollection.Key>.putIfAny(vals: Iterable>?) { + fun Key>.putIfAny(vals: Iterable>?) { if (vals?.any() == true) { data[this] = vals.toMap() } } - fun PropertiesCollection.Key>.putIfAny(vals: Map?) { + fun Key>.putIfAny(vals: Map?) { if (vals?.isNotEmpty() == true) { data[this] = vals } } - operator fun PropertiesCollection.Key>.invoke(vararg vs: Pair) { + operator fun Key>.invoke(vararg vs: Pair) { append(vs.asIterable()) } // for strings and list of strings that could be converted from other types @JvmName("invoke_string_fqn_from_reflected_class") - operator fun PropertiesCollection.Key.invoke(kclass: KClass<*>) { + operator fun Key.invoke(kclass: KClass<*>) { data[this] = kclass.java.name } @JvmName("invoke_string_list_fqn_from_reflected_class") - operator fun PropertiesCollection.Key>.invoke(vararg kclasses: KClass<*>) { + operator fun Key>.invoke(vararg kclasses: KClass<*>) { append(kclasses.map { it.java.name }) } // for KotlinType: - operator fun PropertiesCollection.Key.invoke(kclass: KClass<*>) { + operator fun Key.invoke(kclass: KClass<*>) { data[this] = KotlinType(kclass) } - operator fun PropertiesCollection.Key.invoke(ktype: KType) { + operator fun Key.invoke(ktype: KType) { data[this] = KotlinType(ktype) } - operator fun PropertiesCollection.Key.invoke(fqname: String) { + operator fun Key.invoke(fqname: String) { data[this] = KotlinType(fqname) } // for list of KotlinTypes - operator fun PropertiesCollection.Key>.invoke(vararg classes: KClass<*>) { + operator fun Key>.invoke(vararg classes: KClass<*>) { append(classes.map { KotlinType(it) }) } - operator fun PropertiesCollection.Key>.invoke(vararg types: KType) { + operator fun Key>.invoke(vararg types: KType) { append(types.map { KotlinType(it) }) } - operator fun PropertiesCollection.Key>.invoke(vararg fqnames: String) { + operator fun Key>.invoke(vararg fqnames: String) { append(fqnames.map { KotlinType(it) }) } // for map of generic keys to KotlinTypes: @JvmName("invoke_kotlintype_map_from_kclass") - operator fun PropertiesCollection.Key>.invoke(vararg classes: Pair>) { + operator fun Key>.invoke(vararg classes: Pair>) { append(classes.map { (k, v) -> k to KotlinType(v) }) } @JvmName("invoke_kotlintype_map_from_ktype") - operator fun PropertiesCollection.Key>.invoke(vararg types: Pair) { + operator fun Key>.invoke(vararg types: Pair) { append(types.map { (k, v) -> k to KotlinType(v) }) } @JvmName("invoke_kotlintype_map_from_fqname") - operator fun PropertiesCollection.Key>.invoke(vararg fqnames: Pair) { + operator fun Key>.invoke(vararg fqnames: Pair) { append(fqnames.map { (k, v) -> k to KotlinType(v) }) } // direct manipulation - public - for usage in inline dsl methods and for extending dsl - operator fun set(key: PropertiesCollection.Key, value: T) { + operator fun set(key: Key, value: T) { data[key] = value } - fun reset(key: PropertiesCollection.Key) { + fun reset(key: Key) { data.remove(key) } @Suppress("UNCHECKED_CAST") - operator fun get(key: PropertiesCollection.Key): T? = data[key]?.let { it as T } + operator fun get(key: Key): T? = data[key]?.let { it as T } - operator fun PropertiesCollection.Key.invoke(): T? = get(this) + operator fun Key.invoke(): T? = get(this) // appenders to list and map properties @JvmName("appendToList") - fun PropertiesCollection.Key>.append(values: Iterable) { + fun Key>.append(values: Iterable) { val newValues = get(this)?.let { it + values } ?: values.toList() data[this] = newValues } - fun PropertiesCollection.Key>.append(vararg values: V) { + fun Key>.append(vararg values: V) { val newValues = get(this)?.let { it + values } ?: values.toList() data[this] = newValues } - fun PropertiesCollection.Key>.append(values: Map) { + fun Key>.append(values: Map) { val newValues = get(this)?.let { it + values } ?: values data[this] = newValues } @JvmName("appendToMap") - fun PropertiesCollection.Key>.append(values: Iterable>) { + fun Key>.append(values: Iterable>) { val newValues = get(this)?.let { it + values } ?: values.toMap() data[this] = newValues } diff --git a/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt b/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt index 584892fa073..633afacc00f 100644 --- a/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt +++ b/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt @@ -155,7 +155,7 @@ obj // assertThrows(NoSuchMethodException::class.java) { // invocator!!.invokeMethod(res1, "fn", 3) // } - val res3 = invocator!!.invokeMethod(res1, "fn1", 3) + val res3 = invocator.invokeMethod(res1, "fn1", 3) Assert.assertEquals(6, res3) } diff --git a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt index d8053f9f8ed..842f9513d94 100644 --- a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt +++ b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/CachingTest.kt @@ -52,7 +52,7 @@ class CachingTest : TestCase() { fun testFileCache() { withTempDir("scriptingTestCache") { cacheDir -> val cache = FileBasedScriptCache(cacheDir) - Assert.assertTrue(cache.baseDir.listFiles().isEmpty()) + Assert.assertEquals(true, cache.baseDir.listFiles()?.isEmpty()) checkWithCache(cache, simpleScript, simpleScriptExpectedOutput) } @@ -62,7 +62,7 @@ class CachingTest : TestCase() { fun testSimpleImportWithFileCache() { withTempDir("scriptingTestCache") { cacheDir -> val cache = FileBasedScriptCache(cacheDir) - Assert.assertTrue(cache.baseDir.listFiles().isEmpty()) + Assert.assertEquals(true, cache.baseDir.listFiles()?.isEmpty()) checkWithCache( cache, scriptWithImport, scriptWithImportExpectedOutput, @@ -190,9 +190,7 @@ class CachingTest : TestCase() { } } -object Implicit { - val ix = 0 -} +object Implicit private interface ScriptingCacheWithCounters : CompiledJvmScriptsCache { @@ -230,7 +228,7 @@ private class FileBasedScriptCache(val baseDir: File) : ScriptingCacheWithCounte override fun get(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration): CompiledScript? { val file = File(baseDir, uniqueScriptHash(script, scriptCompilationConfiguration)) - return if (!file.exists()) null else file.readCompiledScript(scriptCompilationConfiguration)?.also { retrievedScripts++ } + return if (!file.exists()) null else file.readCompiledScript().also { retrievedScripts++ } } override fun store( @@ -254,11 +252,13 @@ private class FileBasedScriptCache(val baseDir: File) : ScriptingCacheWithCounte private set } -class TestCompiledScriptJarsCache(val baseDir: File) : CompiledScriptJarsCache( - { script, scriptCompilationConfiguration -> - File(baseDir, uniqueScriptHash(script, scriptCompilationConfiguration) + ".jar") - }), ScriptingCacheWithCounters -{ +class TestCompiledScriptJarsCache(val baseDir: File) : + CompiledScriptJarsCache( + { script, scriptCompilationConfiguration -> + File(baseDir, uniqueScriptHash(script, scriptCompilationConfiguration) + ".jar") + } + ), ScriptingCacheWithCounters { + override fun get(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration): CompiledScript? = super.get(script, scriptCompilationConfiguration)?.also { retrievedScripts++ } @@ -289,7 +289,7 @@ internal fun uniqueScriptHash(script: SourceCode, scriptCompilationConfiguration return digestWrapper.digest().toHexString() } -private fun File.readCompiledScript(scriptCompilationConfiguration: ScriptCompilationConfiguration): CompiledScript { +private fun File.readCompiledScript(): CompiledScript { return inputStream().use { fs -> ObjectInputStream(fs).use { it.readObject() as KJvmCompiledScript 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 8d67ca7e8ef..87e70f3776c 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 @@ -379,7 +379,7 @@ class ScriptingHostTest : TestCase() { val res = compiler(script.toScriptSource(), scriptCompilationConfiguration).throwOnFailure() (res as ResultWithDiagnostics.Success).value } - val compiledScriptClass = runBlocking { compiledScript.getClass(null).throwOnFailure().valueOrNull()!! as KClass<*> } + val compiledScriptClass = runBlocking { compiledScript.getClass(null).throwOnFailure().valueOrNull()!! } val classLoader = compiledScriptClass.java.classLoader Assert.assertTrue(classLoader is CompiledScriptClassLoader) @@ -394,8 +394,8 @@ class ScriptingHostTest : TestCase() { Assert.assertNotNull(classAsResourceUrl) Assert.assertNotNull(classAssResourceStream) - val classAsResourceData = classAsResourceUrl.openConnection().getInputStream().readBytes() - val classAsResourceStreamData = classAssResourceStream.readBytes() + val classAsResourceData = classAsResourceUrl!!.openConnection().getInputStream().readBytes() + val classAsResourceStreamData = classAssResourceStream!!.readBytes() Assert.assertArrayEquals(classAsResourceData, classAsResourceStreamData) diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/repl/legacyReplEvaluation.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/repl/legacyReplEvaluation.kt index a9b6b235863..6c72e136709 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/repl/legacyReplEvaluation.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/repl/legacyReplEvaluation.kt @@ -87,7 +87,7 @@ class JvmReplEvaluator( } open class JvmReplEvaluatorState( - scriptEvaluationConfiguration: ScriptEvaluationConfiguration, + @Suppress("UNUSED_PARAMETER") scriptEvaluationConfiguration: ScriptEvaluationConfiguration, override val lock: ReentrantReadWriteLock = ReentrantReadWriteLock() ) : IReplStageState?, Any?>> { override val history: IReplStageHistory?, Any?>> = ReplStageHistoryWithReplace(lock) diff --git a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsIT.kt b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsIT.kt index a8e3f114498..4ac171bb091 100644 --- a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsIT.kt +++ b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsIT.kt @@ -5,12 +5,12 @@ package org.jetbrains.kotlin.mainKts.test -import junit.framework.Assert import org.jetbrains.kotlin.mainKts.COMPILED_SCRIPTS_CACHE_DIR_ENV_VAR import org.jetbrains.kotlin.mainKts.COMPILED_SCRIPTS_CACHE_DIR_PROPERTY import org.jetbrains.kotlin.scripting.compiler.plugin.runWithK2JVMCompiler import org.jetbrains.kotlin.scripting.compiler.plugin.runWithKotlinLauncherScript import org.jetbrains.kotlin.scripting.compiler.plugin.runWithKotlinc +import org.junit.Assert import org.junit.Ignore import org.junit.Test import java.io.File diff --git a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt index 751c7ffcb68..5ee3b6acd4e 100644 --- a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt +++ b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt @@ -141,6 +141,7 @@ class MainKtsTest { DataInputStream(ByteArrayInputStream(scriptClassResource.readBytes())).use { stream -> val header = stream.readInt() if (0xCAFEBABE.toInt() != header) throw IOException("Invalid header class header: $header") + @Suppress("UNUSED_VARIABLE") val minor = stream.readUnsignedShort() val major = stream.readUnsignedShort() Assert.assertTrue(major == 50) diff --git a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/resolve.kt b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/resolve.kt index a3d2e4964ad..ded2ee02b4b 100644 --- a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/resolve.kt +++ b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/resolve.kt @@ -29,7 +29,7 @@ suspend fun resolveFromAnnotations(resolver: ExternalDependenciesResolver, annot return annotations.filterIsInstance(DependsOn::class.java).flatMapSuccess { dep -> val artifactCoordinates = if (dep.value.isNotBlank()) dep.value - else listOf(dep.groupId, dep.artifactId, dep.version).filter { it?.isNotBlank() ?: false }.joinToString(":") + else listOf(dep.groupId, dep.artifactId, dep.version).filter { it.isNotBlank() }.joinToString(":") resolver.resolve(artifactCoordinates) } } diff --git a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt index 5cd5b505724..99fa5706b5e 100644 --- a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt +++ b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt @@ -141,7 +141,7 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler { return resolveResult.onSuccess { resolvedClassPath -> ScriptCompilationConfiguration(context.compilationConfiguration) { - if (resolvedClassPath != null) updateClasspath(resolvedClassPath) + updateClasspath(resolvedClassPath) if (importedSources.isNotEmpty()) importScripts.append(importedSources) if (compileOptions.isNotEmpty()) compilerOptions.append(compileOptions) }.asSuccess() diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineFactoryExamples.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineFactoryExamples.kt index 0658d1608b9..bc8d33d1da5 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineFactoryExamples.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineFactoryExamples.kt @@ -20,33 +20,34 @@ package org.jetbrains.kotlin.script.jsr223 import org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineFactoryBase import org.jetbrains.kotlin.cli.common.repl.ScriptArgsWithTypes -import org.jetbrains.kotlin.script.util.* import javax.script.Bindings import javax.script.ScriptContext import javax.script.ScriptEngine +import kotlin.script.experimental.jvm.util.KotlinJars +import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext class KotlinJsr223JvmLocalScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase() { override fun getScriptEngine(): ScriptEngine = - KotlinJsr223JvmLocalScriptEngine( - this, - scriptCompilationClasspathFromContextOrStlib("kotlin-script-util.jar", wholeClasspath = true), - KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!, - { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) }, - arrayOf(Bindings::class) - ) + KotlinJsr223JvmLocalScriptEngine( + this, + scriptCompilationClasspathFromContext("kotlin-script-util.jar", wholeClasspath = true), + KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!, + { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) }, + arrayOf(Bindings::class) + ) } class KotlinJsr223JvmDaemonLocalEvalScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase() { override fun getScriptEngine(): ScriptEngine = - KotlinJsr223JvmDaemonCompileScriptEngine( - this, - KotlinJars.compilerWithScriptingClasspath, - scriptCompilationClasspathFromContextOrStlib("kotlin-script-util.jar", wholeClasspath = true), - KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!, - { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) }, - arrayOf(Bindings::class) - ) + KotlinJsr223JvmDaemonCompileScriptEngine( + this, + KotlinJars.compilerWithScriptingClasspath, + scriptCompilationClasspathFromContext("kotlin-script-util.jar", wholeClasspath = true), + KotlinStandardJsr223ScriptTemplate::class.qualifiedName!!, + { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) }, + arrayOf(Bindings::class) + ) } diff --git a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt index e188ac75d20..f2f0c5b9339 100644 --- a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt +++ b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt @@ -56,6 +56,7 @@ import kotlin.script.experimental.api.onSuccess import kotlin.script.experimental.api.valueOr import kotlin.script.experimental.host.toScriptSource import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration +import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext const val KOTLIN_JAVA_RUNTIME_JAR = "kotlin-stdlib.jar" @@ -63,12 +64,12 @@ class ScriptUtilIT { companion object { private val argsHelloWorldOutput = -"""Hello, world! + """Hello, world! a1 done """ private val bindingsHelloWorldOutput = -"""Hello, world! + """Hello, world! a1 = 42 done """ @@ -107,8 +108,7 @@ done try { System.setErr(PrintStream(NullOutputStream())) Assert.assertNull(compileScript("args-junit-hello-world.kts", StandardArgsScriptTemplateWithLocalResolving::class)) - } - finally { + } finally { System.setErr(savedErr) } @@ -127,23 +127,28 @@ done val (out, err) = captureOutAndErr { Assert.assertNull(compileScript("args-junit-dynver-error.kts", StandardArgsScriptTemplateWithMavenResolving::class)) } - Assert.assertTrue("Expecting error: unresolved reference: assertThrows, got:\nOUT:\n$out\nERR:\n$err", err.contains("error: unresolved reference: assertThrows")) + Assert.assertTrue( + "Expecting error: unresolved reference: assertThrows, got:\nOUT:\n$out\nERR:\n$err", + err.contains("error: unresolved reference: assertThrows") + ) val scriptClass = compileScript("args-junit-dynver.kts", StandardArgsScriptTemplateWithMavenResolving::class) Assert.assertNotNull(scriptClass) } private fun compileScript( - scriptFileName: String, - scriptTemplate: KClass, - environment: Map? = null, - suppressOutput: Boolean = false + scriptFileName: String, + scriptTemplate: KClass, + environment: Map? = null, + suppressOutput: Boolean = false ): Class<*>? = - compileScriptImpl("libraries/tools/kotlin-script-util/src/test/resources/scripts/" + scriptFileName, - KotlinScriptDefinitionFromAnnotatedTemplate( - scriptTemplate, - environment - ), suppressOutput) + compileScriptImpl( + "libraries/tools/kotlin-script-util/src/test/resources/scripts/$scriptFileName", + KotlinScriptDefinitionFromAnnotatedTemplate( + scriptTemplate, + environment + ), suppressOutput + ) private fun compileScriptImpl( scriptPath: String, @@ -157,9 +162,7 @@ done val rootDisposable = Disposer.newDisposable() try { val configuration = CompilerConfiguration().apply { - scriptCompilationClasspathFromContextOrNull(KOTLIN_JAVA_RUNTIME_JAR)?.let { - addJvmClasspathRoots(it) - } + addJvmClasspathRoots(scriptCompilationClasspathFromContext(KOTLIN_JAVA_RUNTIME_JAR)) put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) addKotlinSourceRoot(scriptPath) @@ -185,7 +188,10 @@ done environment.getSourceFiles().forEach { messageCollector.report(CompilerMessageSeverity.LOGGING, "file: $it -> script def: ${it.findScriptDefinition()?.name}") } - messageCollector.report(CompilerMessageSeverity.LOGGING, "compilation classpath:\n ${environment.configuration.jvmClasspathRoots.joinToString("\n ")}") + messageCollector.report( + CompilerMessageSeverity.LOGGING, + "compilation classpath:\n ${environment.configuration.jvmClasspathRoots.joinToString("\n ")}" + ) val scriptCompiler = ScriptJvmCompilerFromEnvironment(environment) @@ -223,7 +229,7 @@ done } private fun String.linesSplitTrim() = - split('\n','\r').map(String::trim).filter(String::isNotBlank) + split('\n', '\r').map(String::trim).filter(String::isNotBlank) private fun captureOut(body: () -> Unit): String = captureOutAndErr(body).first @@ -247,8 +253,8 @@ done } private class NullOutputStream : OutputStream() { - override fun write(b: Int) { } - override fun write(b: ByteArray) { } - override fun write(b: ByteArray, off: Int, len: Int) { } + override fun write(b: Int) {} + override fun write(b: ByteArray) {} + override fun write(b: ByteArray, off: Int, len: Int) {} } 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 62cc354ce79..4065e5488b2 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 @@ -300,8 +300,7 @@ internal fun makeScriptContents( fun SourceCode.getVirtualFile(definition: ScriptDefinition): VirtualFile { if (this is VirtualFileScriptSource) return virtualFile if (this is KtFileScriptSource) { - val vFile = virtualFile - if (vFile != null) return vFile + return virtualFile } if (this is FileScriptSource) { val vFile = LocalFileSystem.getInstance().findFileByIoFile(file) @@ -351,6 +350,7 @@ fun getScriptCollectedData( val acceptedAnnotations = compilationConfiguration[ScriptCompilationConfiguration.refineConfigurationOnAnnotations]?.flatMap { it.annotations.mapNotNull { ann -> + @Suppress("UNCHECKED_CAST") jvmGetScriptingClass(ann, contextClassLoader, hostConfiguration) as? KClass // TODO errors } }.orEmpty() diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/configuration.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/configuration.kt index 1e06fa2a181..d9a36f5ec97 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/configuration.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/configuration.kt @@ -31,7 +31,3 @@ fun configureScriptDefinitions( configuration.addAll(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS, templatesFromClasspath.toList()) } -fun makeHostConfiguration(project: Project, configuration: CompilerConfiguration): ScriptingHostConfiguration = - ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) { - // TODO: add jdk path and other params if needed - } \ No newline at end of file diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt index 6a59e759c14..f5b55816b8e 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt @@ -30,6 +30,8 @@ import org.jetbrains.kotlin.scripting.extensions.ScriptExtraImportsProviderExten import org.jetbrains.kotlin.scripting.extensions.ScriptingResolveExtension import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import java.net.URLClassLoader +import kotlin.script.experimental.host.ScriptingHostConfiguration +import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration private fun ProjectExtensionDescriptor.registerExtensionIfRequired(project: MockProject, extension: T) { try { @@ -42,7 +44,9 @@ private fun ProjectExtensionDescriptor.registerExtensionIfRequired( class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar { override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) - val hostConfiguration = makeHostConfiguration(project, configuration) + val hostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) { + // TODO: add jdk path and other params if needed + } withClassloadingProblemsReporting(messageCollector) { CompilerConfigurationExtension.registerExtension(project, ScriptingCompilerConfigurationExtension(project, hostConfiguration)) CollectAdditionalSourcesExtension.registerExtension(project, diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/GenericReplCompiler.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/GenericReplCompiler.kt index 0093032cdd4..db73dc484ab 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/GenericReplCompiler.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/GenericReplCompiler.kt @@ -68,6 +68,7 @@ open class GenericReplCompiler( Pair(compilerState.lastLineState!!.psiFile, compilerState.lastLineState!!.errorHolder) } + @Suppress("DEPRECATION") val newDependencies = ScriptDependenciesProvider.getInstance(checker.environment.project)?.getScriptConfiguration(psiFile) ?.legacyDependencies diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/messages/IdeDiagnosticMessageHolder.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/messages/IdeDiagnosticMessageHolder.kt index 023057823b9..472c178879b 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/messages/IdeDiagnosticMessageHolder.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/messages/IdeDiagnosticMessageHolder.kt @@ -34,7 +34,7 @@ class IdeDiagnosticMessageHolder : DiagnosticMessageHolder { reportEntry.setAttribute("severity", diagnostic.severity.toString()) reportEntry.setAttribute("rangeStart", errorRange.startOffset.toString()) reportEntry.setAttribute("rangeEnd", errorRange.endOffset.toString()) - reportEntry.appendChild(errorReport.createTextNode(StringUtil.escapeXml(message))) + reportEntry.appendChild(errorReport.createTextNode(StringUtil.escapeXmlEntities(message))) rootElement.appendChild(reportEntry) } diff --git a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptProviderTest.kt b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptProviderTest.kt index 0645f1d760e..b8de5eb0948 100644 --- a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptProviderTest.kt +++ b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptProviderTest.kt @@ -33,13 +33,15 @@ class ScriptProviderTest { val shadedDef = FakeScriptDefinition(".x.kts") val provider = TestCliScriptDefinitionProvider(standardDef).apply { setScriptDefinitions(listOf(shadedDef, standardDef)) - setScriptDefinitionsSources(listOf( - TestScriptDefinitionSource( - genDefCounter, - ".y.kts", - ".x.kts" + setScriptDefinitionsSources( + listOf( + TestScriptDefinitionSource( + genDefCounter, + ".y.kts", + ".x.kts" + ) ) - )) + ) } Assert.assertEquals(0, genDefCounter.get()) @@ -74,11 +76,10 @@ class ScriptProviderTest { } private open class FakeScriptDefinition(val suffix: String = ".kts") : - ScriptDefinition.FromLegacy(defaultJvmScriptingHostConfiguration, KotlinScriptDefinition(ScriptTemplateWithArgs::class)) -{ + ScriptDefinition.FromLegacy(defaultJvmScriptingHostConfiguration, KotlinScriptDefinition(ScriptTemplateWithArgs::class)) { val matchCounter = AtomicInteger() override fun isScript(script: SourceCode): Boolean { - val path =script.locationId ?: return false + val path = script.locationId ?: return false return path.endsWith(suffix).also { if (it) matchCounter.incrementAndGet() } @@ -89,13 +90,14 @@ private open class FakeScriptDefinition(val suffix: String = ".kts") : } private class TestScriptDefinitionSource(val counter: AtomicInteger, val defGens: Iterable<() -> FakeScriptDefinition>) : - ScriptDefinitionsSource -{ - constructor(counter: AtomicInteger, vararg suffixes: String) : this(counter, suffixes.map { { - FakeScriptDefinition( - it - ) - } }) + ScriptDefinitionsSource { + constructor(counter: AtomicInteger, vararg suffixes: String) : this(counter, suffixes.map { + { + FakeScriptDefinition( + it + ) + } + }) override val definitions: Sequence = sequence { for (gen in defGens) { @@ -106,5 +108,6 @@ private class TestScriptDefinitionSource(val counter: AtomicInteger, val defGens } private class TestCliScriptDefinitionProvider(private val standardDef: ScriptDefinition) : CliScriptDefinitionProvider() { + @Suppress("DEPRECATION", "OverridingDeprecatedMember") override fun getDefaultScriptDefinition(): KotlinScriptDefinition = standardDef.legacyDefinition } \ No newline at end of file diff --git a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt index 5f5a4f6cfa1..738e5928308 100644 --- a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt +++ b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerPluginTest.kt @@ -54,7 +54,6 @@ class ScriptingCompilerPluginTest : TestCase() { paths } - val compilerClasspath = listOf(kotlinPaths.compilerPath) val runtimeClasspath = listOf( kotlinPaths.stdlibPath, kotlinPaths.scriptRuntimePath, kotlinPaths.reflectPath) val scriptingClasspath = listOf("kotlin-scripting-common.jar").map { File(kotlinPaths.libPath, it) }