From c64ba5065548032ed42138fb2da39e21dc45c2d1 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 1 Apr 2020 14:14:18 +0200 Subject: [PATCH] Abstract script compiled module implementation used in saving/caching removes classloading problem when main-kts is loaded from a CL without scripting compiler. Also relax dependencies collection on saving to a jar and hide redundant logging. Running main.kts script via a run configuration works now. #KT-37765 fixed --- .../experimental/jvmhost/test/ScriptingHostTest.kt | 4 ++-- .../script/experimental/jvmhost/jvmScriptSaving.kt | 11 ++++------- .../experimental/jvm/impl/KJvmCompiledModule.kt | 4 ++++ .../ScriptiDefinitionsFromClasspathDiscoverySource.kt | 2 +- ...eInMemory.kt => KJvmCompiledModuleInMemoryImpl.kt} | 4 ++-- .../compiler/plugin/impl/jvmCompilationUtil.kt | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) rename plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/{KJvmCompiledModuleInMemory.kt => KJvmCompiledModuleInMemoryImpl.kt} (74%) 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 bfabd3e5889..d2a62c1d95c 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 @@ -8,7 +8,7 @@ package kotlin.script.experimental.jvmhost.test import junit.framework.TestCase import kotlinx.coroutines.runBlocking import org.jetbrains.kotlin.scripting.compiler.plugin.impl.CompiledScriptClassLoader -import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory +import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemoryImpl import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.ClassVisitor import org.jetbrains.org.objectweb.asm.Opcodes @@ -348,7 +348,7 @@ class ScriptingHostTest : TestCase() { assertTrue(compiledScript is ResultWithDiagnostics.Success) val jvmCompiledScript = compiledScript.valueOrNull()!! as KJvmCompiledScript - val jvmCompiledModule = jvmCompiledScript.compiledModule as KJvmCompiledModuleInMemory + val jvmCompiledModule = jvmCompiledScript.compiledModule as KJvmCompiledModuleInMemoryImpl val bytes = jvmCompiledModule.compilerOutputFiles["SavedScript.class"]!! var classFileVersion: Int? = null diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptSaving.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptSaving.kt index 0ba47e6a611..2a44a1cad0f 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptSaving.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptSaving.kt @@ -5,7 +5,6 @@ package kotlin.script.experimental.jvmhost -import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory import org.jetbrains.kotlin.utils.KotlinPaths import java.io.File import java.io.FileOutputStream @@ -14,11 +13,9 @@ import java.util.jar.JarOutputStream import java.util.jar.Manifest import kotlin.script.experimental.api.* import kotlin.script.experimental.jvm.JvmDependency -import kotlin.script.experimental.jvm.impl.KJvmCompiledScript -import kotlin.script.experimental.jvm.impl.copyWithoutModule -import kotlin.script.experimental.jvm.impl.scriptMetadataPath -import kotlin.script.experimental.jvm.impl.toBytes +import kotlin.script.experimental.jvm.impl.* import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext +import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContextOrNull // TODO: generate execution code (main) @@ -57,11 +54,11 @@ fun KJvmCompiledScript<*>.saveToJar(outputJar: File) { ?.filterIsInstance() ?.flatMap { it.classpath } .orEmpty() - val dependenciesForMain = scriptCompilationClasspathFromContext( + val dependenciesForMain = scriptCompilationClasspathFromContextOrNull( KotlinPaths.Jar.ScriptingLib.baseName, KotlinPaths.Jar.ScriptingJvmLib.baseName, classLoader = this::class.java.classLoader, wholeClasspath = false - ) + ) ?: emptyList() val dependencies = (dependenciesFromScript + dependenciesForMain).distinct() FileOutputStream(outputJar).use { fileStream -> val manifest = Manifest() diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/KJvmCompiledModule.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/KJvmCompiledModule.kt index 19e779eb647..1293d80e4f4 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/KJvmCompiledModule.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/KJvmCompiledModule.kt @@ -15,6 +15,10 @@ interface KJvmCompiledModule { fun createClassLoader(baseClassLoader: ClassLoader?): ClassLoader } +interface KJvmCompiledModuleInMemory : KJvmCompiledModule { + val compilerOutputFiles: Map +} + class KJvmCompiledModuleFromClassPath(val classpath: Collection) : KJvmCompiledModule { override fun createClassLoader(baseClassLoader: ClassLoader?): ClassLoader = diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt index 37cc462fafc..10135840370 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/ScriptiDefinitionsFromClasspathDiscoverySource.kt @@ -341,7 +341,7 @@ private fun loadScriptDefinition( ScriptDefinition.FromLegacyTemplate(hostConfiguration, cls.kotlin) } messageReporter( - ScriptDiagnostic.Severity.INFO, + ScriptDiagnostic.Severity.DEBUG, "Added script definition $template to configuration: name = ${def.name}" ) return def diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmCompiledModuleInMemory.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmCompiledModuleInMemoryImpl.kt similarity index 74% rename from plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmCompiledModuleInMemory.kt rename to plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmCompiledModuleInMemoryImpl.kt index a0f97925f07..cf3eb4745d7 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmCompiledModuleInMemory.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmCompiledModuleInMemoryImpl.kt @@ -6,9 +6,9 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl import java.io.Serializable -import kotlin.script.experimental.jvm.impl.KJvmCompiledModule +import kotlin.script.experimental.jvm.impl.KJvmCompiledModuleInMemory -class KJvmCompiledModuleInMemory(val compilerOutputFiles: Map) : KJvmCompiledModule, +class KJvmCompiledModuleInMemoryImpl(override val compilerOutputFiles: Map) : KJvmCompiledModuleInMemory, Serializable { override fun createClassLoader(baseClassLoader: ClassLoader?): ClassLoader = 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 6a2ac4e4faa..81bf3dfd417 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 @@ -28,7 +28,7 @@ import kotlin.script.experimental.host.getMergedScriptText import kotlin.script.experimental.jvm.impl.KJvmCompiledScript internal fun makeCompiledModule(generationState: GenerationState) = - KJvmCompiledModuleInMemory( + KJvmCompiledModuleInMemoryImpl( generationState.factory.asList() .associateTo(sortedMapOf()) { it.relativePath to it.asByteArray() } )