diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/GenericReplCompiledEvaluator.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/GenericReplCompiledEvaluator.kt index 541247e2543..3b9f188899c 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/GenericReplCompiledEvaluator.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/GenericReplCompiledEvaluator.kt @@ -43,7 +43,7 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, hasResult: Boolean, classpathAddendum: List, invokeWrapper: InvokeWrapper? - ): ReplEvalResult /*= evalStateLock.write*/ { + ): ReplEvalResult = evalStateLock.write { checkAndUpdateReplHistoryCollection(compiledLoadedClassesHistory, history)?.let { return@eval ReplEvalResult.HistoryMismatch(compiledLoadedClassesHistory.lines, it) } @@ -52,12 +52,7 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, fun classNameFromPath(path: String) = JvmClassName.byInternalName(path.replaceFirst("\\.class$".toRegex(), "")) - classLoaderLock.read { - if (classpathAddendum.isNotEmpty()) { - classLoaderLock.write { - classLoader = makeReplClassLoader(classLoader, classpathAddendum) - } - } + fun processCompiledClasses() { compiledClasses.filter { it.path.endsWith(".class") } .forEach { val className = classNameFromPath(it.path) @@ -68,21 +63,35 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, } } + classLoaderLock.read { + if (classpathAddendum.isNotEmpty()) { + classLoaderLock.write { + classLoader = makeReplClassLoader(classLoader, classpathAddendum) + } + } + processCompiledClasses() + } + + fun compiledClassesNames() = compiledClasses.map { classNameFromPath(it.path).fqNameForClassNameWithoutDollars.asString() } + val scriptClass = classLoaderLock.read { try { classLoader.loadClass(mainLineClassName!!) } catch (e: Throwable) { - return ReplEvalResult.Error.Runtime(compiledLoadedClassesHistory.lines, "Error loading class $mainLineClassName: known classes: ${compiledClasses.map { classNameFromPath(it.path).fqNameForClassNameWithoutDollars.asString() }}", + return ReplEvalResult.Error.Runtime(compiledLoadedClassesHistory.lines, "Error loading class $mainLineClassName: known classes: ${compiledClassesNames()}", e as? Exception) } } - val constructorParams: Array> = + fun getConstructorParams(): Array> = (compiledLoadedClassesHistory.values.map { it.klass.java } + (scriptArgs?.mapIndexed { i, it -> scriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList()) ).toTypedArray() - val constructorArgs: Array = (compiledLoadedClassesHistory.values.map { it.instance } + scriptArgs.orEmpty()).toTypedArray() + fun getConstructorArgs() = (compiledLoadedClassesHistory.values.map { it.instance } + scriptArgs.orEmpty()).toTypedArray() + + val constructorParams: Array> = getConstructorParams() + val constructorArgs: Array = getConstructorArgs() val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams) val scriptInstance =