diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt index 5ac49188405..50f687037b4 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.idea.caches.project.getScriptRelatedModuleInfo import org.jetbrains.kotlin.idea.util.ProjectRootsUtil.isInContent import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.script.* -import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContextOrStlib import org.jetbrains.kotlin.scripting.compiler.plugin.KotlinScriptDefinitionAdapterFromNewAPI import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull @@ -58,6 +57,7 @@ import kotlin.script.experimental.host.configurationDependencies import kotlin.script.experimental.host.createCompilationConfigurationFromTemplate import kotlin.script.experimental.jvm.JvmDependency import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration +import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContextOrStlib import kotlin.script.experimental.location.ScriptExpectedLocation import kotlin.script.templates.standard.ScriptTemplateWithArgs diff --git a/libraries/scripting/jvm/build.gradle.kts b/libraries/scripting/jvm/build.gradle.kts index f9eafe945d2..76b640c98a6 100644 --- a/libraries/scripting/jvm/build.gradle.kts +++ b/libraries/scripting/jvm/build.gradle.kts @@ -11,7 +11,6 @@ dependencies { compile(project(":kotlin-script-runtime")) compile(project(":kotlin-stdlib")) compile(project(":kotlin-scripting-common")) - compile(project(":kotlin-script-util")) } sourceSets { diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/impl/pathUtil.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/pathUtil.kt similarity index 96% rename from libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/impl/pathUtil.kt rename to libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/pathUtil.kt index df12afe5454..b650ef68cb0 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/impl/pathUtil.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/pathUtil.kt @@ -1,9 +1,9 @@ /* - * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * Copyright 2010-2018 JetBrains s.r.o. 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.script.util.impl +package kotlin.script.experimental.jvm.impl import java.io.File import java.net.URL diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt index 15a8537722d..b8279863a3e 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt @@ -5,10 +5,10 @@ package kotlin.script.experimental.jvm -import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext import java.io.File import kotlin.script.experimental.api.* import kotlin.script.experimental.host.ScriptingHostConfiguration +import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext import kotlin.script.experimental.util.PropertiesCollection data class JvmDependency(val classpath: List) : ScriptDependency { diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt new file mode 100644 index 00000000000..e62c13b9f42 --- /dev/null +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt @@ -0,0 +1,219 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package kotlin.script.experimental.jvm.util + +import java.io.File +import java.io.FileNotFoundException +import java.net.URL +import java.net.URLClassLoader +import kotlin.reflect.KClass +import kotlin.script.experimental.jvm.impl.getResourcePathForClass +import kotlin.script.experimental.jvm.impl.toFile +import kotlin.script.templates.standard.ScriptTemplateWithArgs + +// TODO: consider moving all these utilites to the build-common or some other shared compiler API module + +internal const val KOTLIN_JAVA_STDLIB_JAR = "kotlin-stdlib.jar" +internal const val KOTLIN_JAVA_REFLECT_JAR = "kotlin-reflect.jar" +internal const val KOTLIN_JAVA_SCRIPT_RUNTIME_JAR = "kotlin-script-runtime.jar" +internal const val KOTLIN_COMPILER_NAME = "kotlin-compiler" +internal const val KOTLIN_COMPILER_JAR = "$KOTLIN_COMPILER_NAME.jar" + +internal const val KOTLIN_SCRIPT_CLASSPATH_PROPERTY = "kotlin.script.classpath" +internal const val KOTLIN_COMPILER_CLASSPATH_PROPERTY = "kotlin.compiler.classpath" +internal const val KOTLIN_COMPILER_JAR_PROPERTY = "kotlin.compiler.jar" +internal const val KOTLIN_STDLIB_JAR_PROPERTY = "kotlin.java.stdlib.jar" +// obsolete name, but maybe still used in the wild +// TODO: consider removing +internal const val KOTLIN_RUNTIME_JAR_PROPERTY = "kotlin.java.runtime.jar" +internal const val KOTLIN_SCRIPT_RUNTIME_JAR_PROPERTY = "kotlin.script.runtime.jar" + +private val validClasspathFilesExtensions = setOf("jar", "zip", "java") + +fun classpathFromClassloader(classLoader: ClassLoader): List? = + generateSequence(classLoader) { it.parent }.toList().flatMap { + val urls = (it as? URLClassLoader)?.urLs?.asList() + ?: try { + // e.g. for IDEA platform UrlClassLoader + val getUrls = it::class.java.getMethod("getUrls") + getUrls.isAccessible = true + val result = getUrls.invoke(it) as? List + result?.filterIsInstance() + } catch (e: Throwable) { + null + } + urls?.mapNotNull { + // taking only classpath elements pointing to dirs (presumably with classes) or jars, because this classpath is intended for + // usage with the kotlin compiler, which cannot process other types of entries, e.g. jni libs + it.toFile()?.takeIf { el -> el.isDirectory || validClasspathFilesExtensions.any { el.extension == it } } + } + ?: emptyList() + }.distinct().takeIf { it.isNotEmpty() } + +fun classpathFromClasspathProperty(): List? = + System.getProperty("java.class.path") + ?.split(String.format("\\%s", File.pathSeparatorChar).toRegex()) + ?.dropLastWhile(String::isEmpty) + ?.map(::File) + +fun classpathFromClass(classLoader: ClassLoader, klass: KClass): List? = + classpathFromFQN(classLoader, klass.qualifiedName!!) + +fun classpathFromFQN(classLoader: ClassLoader, fqn: String): List? { + val clp = "${fqn.replace('.', '/')}.class" + val url = classLoader.getResource(clp) + return url?.toURI()?.path?.removeSuffix(clp)?.let { + listOf(File(it)) + } +} + +fun File.matchMaybeVersionedFile(baseName: String) = + name == baseName || + name == baseName.removeSuffix(".jar") || // for classes dirs + Regex(Regex.escape(baseName.removeSuffix(".jar")) + "(-\\d.*)?\\.jar").matches(name) + +fun File.hasParentNamed(baseName: String): Boolean = + nameWithoutExtension == baseName || parentFile?.hasParentNamed(baseName) ?: false + +private const val KOTLIN_COMPILER_EMBEDDABLE_JAR = "$KOTLIN_COMPILER_NAME-embeddable.jar" + +internal fun List.takeIfContainsAll(vararg keyNames: String): List? = + takeIf { classpath -> + keyNames.all { key -> classpath.any { it.matchMaybeVersionedFile(key) } } + } + +internal fun List.filterIfContainsAll(vararg keyNames: String): List? { + val res = hashMapOf() + for (cpentry in this) { + for (prefix in keyNames) { + if (cpentry.matchMaybeVersionedFile(prefix) || + (cpentry.isDirectory && cpentry.hasParentNamed(prefix)) + ) { + res[prefix] = cpentry + break + } + } + } + return if (keyNames.all { res.containsKey(it) }) res.values.toList() + else null +} + +internal fun List.takeIfContainsAny(vararg keyNames: String): List? = + takeIf { classpath -> + keyNames.any { key -> classpath.any { it.matchMaybeVersionedFile(key) } } + } + +fun scriptCompilationClasspathFromContextOrNull( + vararg keyNames: String, + classLoader: ClassLoader = Thread.currentThread().contextClassLoader, + wholeClasspath: Boolean = false +): List? { + fun List.takeAndFilter() = when { + isEmpty() -> null + wholeClasspath -> takeIfContainsAll(*keyNames) + else -> filterIfContainsAll(*keyNames) + } + return System.getProperty(KOTLIN_SCRIPT_CLASSPATH_PROPERTY)?.split(File.pathSeparator)?.map(::File) + ?: classpathFromClassloader(classLoader)?.takeAndFilter() + ?: classpathFromClasspathProperty()?.takeAndFilter() +} + +fun scriptCompilationClasspathFromContextOrStlib( + vararg keyNames: String, + classLoader: ClassLoader = Thread.currentThread().contextClassLoader, + wholeClasspath: Boolean = false +): List = + scriptCompilationClasspathFromContextOrNull( + *keyNames, + classLoader = classLoader, + wholeClasspath = wholeClasspath + ) + ?: KotlinJars.kotlinScriptStandardJars + +fun scriptCompilationClasspathFromContext( + vararg keyNames: String, + classLoader: ClassLoader = Thread.currentThread().contextClassLoader, + wholeClasspath: Boolean = false +): List = + scriptCompilationClasspathFromContextOrNull( + *keyNames, + classLoader = classLoader, + wholeClasspath = wholeClasspath + ) + ?: throw Exception("Unable to get script compilation classpath from context, please specify explicit classpath via \"$KOTLIN_SCRIPT_CLASSPATH_PROPERTY\" property") + +object KotlinJars { + + private val explicitCompilerClasspath: List? by lazy { + System.getProperty(KOTLIN_COMPILER_CLASSPATH_PROPERTY)?.split(File.pathSeparator)?.map(::File) + ?: System.getProperty(KOTLIN_COMPILER_JAR_PROPERTY)?.let(::File)?.takeIf(File::exists)?.let { listOf(it) } + } + + val compilerClasspath: List by lazy { + val kotlinCompilerJars = listOf( + KOTLIN_COMPILER_JAR, + KOTLIN_COMPILER_EMBEDDABLE_JAR + ) + val kotlinLibsJars = listOf( + KOTLIN_JAVA_STDLIB_JAR, + KOTLIN_JAVA_REFLECT_JAR, + KOTLIN_JAVA_SCRIPT_RUNTIME_JAR + ) + val kotlinBaseJars = kotlinCompilerJars + kotlinLibsJars + + val classpath = explicitCompilerClasspath + // search classpath from context classloader and `java.class.path` property + ?: (classpathFromFQN( + Thread.currentThread().contextClassLoader, + "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler" + ) + ?: classpathFromClassloader(Thread.currentThread().contextClassLoader)?.takeIf { it.isNotEmpty() } + ?: classpathFromClasspathProperty() + )?.filter { f -> kotlinBaseJars.any { f.matchMaybeVersionedFile(it) } }?.takeIf { it.isNotEmpty() } + // if autodetected, additionaly check for presense of the compiler jars + if (classpath == null || (explicitCompilerClasspath == null && classpath.none { f -> kotlinCompilerJars.any { f.matchMaybeVersionedFile(it) } })) { + throw FileNotFoundException("Cannot find kotlin compiler jar, set kotlin.compiler.classpath property to proper location") + } + classpath!! + } + + fun getLib(propertyName: String, jarName: String, markerClass: KClass<*>): File? = + System.getProperty(propertyName)?.let(::File)?.takeIf(File::exists) + ?: explicitCompilerClasspath?.firstOrNull { it.matchMaybeVersionedFile(jarName) }?.takeIf(File::exists) + ?: getResourcePathForClass(markerClass.java).takeIf(File::exists) + + val stdlibOrNull: File? by lazy { + System.getProperty(KOTLIN_STDLIB_JAR_PROPERTY)?.let(::File)?.takeIf(File::exists) + ?: getLib( + KOTLIN_RUNTIME_JAR_PROPERTY, + KOTLIN_JAVA_STDLIB_JAR, + JvmStatic::class + ) + } + + val stdlib: File by lazy { + stdlibOrNull + ?: throw Exception("Unable to find kotlin stdlib, please specify it explicitly via \"$KOTLIN_STDLIB_JAR_PROPERTY\" property") + } + + val scriptRuntimeOrNull: File? by lazy { + getLib( + KOTLIN_SCRIPT_RUNTIME_JAR_PROPERTY, + KOTLIN_JAVA_SCRIPT_RUNTIME_JAR, + ScriptTemplateWithArgs::class + ) + } + + val scriptRuntime: File by lazy { + scriptRuntimeOrNull + ?: throw Exception("Unable to find kotlin script runtime, please specify it explicitly via \"$KOTLIN_SCRIPT_RUNTIME_JAR_PROPERTY\" property") + } + + val kotlinScriptStandardJars get() = listOf( + stdlibOrNull, + scriptRuntimeOrNull + ).filterNotNull() +} diff --git a/libraries/tools/kotlin-script-util/build.gradle.kts b/libraries/tools/kotlin-script-util/build.gradle.kts index bea95139db0..536d597aa0e 100644 --- a/libraries/tools/kotlin-script-util/build.gradle.kts +++ b/libraries/tools/kotlin-script-util/build.gradle.kts @@ -9,6 +9,7 @@ plugins { dependencies { compile(project(":kotlin-stdlib")) compile(project(":kotlin-script-runtime")) + compile(project(":kotlin-scripting-jvm")) compileOnly(project(":compiler:cli")) compileOnly(project(":compiler:daemon-common")) compile(projectRuntimeJar(":kotlin-daemon-client")) diff --git a/libraries/tools/kotlin-script-util/build.gradle.kts.173 b/libraries/tools/kotlin-script-util/build.gradle.kts.173 index e1593ee5cb5..319b3aa1dbf 100644 --- a/libraries/tools/kotlin-script-util/build.gradle.kts.173 +++ b/libraries/tools/kotlin-script-util/build.gradle.kts.173 @@ -9,6 +9,7 @@ plugins { dependencies { compile(project(":kotlin-stdlib")) compile(project(":kotlin-script-runtime")) + compile(project(":kotlin-scripting-jvm")) compileOnly(project(":compiler:cli")) compileOnly(project(":compiler:daemon-common")) compile(projectRuntimeJar(":kotlin-daemon-client")) diff --git a/libraries/tools/kotlin-script-util/build.gradle.kts.as32 b/libraries/tools/kotlin-script-util/build.gradle.kts.as32 index bea95139db0..536d597aa0e 100644 --- a/libraries/tools/kotlin-script-util/build.gradle.kts.as32 +++ b/libraries/tools/kotlin-script-util/build.gradle.kts.as32 @@ -9,6 +9,7 @@ plugins { dependencies { compile(project(":kotlin-stdlib")) compile(project(":kotlin-script-runtime")) + compile(project(":kotlin-scripting-jvm")) compileOnly(project(":compiler:cli")) compileOnly(project(":compiler:daemon-common")) compile(projectRuntimeJar(":kotlin-daemon-client")) diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/context.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/context.kt index 300707e4c93..8ed465b4db4 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/context.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/util/context.kt @@ -1,184 +1,61 @@ package org.jetbrains.kotlin.script.util -import org.jetbrains.kotlin.script.util.impl.getResourcePathForClass -import org.jetbrains.kotlin.script.util.impl.toFile import java.io.File -import java.io.FileNotFoundException -import java.net.URL -import java.net.URLClassLoader import kotlin.reflect.KClass -import kotlin.script.templates.standard.ScriptTemplateWithArgs - -// TODO: consider moving all these utilites to the build-common or some other shared compiler API module - -internal const val KOTLIN_JAVA_STDLIB_JAR = "kotlin-stdlib.jar" -internal const val KOTLIN_JAVA_REFLECT_JAR = "kotlin-reflect.jar" -internal const val KOTLIN_JAVA_SCRIPT_RUNTIME_JAR = "kotlin-script-runtime.jar" -internal const val KOTLIN_COMPILER_NAME = "kotlin-compiler" -internal const val KOTLIN_COMPILER_JAR = "$KOTLIN_COMPILER_NAME.jar" - -internal const val KOTLIN_SCRIPT_CLASSPATH_PROPERTY = "kotlin.script.classpath" -internal const val KOTLIN_COMPILER_CLASSPATH_PROPERTY = "kotlin.compiler.classpath" -internal const val KOTLIN_COMPILER_JAR_PROPERTY = "kotlin.compiler.jar" -internal const val KOTLIN_STDLIB_JAR_PROPERTY = "kotlin.java.stdlib.jar" -// obsolete name, but maybe still used in the wild -// TODO: consider removing -internal const val KOTLIN_RUNTIME_JAR_PROPERTY = "kotlin.java.runtime.jar" -internal const val KOTLIN_SCRIPT_RUNTIME_JAR_PROPERTY = "kotlin.script.runtime.jar" - -private val validClasspathFilesExtensions = setOf("jar", "zip", "java") +import kotlin.script.experimental.jvm.util.matchMaybeVersionedFile as newMatchMaybeVersionedFile +import kotlin.script.experimental.jvm.util.hasParentNamed as newHasParentName +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") fun classpathFromClassloader(classLoader: ClassLoader): List? = - generateSequence(classLoader) { it.parent }.toList().flatMap { - val urls = (it as? URLClassLoader)?.urLs?.asList() - ?: try { - // e.g. for IDEA platform UrlClassLoader - val getUrls = it::class.java.getMethod("getUrls") - getUrls.isAccessible = true - val result = getUrls.invoke(it) as? List - result?.filterIsInstance() - } catch (e: Throwable) { - null - } - urls?.mapNotNull { - // taking only classpath elements pointing to dirs (presumably with classes) or jars, because this classpath is intended for - // usage with the kotlin compiler, which cannot process other types of entries, e.g. jni libs - it.toFile()?.takeIf { el -> el.isDirectory || validClasspathFilesExtensions.any { el.extension == it } } - } - ?: emptyList() - }.distinct().takeIf { it.isNotEmpty() } + kotlin.script.experimental.jvm.util.classpathFromClassloader(classLoader) +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") fun classpathFromClasspathProperty(): List? = - System.getProperty("java.class.path") - ?.split(String.format("\\%s", File.pathSeparatorChar).toRegex()) - ?.dropLastWhile(String::isEmpty) - ?.map(::File) + kotlin.script.experimental.jvm.util.classpathFromClasspathProperty() -fun classpathFromClass(classLoader: ClassLoader, klass: KClass): List? = classpathFromFQN(classLoader, klass.qualifiedName!!) +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") +fun classpathFromClass(classLoader: ClassLoader, klass: KClass): List? = + kotlin.script.experimental.jvm.util.classpathFromClass(classLoader, klass) -fun classpathFromFQN(classLoader: ClassLoader, fqn: String): List? { - val clp = "${fqn.replace('.', '/')}.class" - val url = classLoader.getResource(clp) - return url?.toURI()?.path?.removeSuffix(clp)?.let { - listOf(File(it)) - } -} +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") +fun classpathFromFQN(classLoader: ClassLoader, fqn: String): List? = + kotlin.script.experimental.jvm.util.classpathFromFQN(classLoader, fqn) -fun File.matchMaybeVersionedFile(baseName: String) = - name == baseName || - name == baseName.removeSuffix(".jar") || // for classes dirs - Regex(Regex.escape(baseName.removeSuffix(".jar")) + "(-\\d.*)?\\.jar").matches(name) +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") +fun File.matchMaybeVersionedFile(baseName: String) = newMatchMaybeVersionedFile(baseName) -fun File.hasParentNamed(baseName: String): Boolean = - nameWithoutExtension == baseName || parentFile?.hasParentNamed(baseName) ?: false - -private const val KOTLIN_COMPILER_EMBEDDABLE_JAR = "$KOTLIN_COMPILER_NAME-embeddable.jar" - -internal fun List.takeIfContainsAll(vararg keyNames: String): List? = - takeIf { classpath -> - keyNames.all { key -> classpath.any { it.matchMaybeVersionedFile(key) } } - } - -internal fun List.filterIfContainsAll(vararg keyNames: String): List? { - val res = hashMapOf() - for (cpentry in this) { - for (prefix in keyNames) { - if (cpentry.matchMaybeVersionedFile(prefix) || - (cpentry.isDirectory && cpentry.hasParentNamed(prefix)) - ) { - res[prefix] = cpentry - break - } - } - } - return if (keyNames.all { res.containsKey(it) }) res.values.toList() - else null -} - -internal fun List.takeIfContainsAny(vararg keyNames: String): List? = - takeIf { classpath -> - keyNames.any { key -> classpath.any { it.matchMaybeVersionedFile(key) } } - } +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") +fun File.hasParentNamed(baseName: String): Boolean = newHasParentName(baseName) +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") fun scriptCompilationClasspathFromContextOrNull( vararg keyNames: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader, wholeClasspath: Boolean = false -): List? { - fun List.takeAndFilter() = when { - isEmpty() -> null - wholeClasspath -> takeIfContainsAll(*keyNames) - else -> filterIfContainsAll(*keyNames) - } - return System.getProperty(KOTLIN_SCRIPT_CLASSPATH_PROPERTY)?.split(File.pathSeparator)?.map(::File) - ?: classpathFromClassloader(classLoader)?.takeAndFilter() - ?: classpathFromClasspathProperty()?.takeAndFilter() -} +): List? = + kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContextOrNull( + *keyNames, classLoader = classLoader, wholeClasspath = wholeClasspath + ) +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") fun scriptCompilationClasspathFromContextOrStlib( vararg keyNames: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader, wholeClasspath: Boolean = false ): List = - scriptCompilationClasspathFromContextOrNull(*keyNames, classLoader = classLoader, wholeClasspath = wholeClasspath) - ?: KotlinJars.kotlinScriptStandardJars + kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContextOrStlib( + *keyNames, classLoader = classLoader, wholeClasspath = wholeClasspath + ) +@Deprecated("Use the function from kotlin.script.experimental.jvm.util") fun scriptCompilationClasspathFromContext( vararg keyNames: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader, wholeClasspath: Boolean = false ): List = - scriptCompilationClasspathFromContextOrNull(*keyNames, classLoader = classLoader, wholeClasspath = wholeClasspath) - ?: throw Exception("Unable to get script compilation classpath from context, please specify explicit classpath via \"$KOTLIN_SCRIPT_CLASSPATH_PROPERTY\" property") + kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext( + *keyNames, classLoader = classLoader, wholeClasspath = wholeClasspath + ) -object KotlinJars { - - private val explicitCompilerClasspath: List? by lazy { - System.getProperty(KOTLIN_COMPILER_CLASSPATH_PROPERTY)?.split(File.pathSeparator)?.map(::File) - ?: System.getProperty(KOTLIN_COMPILER_JAR_PROPERTY)?.let(::File)?.takeIf(File::exists)?.let { listOf(it) } - } - - val compilerClasspath: List by lazy { - val kotlinCompilerJars = listOf(KOTLIN_COMPILER_JAR, KOTLIN_COMPILER_EMBEDDABLE_JAR) - val kotlinLibsJars = listOf(KOTLIN_JAVA_STDLIB_JAR, KOTLIN_JAVA_REFLECT_JAR, KOTLIN_JAVA_SCRIPT_RUNTIME_JAR) - val kotlinBaseJars = kotlinCompilerJars + kotlinLibsJars - - val classpath = explicitCompilerClasspath - // search classpath from context classloader and `java.class.path` property - ?: (classpathFromFQN(Thread.currentThread().contextClassLoader, "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler") - ?: classpathFromClassloader(Thread.currentThread().contextClassLoader)?.takeIf { it.isNotEmpty() } - ?: classpathFromClasspathProperty() - )?.filter { f -> kotlinBaseJars.any { f.matchMaybeVersionedFile(it) } }?.takeIf { it.isNotEmpty() } - // if autodetected, additionaly check for presense of the compiler jars - if (classpath == null || (explicitCompilerClasspath == null && classpath.none { f -> kotlinCompilerJars.any { f.matchMaybeVersionedFile(it) } })) { - throw FileNotFoundException("Cannot find kotlin compiler jar, set kotlin.compiler.classpath property to proper location") - } - classpath!! - } - - fun getLib(propertyName: String, jarName: String, markerClass: KClass<*>): File? = - System.getProperty(propertyName)?.let(::File)?.takeIf(File::exists) - ?: explicitCompilerClasspath?.firstOrNull { it.matchMaybeVersionedFile(jarName) }?.takeIf(File::exists) - ?: getResourcePathForClass(markerClass.java).takeIf(File::exists) - - val stdlibOrNull: File? by lazy { - System.getProperty(KOTLIN_STDLIB_JAR_PROPERTY)?.let(::File)?.takeIf(File::exists) - ?: getLib(KOTLIN_RUNTIME_JAR_PROPERTY, KOTLIN_JAVA_STDLIB_JAR, JvmStatic::class) - } - - val stdlib: File by lazy { - stdlibOrNull - ?: throw Exception("Unable to find kotlin stdlib, please specify it explicitly via \"$KOTLIN_STDLIB_JAR_PROPERTY\" property") - } - - val scriptRuntimeOrNull: File? by lazy { - getLib(KOTLIN_SCRIPT_RUNTIME_JAR_PROPERTY, KOTLIN_JAVA_SCRIPT_RUNTIME_JAR, ScriptTemplateWithArgs::class) - } - - val scriptRuntime: File by lazy { - scriptRuntimeOrNull - ?: throw Exception("Unable to find kotlin script runtime, please specify it explicitly via \"$KOTLIN_SCRIPT_RUNTIME_JAR_PROPERTY\" property") - } - - val kotlinScriptStandardJars get() = listOf(stdlibOrNull, scriptRuntimeOrNull).filterNotNull() -} +@Deprecated("Use the object from kotlin.script.experimental.jvm.util") +val KotlinJars = kotlin.script.experimental.jvm.util.KotlinJars