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 2de34e49f80..0419d8c952b 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 @@ -30,12 +30,12 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, baseClass private class ClassWithInstance(val klass: Class<*>, val instance: Any) - private val compiledLoadedClassesHistory = arrayListOf>() + private val compiledLoadedClassesHistory = ReplHistory() - override fun eval(codeLine: ReplCodeLine, history: Iterable, compiledClasses: List, hasResult: Boolean, newClasspath: List): ReplEvalResult { + override fun eval(codeLine: ReplCodeLine, history: List, compiledClasses: List, hasResult: Boolean, classpathAddendum: List): ReplEvalResult { checkAndUpdateReplHistoryCollection(compiledLoadedClassesHistory, history)?.let { - return@eval ReplEvalResult.HistoryMismatch(it) + return@eval ReplEvalResult.HistoryMismatch(compiledLoadedClassesHistory.lines, it) } var mainLineClassName: String? = null @@ -43,9 +43,9 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, baseClass fun classNameFromPath(path: String) = JvmClassName.byInternalName(path.replaceFirst("\\.class$".toRegex(), "")) classLoaderLock.read { - if (newClasspath.isNotEmpty()) { + if (classpathAddendum.isNotEmpty()) { classLoaderLock.write { - classLoader = makeReplClassLoader(classLoader, newClasspath) + classLoader = makeReplClassLoader(classLoader, classpathAddendum) } } compiledClasses.filter { it.path.endsWith(".class") } @@ -68,10 +68,10 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, baseClass } val constructorParams: Array> = - (compiledLoadedClassesHistory.map { it.second.klass } + + (compiledLoadedClassesHistory.values.map { it.klass } + (scriptArgs?.mapIndexed { i, it -> scriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList()) ).toTypedArray() - val constructorArgs: Array = (compiledLoadedClassesHistory.map { it.second.instance } + scriptArgs.orEmpty()).toTypedArray() + val constructorArgs: Array = (compiledLoadedClassesHistory.values.map { it.instance } + scriptArgs.orEmpty()).toTypedArray() val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams) val scriptInstance = @@ -80,15 +80,15 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable, baseClass } catch (e: Throwable) { // ignore everything in the stack trace until this constructor call - return ReplEvalResult.Error.Runtime(renderReplStackTrace(e.cause!!, startFromMethodName = "${scriptClass.name}.")) + return ReplEvalResult.Error.Runtime(compiledLoadedClassesHistory.lines, renderReplStackTrace(e.cause!!, startFromMethodName = "${scriptClass.name}.")) } - compiledLoadedClassesHistory.add(codeLine to ClassWithInstance(scriptClass, scriptInstance)) + compiledLoadedClassesHistory.add(codeLine, ClassWithInstance(scriptClass, scriptInstance)) val rvField = scriptClass.getDeclaredField(SCRIPT_RESULT_FIELD_NAME).apply { isAccessible = true } val rv: Any? = rvField.get(scriptInstance) - return if (hasResult) ReplEvalResult.ValueResult(rv) else ReplEvalResult.UnitResult + return if (hasResult) ReplEvalResult.ValueResult(compiledLoadedClassesHistory.lines, rv) else ReplEvalResult.UnitResult(compiledLoadedClassesHistory.lines) } companion object { diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/KotlinJsr223JvmScriptEngineBase.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/KotlinJsr223JvmScriptEngineBase.kt index fcb1383b70f..7b2ecca6131 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/KotlinJsr223JvmScriptEngineBase.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/KotlinJsr223JvmScriptEngineBase.kt @@ -19,13 +19,16 @@ package org.jetbrains.kotlin.cli.common.repl import java.io.Reader import javax.script.* -abstract class KotlinJsr223JvmScriptEngineBase(protected val myFactory: ScriptEngineFactory) : AbstractScriptEngine(), ScriptEngine { +//val KOTLIN_SCRIPT_HISTORY_BINDINGS_KEY = "kotlin.script.history" +// +//val Bindings.kotlinScriptHistory: +abstract class KotlinJsr223JvmScriptEngineBase(protected val myFactory: ScriptEngineFactory) : AbstractScriptEngine(), ScriptEngine, Compilable, Invocable { protected var lineCount = 0 protected val history = arrayListOf() - abstract fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult + abstract fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult override fun eval(script: String, context: ScriptContext?): Any? { @@ -49,6 +52,30 @@ abstract class KotlinJsr223JvmScriptEngineBase(protected val myFactory: ScriptEn override fun eval(script: Reader, context: ScriptContext?): Any? = eval(script.readText(), context) + override fun compile(p0: String?): CompiledScript { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun compile(p0: Reader?): CompiledScript { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun invokeMethod(p0: Any?, p1: String?, vararg p2: Any?): Any { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getInterface(p0: Class?): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getInterface(p0: Any?, p1: Class?): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun invokeFunction(p0: String?, vararg p1: Any?): Any { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + override fun createBindings(): Bindings = SimpleBindings() override fun getFactory(): ScriptEngineFactory = myFactory diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/Repl.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/Repl.kt index d0897c9edd4..15c1eec72fc 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/Repl.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/Repl.kt @@ -35,10 +35,14 @@ data class CompiledClassData(val path: String, val bytes: ByteArray) : Serializa } } -sealed class ReplCheckResult : Serializable { - object Ok : ReplCheckResult() - object Incomplete : ReplCheckResult() - class Error(val message: String, val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION) : ReplCheckResult() { +sealed class ReplCheckResult(val updatedHistory: List) : Serializable { + class Ok(updatedHistory: List) : ReplCheckResult(updatedHistory) + class Incomplete(updatedHistory: List) : ReplCheckResult(updatedHistory) + class Error(updatedHistory: List, + val message: String, + val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION + ) : ReplCheckResult(updatedHistory) + { override fun toString(): String = "Error(message = \"$message\"" } companion object { @@ -46,11 +50,19 @@ sealed class ReplCheckResult : Serializable { } } -sealed class ReplCompileResult : Serializable { - class CompiledClasses(val classes: List, val hasResult: Boolean, val newClasspath: List) : ReplCompileResult() - object Incomplete : ReplCompileResult() - class HistoryMismatch(val lineNo: Int): ReplCompileResult() - class Error(val message: String, val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION) : ReplCompileResult() { +sealed class ReplCompileResult(val updatedHistory: List) : Serializable { + class CompiledClasses(updatedHistory: List, + val classes: List, + val hasResult: Boolean, + val classpathAddendum: List + ) : ReplCompileResult(updatedHistory) + class Incomplete(updatedHistory: List) : ReplCompileResult(updatedHistory) + class HistoryMismatch(updatedHistory: List, val lineNo: Int): ReplCompileResult(updatedHistory) + class Error(updatedHistory: List, + val message: String, + val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION + ) : ReplCompileResult(updatedHistory) + { override fun toString(): String = "Error(message = \"$message\"" } companion object { @@ -58,16 +70,19 @@ sealed class ReplCompileResult : Serializable { } } -sealed class ReplEvalResult : Serializable { - class ValueResult(val value: Any?) : ReplEvalResult() { +sealed class ReplEvalResult(val updatedHistory: List) : Serializable { + class ValueResult(updatedHistory: List, val value: Any?) : ReplEvalResult(updatedHistory) { override fun toString(): String = "Result: $value" } - object UnitResult : ReplEvalResult() - object Incomplete : ReplEvalResult() - class HistoryMismatch(val lineNo: Int): ReplEvalResult() - sealed class Error(val message: String) : ReplEvalResult() { - class Runtime(message: String) : Error(message) - class CompileTime(message: String, val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION) : Error(message) + class UnitResult(updatedHistory: List) : ReplEvalResult(updatedHistory) + class Incomplete(updatedHistory: List) : ReplEvalResult(updatedHistory) + class HistoryMismatch(updatedHistory: List, val lineNo: Int): ReplEvalResult(updatedHistory) + sealed class Error(updatedHistory: List, val message: String) : ReplEvalResult(updatedHistory) { + class Runtime(updatedHistory: List, message: String) : Error(updatedHistory, message) + class CompileTime(updatedHistory: List, + message: String, + val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION + ) : Error(updatedHistory, message) override fun toString(): String = "${this::class.simpleName}Error(message = \"$message\"" } companion object { @@ -76,16 +91,16 @@ sealed class ReplEvalResult : Serializable { } interface ReplChecker { - fun check(codeLine: ReplCodeLine, history: Iterable): ReplCheckResult + fun check(codeLine: ReplCodeLine, history: List): ReplCheckResult } interface ReplCompiler : ReplChecker { - fun compile(codeLine: ReplCodeLine, history: Iterable): ReplCompileResult + fun compile(codeLine: ReplCodeLine, history: List): ReplCompileResult } interface ReplCompiledEvaluator { - fun eval(codeLine: ReplCodeLine, history: Iterable, compiledClasses: List, hasResult: Boolean, newClasspath: List): ReplEvalResult + fun eval(codeLine: ReplCodeLine, history: List, compiledClasses: List, hasResult: Boolean, classpathAddendum: List): ReplEvalResult // override to capture output fun evalWithIO(body: () -> T): T = body() @@ -94,7 +109,7 @@ interface ReplCompiledEvaluator { interface ReplEvaluator : ReplChecker { - fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult + fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult // override to capture output fun evalWithIO(body: () -> T): T = body() diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/replUtil.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/replUtil.kt index 1f8e91ed5c8..bca4f6f9bbc 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/replUtil.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/repl/replUtil.kt @@ -17,16 +17,42 @@ package org.jetbrains.kotlin.cli.common.repl import com.google.common.base.Throwables +import java.io.Serializable -fun checkAndUpdateReplHistoryCollection(col: MutableList>, baseHistory: Iterable): Int? { - val baseHistoryIt = baseHistory.iterator() +// TODO: thread safety!! +data class ReplHistory( + val lines: MutableList = arrayListOf(), + val values: MutableList = arrayListOf() +) : Serializable +{ + init { assert(isValid()) } + fun isValid() = lines.size == values.size + + fun add(line: ReplCodeLine, value: T) { + lines.add(line) + values.add(value) + } + + fun trimAt(idx: Int) { + lines.dropLast(lines.size - idx) + values.dropLast(lines.size - idx) + } + + companion object { + private val serialVersionUID: Long = 8228357578L + } +} + +fun checkAndUpdateReplHistoryCollection(history: ReplHistory, linesHistory: Iterable): Int? { + assert(history.isValid()) + val linesHistoryIt = linesHistory.iterator() var idx = 0 - while (baseHistoryIt.hasNext()) { - val curLine = baseHistoryIt.next() - if (col[idx].first != curLine) return curLine.no + while (linesHistoryIt.hasNext()) { + val curLine = linesHistoryIt.next() + if (history.lines[idx] != curLine) return curLine.no idx += 1 } - col.dropLast(col.size - idx) + history.trimAt(idx) return null } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericRepl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericRepl.kt index c6c3f5d141e..650e3921c8f 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericRepl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericRepl.kt @@ -74,7 +74,7 @@ open class GenericReplChecker( fun createDiagnosticHolder() = ReplTerminalDiagnosticMessageHolder() @Synchronized - override fun check(codeLine: ReplCodeLine, history: Iterable): ReplCheckResult { + override fun check(codeLine: ReplCodeLine, history: List): ReplCheckResult { val virtualFile = LightVirtualFile("line${codeLine.no}${KotlinParserDefinition.STD_SCRIPT_EXT}", KotlinLanguage.INSTANCE, codeLine.code).apply { charset = CharsetToolkit.UTF8_CHARSET @@ -91,9 +91,9 @@ open class GenericReplChecker( } return when { - syntaxErrorReport.isHasErrors && syntaxErrorReport.isAllErrorsAtEof -> ReplCheckResult.Incomplete - syntaxErrorReport.isHasErrors -> ReplCheckResult.Error(errorHolder.renderedDiagnostics) - else -> ReplCheckResult.Ok + syntaxErrorReport.isHasErrors && syntaxErrorReport.isAllErrorsAtEof -> ReplCheckResult.Incomplete(history) + syntaxErrorReport.isHasErrors -> ReplCheckResult.Error(history, errorHolder.renderedDiagnostics) + else -> ReplCheckResult.Ok(history) } } } @@ -109,21 +109,21 @@ open class GenericReplCompiler( private var lastDependencies: KotlinScriptExternalDependencies? = null - private val descriptorsHistory = arrayListOf>() + private val descriptorsHistory = ReplHistory() @Synchronized - override fun compile(codeLine: ReplCodeLine, history: Iterable): ReplCompileResult { + override fun compile(codeLine: ReplCodeLine, history: List): ReplCompileResult { checkAndUpdateReplHistoryCollection(descriptorsHistory, history)?.let { - return@compile ReplCompileResult.HistoryMismatch(it) + return@compile ReplCompileResult.HistoryMismatch(descriptorsHistory.lines, it) } val (psiFile, errorHolder) = run { if (lineState == null || lineState!!.codeLine != codeLine) { val res = check(codeLine, history) when (res) { - ReplCheckResult.Incomplete -> return@compile ReplCompileResult.Incomplete - is ReplCheckResult.Error -> return@compile ReplCompileResult.Error(res.message, res.location) - ReplCheckResult.Ok -> {} // continue + is ReplCheckResult.Incomplete -> return@compile ReplCompileResult.Incomplete(res.updatedHistory) + is ReplCheckResult.Error -> return@compile ReplCompileResult.Error(res.updatedHistory, res.message, res.location) + is ReplCheckResult.Ok -> {} // continue } } Pair(lineState!!.psiFile, lineState!!.errorHolder) @@ -137,7 +137,7 @@ open class GenericReplCompiler( val analysisResult = analyzerEngine.analyzeReplLine(psiFile, codeLine.no) AnalyzerWithCompilerReport.Companion.reportDiagnostics(analysisResult.diagnostics, errorHolder) val scriptDescriptor = when (analysisResult) { - is CliReplAnalyzerEngine.ReplLineAnalysisResult.WithErrors -> return ReplCompileResult.Error(errorHolder.renderedDiagnostics) + is CliReplAnalyzerEngine.ReplLineAnalysisResult.WithErrors -> return ReplCompileResult.Error(descriptorsHistory.lines, errorHolder.renderedDiagnostics) is CliReplAnalyzerEngine.ReplLineAnalysisResult.Successful -> analysisResult.scriptDescriptor else -> error("Unexpected result ${analysisResult.javaClass}") } @@ -151,7 +151,7 @@ open class GenericReplCompiler( compilerConfiguration ) state.replSpecific.scriptResultFieldName = SCRIPT_RESULT_FIELD_NAME - state.replSpecific.earlierScriptsForReplInterpreter = descriptorsHistory.map { it.second } + state.replSpecific.earlierScriptsForReplInterpreter = descriptorsHistory.values state.beforeCompile() KotlinCodegenFacade.generatePackage( state, @@ -159,9 +159,10 @@ open class GenericReplCompiler( setOf(psiFile.script!!.getContainingKtFile()), org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION) - descriptorsHistory.add(codeLine to scriptDescriptor) + descriptorsHistory.add(codeLine, scriptDescriptor) - return ReplCompileResult.CompiledClasses(state.factory.asList().map { CompiledClassData(it.relativePath, it.asByteArray()) }, + return ReplCompileResult.CompiledClasses(descriptorsHistory.lines, + state.factory.asList().map { CompiledClassData(it.relativePath, it.asByteArray()) }, state.replSpecific.hasResult, newDependencies?.let { environment.updateClasspath(it.classpath.map(::JvmClasspathRoot)) } ?: emptyList()) } @@ -185,18 +186,18 @@ open class GenericRepl( private val compiledEvaluator = GenericReplCompiledEvaluator(compilerConfiguration.jvmClasspathRoots, baseClassloader, scriptArgs, scriptArgsTypes) @Synchronized - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult = + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult = compileAndEval(this, compiledEvaluator, codeLine, history) } -fun compileAndEval(replCompiler: ReplCompiler, replCompiledEvaluator: ReplCompiledEvaluator, codeLine: ReplCodeLine, history: Iterable): ReplEvalResult = +fun compileAndEval(replCompiler: ReplCompiler, replCompiledEvaluator: ReplCompiledEvaluator, codeLine: ReplCodeLine, history: List): ReplEvalResult = replCompiler.compile(codeLine, history).let { when (it) { - ReplCompileResult.Incomplete -> ReplEvalResult.Incomplete - is ReplCompileResult.HistoryMismatch -> ReplEvalResult.HistoryMismatch(it.lineNo) - is ReplCompileResult.Error -> ReplEvalResult.Error.CompileTime(it.message, it.location) - is ReplCompileResult.CompiledClasses -> replCompiledEvaluator.eval(codeLine, history, it.classes, it.hasResult, it.newClasspath) + is ReplCompileResult.Incomplete -> ReplEvalResult.Incomplete(it.updatedHistory) + is ReplCompileResult.HistoryMismatch -> ReplEvalResult.HistoryMismatch(it.updatedHistory, it.lineNo) + is ReplCompileResult.Error -> ReplEvalResult.Error.CompileTime(it.updatedHistory, it.message, it.location) + is ReplCompileResult.CompiledClasses -> replCompiledEvaluator.eval(codeLine, history, it.classes, it.hasResult, it.classpathAddendum) } } diff --git a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinRemoteReplClient.kt b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinRemoteReplClient.kt index 876232b2e92..31c535ab61b 100644 --- a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinRemoteReplClient.kt +++ b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinRemoteReplClient.kt @@ -71,8 +71,8 @@ open class KotlinRemoteReplClientBase( }) } - override fun check(codeLine: ReplCodeLine, history: Iterable): ReplCheckResult { - return compileService.remoteReplLineCheck(sessionId, codeLine, history.toList()).get() + override fun check(codeLine: ReplCodeLine, history: List): ReplCheckResult { + return compileService.remoteReplLineCheck(sessionId, codeLine, history).get() } } @@ -101,8 +101,8 @@ class KotlinRemoteReplCompiler( operationsTracer = operationsTracer ), ReplCompiler { - override fun compile(codeLine: ReplCodeLine, history: Iterable): ReplCompileResult { - return compileService.remoteReplLineCompile(sessionId, codeLine, history.toList()).get() + override fun compile(codeLine: ReplCodeLine, history: List): ReplCompileResult { + return compileService.remoteReplLineCompile(sessionId, codeLine, history).get() } } @@ -138,7 +138,7 @@ class KotlinRemoteReplEvaluator( operationsTracer = operationsTracer ), ReplEvaluator { - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult { - return compileService.remoteReplLineEval(sessionId, codeLine, history.toList()).get() + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult { + return compileService.remoteReplLineEval(sessionId, codeLine, history).get() } } diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt index b7dc5d7a422..bb66a891069 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt @@ -141,11 +141,12 @@ open class KotlinJvmReplService( } } - override fun check(codeLine: ReplCodeLine, history: Iterable): ReplCheckResult { + override fun check(codeLine: ReplCodeLine, history: List): ReplCheckResult { operationsTracer?.before("check") try { return replCompiler?.check(codeLine, history) - ?: ReplCheckResult.Error(messageCollector.firstErrorMessage ?: "Unknown error", + ?: ReplCheckResult.Error(history, + messageCollector.firstErrorMessage ?: "Unknown error", messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION) } finally { @@ -153,11 +154,12 @@ open class KotlinJvmReplService( } } - override fun compile(codeLine: ReplCodeLine, history: Iterable): ReplCompileResult { + override fun compile(codeLine: ReplCodeLine, history: List): ReplCompileResult { operationsTracer?.before("compile") try { return replCompiler?.compile(codeLine, history) - ?: ReplCompileResult.Error(messageCollector.firstErrorMessage ?: "Unknown error", + ?: ReplCompileResult.Error(history, + messageCollector.firstErrorMessage ?: "Unknown error", messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION) } finally { @@ -165,11 +167,12 @@ open class KotlinJvmReplService( } } - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult = synchronized(this) { + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult = synchronized(this) { operationsTracer?.before("eval") try { return replCompiler?.let { compileAndEval(it, compiledEvaluator, codeLine, history) } - ?: ReplEvalResult.Error.CompileTime(messageCollector.firstErrorMessage ?: "Unknown error", + ?: ReplEvalResult.Error.CompileTime(history, + messageCollector.firstErrorMessage ?: "Unknown error", messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION) } finally { diff --git a/compiler/tests/org/jetbrains/kotlin/cli/jvm/repl/GenericReplTest.kt b/compiler/tests/org/jetbrains/kotlin/cli/jvm/repl/GenericReplTest.kt index a21ddace76e..f8adf3027ed 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/jvm/repl/GenericReplTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/cli/jvm/repl/GenericReplTest.kt @@ -53,7 +53,7 @@ class GenericReplTest : TestCase() { val res2c = res2 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res2", res2c) - val res21 = repl.compiledEvaluator.eval(codeLine0, emptyList(), res2c!!.classes, res2c.hasResult, res2c.newClasspath) + val res21 = repl.compiledEvaluator.eval(codeLine0, emptyList(), res2c!!.classes, res2c.hasResult, res2c.classpathAddendum) val res21e = res21 as? ReplEvalResult.ValueResult TestCase.assertNotNull("Unexpected eval result: $res21", res21e) TestCase.assertEquals(3, res21e!!.value) @@ -63,7 +63,7 @@ class GenericReplTest : TestCase() { val res3c = res3 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res3", res3c) - val res31 = repl.compiledEvaluator.eval(codeLine1, listOf(codeLine0), res3c!!.classes, res3c.hasResult, res3c.newClasspath) + val res31 = repl.compiledEvaluator.eval(codeLine1, listOf(codeLine0), res3c!!.classes, res3c.hasResult, res3c.classpathAddendum) val res31e = res31 as? ReplEvalResult.UnitResult TestCase.assertNotNull("Unexpected eval result: $res31", res31e) @@ -75,7 +75,7 @@ class GenericReplTest : TestCase() { val res4c = res4 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res4", res4c) - val res41 = repl.compiledEvaluator.eval(codeLine2, emptyList(), res4c!!.classes, res4c.hasResult, res4c.newClasspath) + val res41 = repl.compiledEvaluator.eval(codeLine2, emptyList(), res4c!!.classes, res4c.hasResult, res4c.classpathAddendum) val res41e = res41 as? ReplEvalResult.ValueResult TestCase.assertNotNull("Unexpected eval result: $res41", res41e) TestCase.assertEquals(7, res41e!!.value) @@ -97,7 +97,7 @@ class GenericReplTest : TestCase() { val res1c = res1 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res1", res1c) - val res11 = repl.compiledEvaluator.eval(codeLine1, emptyList(), res1c!!.classes, res1c.hasResult, res1c.newClasspath) + val res11 = repl.compiledEvaluator.eval(codeLine1, emptyList(), res1c!!.classes, res1c.hasResult, res1c.classpathAddendum) val res11e = res11 as? ReplEvalResult.ValueResult TestCase.assertNotNull("Unexpected eval result: $res11", res11e) TestCase.assertEquals(3, res11e!!.value) @@ -107,7 +107,7 @@ class GenericReplTest : TestCase() { val res2c = res2 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res2", res2c) - val res21 = repl.compiledEvaluator.eval(codeLine2, listOf(codeLine1), res2c!!.classes, res2c.hasResult, res2c.newClasspath) + val res21 = repl.compiledEvaluator.eval(codeLine2, listOf(codeLine1), res2c!!.classes, res2c.hasResult, res2c.classpathAddendum) val res21e = res21 as? ReplEvalResult.ValueResult TestCase.assertNotNull("Unexpected eval result: $res21", res21e) TestCase.assertEquals(5, res21e!!.value) diff --git a/compiler/tests/org/jetbrains/kotlin/daemon/CompilerDaemonTest.kt b/compiler/tests/org/jetbrains/kotlin/daemon/CompilerDaemonTest.kt index dc47481ca67..74e79178a2c 100644 --- a/compiler/tests/org/jetbrains/kotlin/daemon/CompilerDaemonTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/daemon/CompilerDaemonTest.kt @@ -515,7 +515,7 @@ class CompilerDaemonTest : KotlinIntegrationTestBase() { val res1c = res1 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res1", res1c) - val res11 = localEvaluator.eval(codeLine1, emptyList(), res1c!!.classes, res1c.hasResult, res1c.newClasspath) + val res11 = localEvaluator.eval(codeLine1, emptyList(), res1c!!.classes, res1c.hasResult, res1c.classpathAddendum) val res11e = res11 as? ReplEvalResult.UnitResult TestCase.assertNotNull("Unexpected eval result: $res11", res11e) @@ -527,7 +527,7 @@ class CompilerDaemonTest : KotlinIntegrationTestBase() { val res2c = res2 as? ReplCompileResult.CompiledClasses TestCase.assertNotNull("Unexpected compile result: $res2", res2c) - val res21 = localEvaluator.eval(codeLine2, listOf(codeLine1), res2c!!.classes, res2c.hasResult, res2c.newClasspath) + val res21 = localEvaluator.eval(codeLine2, listOf(codeLine1), res2c!!.classes, res2c.hasResult, res2c.classpathAddendum) val res21e = res21 as? ReplEvalResult.ValueResult TestCase.assertNotNull("Unexpected eval result: $res21", res21e) TestCase.assertEquals(7, res21e!!.value) diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/jsr223/KotlinJsr223JvmScriptEngine4Idea.kt b/idea/idea-repl/src/org/jetbrains/kotlin/jsr223/KotlinJsr223JvmScriptEngine4Idea.kt index 2633533256a..93d3e011654 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/jsr223/KotlinJsr223JvmScriptEngine4Idea.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/jsr223/KotlinJsr223JvmScriptEngine4Idea.kt @@ -67,7 +67,7 @@ class KotlinJsr223JvmScriptEngine4Idea( // TODO: bindings passing works only once on the first eval, subsequent setContext/setBindings call have no effect. Consider making it dynamic, but take history into account val localEvaluator by lazy { GenericReplCompiledEvaluator(templateClasspath, Thread.currentThread().contextClassLoader, getScriptArgs(getContext()), scriptArgsTypes) } - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult { + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult { fun ReplCompileResult.Error.locationString() = if (location == CompilerMessageLocation.NO_LOCATION) "" @@ -81,6 +81,6 @@ class KotlinJsr223JvmScriptEngine4Idea( is ReplCompileResult.CompiledClasses -> compileResult } - return localEvaluator.eval(codeLine, history, compiled.classes, compiled.hasResult, compiled.newClasspath) + return localEvaluator.eval(codeLine, history, compiled.classes, compiled.hasResult, compiled.classpathAddendum) } } diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmDaemonScriptEngines.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmDaemonScriptEngines.kt index 21500bee019..8e058dd6a1b 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmDaemonScriptEngines.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmDaemonScriptEngines.kt @@ -57,7 +57,7 @@ class KotlinJsr223JvmDaemonLocalEvalScriptEngine( // TODO: bindings passing works only once on the first eval, subsequent setContext/setBindings call have no effect. Consider making it dynamic, but take history into account val localEvaluator by lazy { GenericReplCompiledEvaluator(templateClasspath, Thread.currentThread().contextClassLoader, getScriptArgs(getContext()), scriptArgsTypes) } - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult { + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult { fun ReplCompileResult.Error.locationString() = if (location == CompilerMessageLocation.NO_LOCATION) "" else " at ${location.line}:${location.column}:" @@ -70,7 +70,7 @@ class KotlinJsr223JvmDaemonLocalEvalScriptEngine( is ReplCompileResult.CompiledClasses -> compileResult } - return localEvaluator.eval(codeLine, history, compiled.classes, compiled.hasResult, compiled.newClasspath) + return localEvaluator.eval(codeLine, history, compiled.classes, compiled.hasResult, compiled.classpathAddendum) } } @@ -110,7 +110,7 @@ class KotlinJsr223JvmDaemonRemoteEvalScriptEngine( } } - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult = repl.eval(codeLine, history) + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult = repl.eval(codeLine, history) } private fun connectToCompileService(compilerJar: File): CompileService { diff --git a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt index 62124ede3d6..ae6cf4fd7d8 100644 --- a/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt +++ b/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223JvmLocalScriptEngine.kt @@ -105,7 +105,7 @@ class KotlinJsr223JvmLocalScriptEngine( put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") } - override fun eval(codeLine: ReplCodeLine, history: Iterable): ReplEvalResult { + override fun eval(codeLine: ReplCodeLine, history: List): ReplEvalResult { val evalResult = repl.eval(codeLine, history) messageCollector.resetAndThrowOnErrors() return evalResult