diff --git a/compiler/testData/integration/ant/js/verbose/build.log.expected b/compiler/testData/integration/ant/js/verbose/build.log.expected index 5e001a25c86..8d2194b6fe8 100644 --- a/compiler/testData/integration/ant/js/verbose/build.log.expected +++ b/compiler/testData/integration/ant/js/verbose/build.log.expected @@ -4,6 +4,7 @@ Buildfile: [TestData]/build.xml build: [kotlin2js] Compiling [[TestData]/root1] => [[Temp]/out.js] [kotlin2js] logging: using Kotlin home directory [KotlinProjectHome]/dist/kotlinc +[kotlin2js] logging: configure scripting: Added template org.jetbrains.kotlin.mainKts.MainKtsScript from [[CompilerLib]/kotlin-main-kts.jar, [CompilerLib]/kotlin-reflect.jar, [CompilerLib]/kotlin-script-runtime.jar, [CompilerLib]/kotlin-stdlib.jar] [kotlin2js] logging: compiling source files: [TestData]/root1/foo.kt BUILD SUCCESSFUL diff --git a/compiler/testData/integration/ant/jvm/verbose/build.log.expected b/compiler/testData/integration/ant/jvm/verbose/build.log.expected index e145f644e2e..9591d3091af 100644 --- a/compiler/testData/integration/ant/jvm/verbose/build.log.expected +++ b/compiler/testData/integration/ant/jvm/verbose/build.log.expected @@ -5,6 +5,7 @@ build: [kotlinc] Compiling [[TestData]/hello.kt] => [[Temp]/hello.jar] [kotlinc] logging: using Kotlin home directory [KotlinProjectHome]/dist/kotlinc [kotlinc] logging: configuring the compilation environment + [kotlinc] logging: configure scripting: Added template org.jetbrains.kotlin.mainKts.MainKtsScript from [[CompilerLib]/kotlin-main-kts.jar, [CompilerLib]/kotlin-reflect.jar, [CompilerLib]/kotlin-script-runtime.jar, [CompilerLib]/kotlin-stdlib.jar] BUILD SUCCESSFUL Total time: [time] diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/AutoloadedScriptDefinitions.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/AutoloadedScriptDefinitions.kt new file mode 100644 index 00000000000..fa447565d4d --- /dev/null +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/AutoloadedScriptDefinitions.kt @@ -0,0 +1,46 @@ +/* + * 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.definitions + +import java.io.File +import kotlin.script.experimental.host.ScriptingHostConfiguration +import kotlin.script.experimental.jvm.impl.tryGetResourcePathForClass +import kotlin.script.experimental.jvm.util.matchMaybeVersionedFile + +class AutoloadedScriptDefinitions( + private val hostConfiguration: ScriptingHostConfiguration, + private val baseClassloader: ClassLoader, + private val messageReporter: MessageReporter +) : ScriptDefinitionsSource { + + private val basePath by lazy(LazyThreadSafetyMode.PUBLICATION) { + tryGetResourcePathForClass(AutoloadedScriptDefinitions::class.java)?.parentFile?.takeIf { it.isDirectory } ?: File(".") + } + + override val definitions: Sequence = sequence { + val mainKtsJars = basePath.listFiles { f: File -> + MAIN_KTS_JARS.any { expected -> + f.matchMaybeVersionedFile(expected) && f.extension == "jar" + } + }?.toList() + if (mainKtsJars != null && mainKtsJars.size >= MAIN_KTS_JARS.size) { + yieldAll( + loadScriptTemplatesFromClasspath( + listOf("org.jetbrains.kotlin.mainKts.MainKtsScript"), + mainKtsJars, + emptyList(), + baseClassloader, + hostConfiguration, + messageReporter + ) + ) + } + } + + companion object { + private val MAIN_KTS_JARS = listOf("kotlin-main-kts", "kotlin-stdlib", "kotlin-script-runtime", "kotlin-reflect") + } +} \ No newline at end of file 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 a9b0373dd58..12ff6496230 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 @@ -311,7 +311,7 @@ private fun loadScriptDefinition( if (def != null) { messageReporter( ScriptDiagnostic.Severity.DEBUG, - "Configure scripting: Added template $templateClassName from ${classpathWithLoader.classpath}" + "Configure scripting: Added template $templateClassName from ${classpathWithLoader.classpath.sorted()}" ) return def } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt index f100954fbc1..328db81c517 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt @@ -18,10 +18,7 @@ import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDefinitionProvider import org.jetbrains.kotlin.scripting.compiler.plugin.impl.reporter import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys -import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition -import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider -import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource -import org.jetbrains.kotlin.scripting.definitions.getEnvironment +import org.jetbrains.kotlin.scripting.definitions.* import java.io.File import kotlin.script.experimental.host.ScriptingHostConfiguration @@ -70,12 +67,15 @@ class ScriptingCompilerConfigurationExtension( ) } - configuration.add( + configuration.addAll( ScriptingConfigurationKeys.SCRIPT_DEFINITIONS_SOURCES, - ScriptDefinitionsFromClasspathDiscoverySource( - configuration.jvmClasspathRoots, - hostConfiguration, - messageCollector.reporter + listOf( + ScriptDefinitionsFromClasspathDiscoverySource( + configuration.jvmClasspathRoots, + hostConfiguration, + messageCollector.reporter + ), + AutoloadedScriptDefinitions(hostConfiguration, this::class.java.classLoader, messageCollector.reporter) ) )