Put lines history into all data structures returned by repl, refactor storage and passing of the history for that
This commit is contained in:
+10
-10
@@ -30,12 +30,12 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable<File>, baseClass
|
|||||||
|
|
||||||
private class ClassWithInstance(val klass: Class<*>, val instance: Any)
|
private class ClassWithInstance(val klass: Class<*>, val instance: Any)
|
||||||
|
|
||||||
private val compiledLoadedClassesHistory = arrayListOf<Pair<ReplCodeLine, ClassWithInstance>>()
|
private val compiledLoadedClassesHistory = ReplHistory<ClassWithInstance>()
|
||||||
|
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>, compiledClasses: List<CompiledClassData>, hasResult: Boolean, newClasspath: List<File>): ReplEvalResult {
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>, compiledClasses: List<CompiledClassData>, hasResult: Boolean, classpathAddendum: List<File>): ReplEvalResult {
|
||||||
|
|
||||||
checkAndUpdateReplHistoryCollection(compiledLoadedClassesHistory, history)?.let {
|
checkAndUpdateReplHistoryCollection(compiledLoadedClassesHistory, history)?.let {
|
||||||
return@eval ReplEvalResult.HistoryMismatch(it)
|
return@eval ReplEvalResult.HistoryMismatch(compiledLoadedClassesHistory.lines, it)
|
||||||
}
|
}
|
||||||
|
|
||||||
var mainLineClassName: String? = null
|
var mainLineClassName: String? = null
|
||||||
@@ -43,9 +43,9 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable<File>, baseClass
|
|||||||
fun classNameFromPath(path: String) = JvmClassName.byInternalName(path.replaceFirst("\\.class$".toRegex(), ""))
|
fun classNameFromPath(path: String) = JvmClassName.byInternalName(path.replaceFirst("\\.class$".toRegex(), ""))
|
||||||
|
|
||||||
classLoaderLock.read {
|
classLoaderLock.read {
|
||||||
if (newClasspath.isNotEmpty()) {
|
if (classpathAddendum.isNotEmpty()) {
|
||||||
classLoaderLock.write {
|
classLoaderLock.write {
|
||||||
classLoader = makeReplClassLoader(classLoader, newClasspath)
|
classLoader = makeReplClassLoader(classLoader, classpathAddendum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compiledClasses.filter { it.path.endsWith(".class") }
|
compiledClasses.filter { it.path.endsWith(".class") }
|
||||||
@@ -68,10 +68,10 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable<File>, baseClass
|
|||||||
}
|
}
|
||||||
|
|
||||||
val constructorParams: Array<Class<*>> =
|
val constructorParams: Array<Class<*>> =
|
||||||
(compiledLoadedClassesHistory.map { it.second.klass } +
|
(compiledLoadedClassesHistory.values.map { it.klass } +
|
||||||
(scriptArgs?.mapIndexed { i, it -> scriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList())
|
(scriptArgs?.mapIndexed { i, it -> scriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList())
|
||||||
).toTypedArray()
|
).toTypedArray()
|
||||||
val constructorArgs: Array<Any?> = (compiledLoadedClassesHistory.map { it.second.instance } + scriptArgs.orEmpty()).toTypedArray()
|
val constructorArgs: Array<Any?> = (compiledLoadedClassesHistory.values.map { it.instance } + scriptArgs.orEmpty()).toTypedArray()
|
||||||
|
|
||||||
val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams)
|
val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams)
|
||||||
val scriptInstance =
|
val scriptInstance =
|
||||||
@@ -80,15 +80,15 @@ open class GenericReplCompiledEvaluator(baseClasspath: Iterable<File>, baseClass
|
|||||||
}
|
}
|
||||||
catch (e: Throwable) {
|
catch (e: Throwable) {
|
||||||
// ignore everything in the stack trace until this constructor call
|
// ignore everything in the stack trace until this constructor call
|
||||||
return ReplEvalResult.Error.Runtime(renderReplStackTrace(e.cause!!, startFromMethodName = "${scriptClass.name}.<init>"))
|
return ReplEvalResult.Error.Runtime(compiledLoadedClassesHistory.lines, renderReplStackTrace(e.cause!!, startFromMethodName = "${scriptClass.name}.<init>"))
|
||||||
}
|
}
|
||||||
|
|
||||||
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 rvField = scriptClass.getDeclaredField(SCRIPT_RESULT_FIELD_NAME).apply { isAccessible = true }
|
||||||
val rv: Any? = rvField.get(scriptInstance)
|
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 {
|
companion object {
|
||||||
|
|||||||
+29
-2
@@ -19,13 +19,16 @@ package org.jetbrains.kotlin.cli.common.repl
|
|||||||
import java.io.Reader
|
import java.io.Reader
|
||||||
import javax.script.*
|
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 var lineCount = 0
|
||||||
|
|
||||||
protected val history = arrayListOf<ReplCodeLine>()
|
protected val history = arrayListOf<ReplCodeLine>()
|
||||||
|
|
||||||
abstract fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult
|
abstract fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult
|
||||||
|
|
||||||
override fun eval(script: String, context: ScriptContext?): Any? {
|
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 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 <T : Any?> getInterface(p0: Class<T>?): T {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T : Any?> getInterface(p0: Any?, p1: Class<T>?): 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 createBindings(): Bindings = SimpleBindings()
|
||||||
|
|
||||||
override fun getFactory(): ScriptEngineFactory = myFactory
|
override fun getFactory(): ScriptEngineFactory = myFactory
|
||||||
|
|||||||
@@ -35,10 +35,14 @@ data class CompiledClassData(val path: String, val bytes: ByteArray) : Serializa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class ReplCheckResult : Serializable {
|
sealed class ReplCheckResult(val updatedHistory: List<ReplCodeLine>) : Serializable {
|
||||||
object Ok : ReplCheckResult()
|
class Ok(updatedHistory: List<ReplCodeLine>) : ReplCheckResult(updatedHistory)
|
||||||
object Incomplete : ReplCheckResult()
|
class Incomplete(updatedHistory: List<ReplCodeLine>) : ReplCheckResult(updatedHistory)
|
||||||
class Error(val message: String, val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION) : ReplCheckResult() {
|
class Error(updatedHistory: List<ReplCodeLine>,
|
||||||
|
val message: String,
|
||||||
|
val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION
|
||||||
|
) : ReplCheckResult(updatedHistory)
|
||||||
|
{
|
||||||
override fun toString(): String = "Error(message = \"$message\""
|
override fun toString(): String = "Error(message = \"$message\""
|
||||||
}
|
}
|
||||||
companion object {
|
companion object {
|
||||||
@@ -46,11 +50,19 @@ sealed class ReplCheckResult : Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class ReplCompileResult : Serializable {
|
sealed class ReplCompileResult(val updatedHistory: List<ReplCodeLine>) : Serializable {
|
||||||
class CompiledClasses(val classes: List<CompiledClassData>, val hasResult: Boolean, val newClasspath: List<File>) : ReplCompileResult()
|
class CompiledClasses(updatedHistory: List<ReplCodeLine>,
|
||||||
object Incomplete : ReplCompileResult()
|
val classes: List<CompiledClassData>,
|
||||||
class HistoryMismatch(val lineNo: Int): ReplCompileResult()
|
val hasResult: Boolean,
|
||||||
class Error(val message: String, val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION) : ReplCompileResult() {
|
val classpathAddendum: List<File>
|
||||||
|
) : ReplCompileResult(updatedHistory)
|
||||||
|
class Incomplete(updatedHistory: List<ReplCodeLine>) : ReplCompileResult(updatedHistory)
|
||||||
|
class HistoryMismatch(updatedHistory: List<ReplCodeLine>, val lineNo: Int): ReplCompileResult(updatedHistory)
|
||||||
|
class Error(updatedHistory: List<ReplCodeLine>,
|
||||||
|
val message: String,
|
||||||
|
val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION
|
||||||
|
) : ReplCompileResult(updatedHistory)
|
||||||
|
{
|
||||||
override fun toString(): String = "Error(message = \"$message\""
|
override fun toString(): String = "Error(message = \"$message\""
|
||||||
}
|
}
|
||||||
companion object {
|
companion object {
|
||||||
@@ -58,16 +70,19 @@ sealed class ReplCompileResult : Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class ReplEvalResult : Serializable {
|
sealed class ReplEvalResult(val updatedHistory: List<ReplCodeLine>) : Serializable {
|
||||||
class ValueResult(val value: Any?) : ReplEvalResult() {
|
class ValueResult(updatedHistory: List<ReplCodeLine>, val value: Any?) : ReplEvalResult(updatedHistory) {
|
||||||
override fun toString(): String = "Result: $value"
|
override fun toString(): String = "Result: $value"
|
||||||
}
|
}
|
||||||
object UnitResult : ReplEvalResult()
|
class UnitResult(updatedHistory: List<ReplCodeLine>) : ReplEvalResult(updatedHistory)
|
||||||
object Incomplete : ReplEvalResult()
|
class Incomplete(updatedHistory: List<ReplCodeLine>) : ReplEvalResult(updatedHistory)
|
||||||
class HistoryMismatch(val lineNo: Int): ReplEvalResult()
|
class HistoryMismatch(updatedHistory: List<ReplCodeLine>, val lineNo: Int): ReplEvalResult(updatedHistory)
|
||||||
sealed class Error(val message: String) : ReplEvalResult() {
|
sealed class Error(updatedHistory: List<ReplCodeLine>, val message: String) : ReplEvalResult(updatedHistory) {
|
||||||
class Runtime(message: String) : Error(message)
|
class Runtime(updatedHistory: List<ReplCodeLine>, message: String) : Error(updatedHistory, message)
|
||||||
class CompileTime(message: String, val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION) : Error(message)
|
class CompileTime(updatedHistory: List<ReplCodeLine>,
|
||||||
|
message: String,
|
||||||
|
val location: CompilerMessageLocation = CompilerMessageLocation.NO_LOCATION
|
||||||
|
) : Error(updatedHistory, message)
|
||||||
override fun toString(): String = "${this::class.simpleName}Error(message = \"$message\""
|
override fun toString(): String = "${this::class.simpleName}Error(message = \"$message\""
|
||||||
}
|
}
|
||||||
companion object {
|
companion object {
|
||||||
@@ -76,16 +91,16 @@ sealed class ReplEvalResult : Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface ReplChecker {
|
interface ReplChecker {
|
||||||
fun check(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCheckResult
|
fun check(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCheckResult
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ReplCompiler : ReplChecker {
|
interface ReplCompiler : ReplChecker {
|
||||||
fun compile(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCompileResult
|
fun compile(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCompileResult
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ReplCompiledEvaluator {
|
interface ReplCompiledEvaluator {
|
||||||
|
|
||||||
fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>, compiledClasses: List<CompiledClassData>, hasResult: Boolean, newClasspath: List<File>): ReplEvalResult
|
fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>, compiledClasses: List<CompiledClassData>, hasResult: Boolean, classpathAddendum: List<File>): ReplEvalResult
|
||||||
|
|
||||||
// override to capture output
|
// override to capture output
|
||||||
fun<T> evalWithIO(body: () -> T): T = body()
|
fun<T> evalWithIO(body: () -> T): T = body()
|
||||||
@@ -94,7 +109,7 @@ interface ReplCompiledEvaluator {
|
|||||||
|
|
||||||
interface ReplEvaluator : ReplChecker {
|
interface ReplEvaluator : ReplChecker {
|
||||||
|
|
||||||
fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult
|
fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult
|
||||||
|
|
||||||
// override to capture output
|
// override to capture output
|
||||||
fun<T> evalWithIO(body: () -> T): T = body()
|
fun<T> evalWithIO(body: () -> T): T = body()
|
||||||
|
|||||||
@@ -17,16 +17,42 @@
|
|||||||
package org.jetbrains.kotlin.cli.common.repl
|
package org.jetbrains.kotlin.cli.common.repl
|
||||||
|
|
||||||
import com.google.common.base.Throwables
|
import com.google.common.base.Throwables
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
fun <T> checkAndUpdateReplHistoryCollection(col: MutableList<Pair<ReplCodeLine, T>>, baseHistory: Iterable<ReplCodeLine>): Int? {
|
// TODO: thread safety!!
|
||||||
val baseHistoryIt = baseHistory.iterator()
|
data class ReplHistory<T>(
|
||||||
|
val lines: MutableList<ReplCodeLine> = arrayListOf(),
|
||||||
|
val values: MutableList<T> = 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 <T> checkAndUpdateReplHistoryCollection(history: ReplHistory<T>, linesHistory: Iterable<ReplCodeLine>): Int? {
|
||||||
|
assert(history.isValid())
|
||||||
|
val linesHistoryIt = linesHistory.iterator()
|
||||||
var idx = 0
|
var idx = 0
|
||||||
while (baseHistoryIt.hasNext()) {
|
while (linesHistoryIt.hasNext()) {
|
||||||
val curLine = baseHistoryIt.next()
|
val curLine = linesHistoryIt.next()
|
||||||
if (col[idx].first != curLine) return curLine.no
|
if (history.lines[idx] != curLine) return curLine.no
|
||||||
idx += 1
|
idx += 1
|
||||||
}
|
}
|
||||||
col.dropLast(col.size - idx)
|
history.trimAt(idx)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ open class GenericReplChecker(
|
|||||||
fun createDiagnosticHolder() = ReplTerminalDiagnosticMessageHolder()
|
fun createDiagnosticHolder() = ReplTerminalDiagnosticMessageHolder()
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
override fun check(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCheckResult {
|
override fun check(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCheckResult {
|
||||||
val virtualFile =
|
val virtualFile =
|
||||||
LightVirtualFile("line${codeLine.no}${KotlinParserDefinition.STD_SCRIPT_EXT}", KotlinLanguage.INSTANCE, codeLine.code).apply {
|
LightVirtualFile("line${codeLine.no}${KotlinParserDefinition.STD_SCRIPT_EXT}", KotlinLanguage.INSTANCE, codeLine.code).apply {
|
||||||
charset = CharsetToolkit.UTF8_CHARSET
|
charset = CharsetToolkit.UTF8_CHARSET
|
||||||
@@ -91,9 +91,9 @@ open class GenericReplChecker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
syntaxErrorReport.isHasErrors && syntaxErrorReport.isAllErrorsAtEof -> ReplCheckResult.Incomplete
|
syntaxErrorReport.isHasErrors && syntaxErrorReport.isAllErrorsAtEof -> ReplCheckResult.Incomplete(history)
|
||||||
syntaxErrorReport.isHasErrors -> ReplCheckResult.Error(errorHolder.renderedDiagnostics)
|
syntaxErrorReport.isHasErrors -> ReplCheckResult.Error(history, errorHolder.renderedDiagnostics)
|
||||||
else -> ReplCheckResult.Ok
|
else -> ReplCheckResult.Ok(history)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,21 +109,21 @@ open class GenericReplCompiler(
|
|||||||
|
|
||||||
private var lastDependencies: KotlinScriptExternalDependencies? = null
|
private var lastDependencies: KotlinScriptExternalDependencies? = null
|
||||||
|
|
||||||
private val descriptorsHistory = arrayListOf<Pair<ReplCodeLine, ScriptDescriptor>>()
|
private val descriptorsHistory = ReplHistory<ScriptDescriptor>()
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
override fun compile(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCompileResult {
|
override fun compile(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCompileResult {
|
||||||
checkAndUpdateReplHistoryCollection(descriptorsHistory, history)?.let {
|
checkAndUpdateReplHistoryCollection(descriptorsHistory, history)?.let {
|
||||||
return@compile ReplCompileResult.HistoryMismatch(it)
|
return@compile ReplCompileResult.HistoryMismatch(descriptorsHistory.lines, it)
|
||||||
}
|
}
|
||||||
|
|
||||||
val (psiFile, errorHolder) = run {
|
val (psiFile, errorHolder) = run {
|
||||||
if (lineState == null || lineState!!.codeLine != codeLine) {
|
if (lineState == null || lineState!!.codeLine != codeLine) {
|
||||||
val res = check(codeLine, history)
|
val res = check(codeLine, history)
|
||||||
when (res) {
|
when (res) {
|
||||||
ReplCheckResult.Incomplete -> return@compile ReplCompileResult.Incomplete
|
is ReplCheckResult.Incomplete -> return@compile ReplCompileResult.Incomplete(res.updatedHistory)
|
||||||
is ReplCheckResult.Error -> return@compile ReplCompileResult.Error(res.message, res.location)
|
is ReplCheckResult.Error -> return@compile ReplCompileResult.Error(res.updatedHistory, res.message, res.location)
|
||||||
ReplCheckResult.Ok -> {} // continue
|
is ReplCheckResult.Ok -> {} // continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Pair(lineState!!.psiFile, lineState!!.errorHolder)
|
Pair(lineState!!.psiFile, lineState!!.errorHolder)
|
||||||
@@ -137,7 +137,7 @@ open class GenericReplCompiler(
|
|||||||
val analysisResult = analyzerEngine.analyzeReplLine(psiFile, codeLine.no)
|
val analysisResult = analyzerEngine.analyzeReplLine(psiFile, codeLine.no)
|
||||||
AnalyzerWithCompilerReport.Companion.reportDiagnostics(analysisResult.diagnostics, errorHolder)
|
AnalyzerWithCompilerReport.Companion.reportDiagnostics(analysisResult.diagnostics, errorHolder)
|
||||||
val scriptDescriptor = when (analysisResult) {
|
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
|
is CliReplAnalyzerEngine.ReplLineAnalysisResult.Successful -> analysisResult.scriptDescriptor
|
||||||
else -> error("Unexpected result ${analysisResult.javaClass}")
|
else -> error("Unexpected result ${analysisResult.javaClass}")
|
||||||
}
|
}
|
||||||
@@ -151,7 +151,7 @@ open class GenericReplCompiler(
|
|||||||
compilerConfiguration
|
compilerConfiguration
|
||||||
)
|
)
|
||||||
state.replSpecific.scriptResultFieldName = SCRIPT_RESULT_FIELD_NAME
|
state.replSpecific.scriptResultFieldName = SCRIPT_RESULT_FIELD_NAME
|
||||||
state.replSpecific.earlierScriptsForReplInterpreter = descriptorsHistory.map { it.second }
|
state.replSpecific.earlierScriptsForReplInterpreter = descriptorsHistory.values
|
||||||
state.beforeCompile()
|
state.beforeCompile()
|
||||||
KotlinCodegenFacade.generatePackage(
|
KotlinCodegenFacade.generatePackage(
|
||||||
state,
|
state,
|
||||||
@@ -159,9 +159,10 @@ open class GenericReplCompiler(
|
|||||||
setOf(psiFile.script!!.getContainingKtFile()),
|
setOf(psiFile.script!!.getContainingKtFile()),
|
||||||
org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION)
|
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,
|
state.replSpecific.hasResult,
|
||||||
newDependencies?.let { environment.updateClasspath(it.classpath.map(::JvmClasspathRoot)) } ?: emptyList())
|
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)
|
private val compiledEvaluator = GenericReplCompiledEvaluator(compilerConfiguration.jvmClasspathRoots, baseClassloader, scriptArgs, scriptArgsTypes)
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult =
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult =
|
||||||
compileAndEval(this, compiledEvaluator, codeLine, history)
|
compileAndEval(this, compiledEvaluator, codeLine, history)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun compileAndEval(replCompiler: ReplCompiler, replCompiledEvaluator: ReplCompiledEvaluator, codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult =
|
fun compileAndEval(replCompiler: ReplCompiler, replCompiledEvaluator: ReplCompiledEvaluator, codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult =
|
||||||
replCompiler.compile(codeLine, history).let {
|
replCompiler.compile(codeLine, history).let {
|
||||||
when (it) {
|
when (it) {
|
||||||
ReplCompileResult.Incomplete -> ReplEvalResult.Incomplete
|
is ReplCompileResult.Incomplete -> ReplEvalResult.Incomplete(it.updatedHistory)
|
||||||
is ReplCompileResult.HistoryMismatch -> ReplEvalResult.HistoryMismatch(it.lineNo)
|
is ReplCompileResult.HistoryMismatch -> ReplEvalResult.HistoryMismatch(it.updatedHistory, it.lineNo)
|
||||||
is ReplCompileResult.Error -> ReplEvalResult.Error.CompileTime(it.message, it.location)
|
is ReplCompileResult.Error -> ReplEvalResult.Error.CompileTime(it.updatedHistory, it.message, it.location)
|
||||||
is ReplCompileResult.CompiledClasses -> replCompiledEvaluator.eval(codeLine, history, it.classes, it.hasResult, it.newClasspath)
|
is ReplCompileResult.CompiledClasses -> replCompiledEvaluator.eval(codeLine, history, it.classes, it.hasResult, it.classpathAddendum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -71,8 +71,8 @@ open class KotlinRemoteReplClientBase(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun check(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCheckResult {
|
override fun check(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCheckResult {
|
||||||
return compileService.remoteReplLineCheck(sessionId, codeLine, history.toList()).get()
|
return compileService.remoteReplLineCheck(sessionId, codeLine, history).get()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,8 +101,8 @@ class KotlinRemoteReplCompiler(
|
|||||||
operationsTracer = operationsTracer
|
operationsTracer = operationsTracer
|
||||||
), ReplCompiler {
|
), ReplCompiler {
|
||||||
|
|
||||||
override fun compile(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCompileResult {
|
override fun compile(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCompileResult {
|
||||||
return compileService.remoteReplLineCompile(sessionId, codeLine, history.toList()).get()
|
return compileService.remoteReplLineCompile(sessionId, codeLine, history).get()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +138,7 @@ class KotlinRemoteReplEvaluator(
|
|||||||
operationsTracer = operationsTracer
|
operationsTracer = operationsTracer
|
||||||
), ReplEvaluator {
|
), ReplEvaluator {
|
||||||
|
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult {
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult {
|
||||||
return compileService.remoteReplLineEval(sessionId, codeLine, history.toList()).get()
|
return compileService.remoteReplLineEval(sessionId, codeLine, history).get()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,11 +141,12 @@ open class KotlinJvmReplService(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun check(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCheckResult {
|
override fun check(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCheckResult {
|
||||||
operationsTracer?.before("check")
|
operationsTracer?.before("check")
|
||||||
try {
|
try {
|
||||||
return replCompiler?.check(codeLine, history)
|
return replCompiler?.check(codeLine, history)
|
||||||
?: ReplCheckResult.Error(messageCollector.firstErrorMessage ?: "Unknown error",
|
?: ReplCheckResult.Error(history,
|
||||||
|
messageCollector.firstErrorMessage ?: "Unknown error",
|
||||||
messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION)
|
messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION)
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
@@ -153,11 +154,12 @@ open class KotlinJvmReplService(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun compile(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplCompileResult {
|
override fun compile(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplCompileResult {
|
||||||
operationsTracer?.before("compile")
|
operationsTracer?.before("compile")
|
||||||
try {
|
try {
|
||||||
return replCompiler?.compile(codeLine, history)
|
return replCompiler?.compile(codeLine, history)
|
||||||
?: ReplCompileResult.Error(messageCollector.firstErrorMessage ?: "Unknown error",
|
?: ReplCompileResult.Error(history,
|
||||||
|
messageCollector.firstErrorMessage ?: "Unknown error",
|
||||||
messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION)
|
messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION)
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
@@ -165,11 +167,12 @@ open class KotlinJvmReplService(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult = synchronized(this) {
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult = synchronized(this) {
|
||||||
operationsTracer?.before("eval")
|
operationsTracer?.before("eval")
|
||||||
try {
|
try {
|
||||||
return replCompiler?.let { compileAndEval(it, compiledEvaluator, codeLine, history) }
|
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)
|
messageCollector.firstErrorLocation ?: CompilerMessageLocation.NO_LOCATION)
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class GenericReplTest : TestCase() {
|
|||||||
val res2c = res2 as? ReplCompileResult.CompiledClasses
|
val res2c = res2 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res2", res2c)
|
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
|
val res21e = res21 as? ReplEvalResult.ValueResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res21", res21e)
|
TestCase.assertNotNull("Unexpected eval result: $res21", res21e)
|
||||||
TestCase.assertEquals(3, res21e!!.value)
|
TestCase.assertEquals(3, res21e!!.value)
|
||||||
@@ -63,7 +63,7 @@ class GenericReplTest : TestCase() {
|
|||||||
val res3c = res3 as? ReplCompileResult.CompiledClasses
|
val res3c = res3 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res3", res3c)
|
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
|
val res31e = res31 as? ReplEvalResult.UnitResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res31", res31e)
|
TestCase.assertNotNull("Unexpected eval result: $res31", res31e)
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ class GenericReplTest : TestCase() {
|
|||||||
val res4c = res4 as? ReplCompileResult.CompiledClasses
|
val res4c = res4 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res4", res4c)
|
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
|
val res41e = res41 as? ReplEvalResult.ValueResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res41", res41e)
|
TestCase.assertNotNull("Unexpected eval result: $res41", res41e)
|
||||||
TestCase.assertEquals(7, res41e!!.value)
|
TestCase.assertEquals(7, res41e!!.value)
|
||||||
@@ -97,7 +97,7 @@ class GenericReplTest : TestCase() {
|
|||||||
val res1c = res1 as? ReplCompileResult.CompiledClasses
|
val res1c = res1 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res1", res1c)
|
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
|
val res11e = res11 as? ReplEvalResult.ValueResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res11", res11e)
|
TestCase.assertNotNull("Unexpected eval result: $res11", res11e)
|
||||||
TestCase.assertEquals(3, res11e!!.value)
|
TestCase.assertEquals(3, res11e!!.value)
|
||||||
@@ -107,7 +107,7 @@ class GenericReplTest : TestCase() {
|
|||||||
val res2c = res2 as? ReplCompileResult.CompiledClasses
|
val res2c = res2 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res2", res2c)
|
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
|
val res21e = res21 as? ReplEvalResult.ValueResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res21", res21e)
|
TestCase.assertNotNull("Unexpected eval result: $res21", res21e)
|
||||||
TestCase.assertEquals(5, res21e!!.value)
|
TestCase.assertEquals(5, res21e!!.value)
|
||||||
|
|||||||
@@ -515,7 +515,7 @@ class CompilerDaemonTest : KotlinIntegrationTestBase() {
|
|||||||
val res1c = res1 as? ReplCompileResult.CompiledClasses
|
val res1c = res1 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res1", res1c)
|
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
|
val res11e = res11 as? ReplEvalResult.UnitResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res11", res11e)
|
TestCase.assertNotNull("Unexpected eval result: $res11", res11e)
|
||||||
|
|
||||||
@@ -527,7 +527,7 @@ class CompilerDaemonTest : KotlinIntegrationTestBase() {
|
|||||||
val res2c = res2 as? ReplCompileResult.CompiledClasses
|
val res2c = res2 as? ReplCompileResult.CompiledClasses
|
||||||
TestCase.assertNotNull("Unexpected compile result: $res2", res2c)
|
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
|
val res21e = res21 as? ReplEvalResult.ValueResult
|
||||||
TestCase.assertNotNull("Unexpected eval result: $res21", res21e)
|
TestCase.assertNotNull("Unexpected eval result: $res21", res21e)
|
||||||
TestCase.assertEquals(7, res21e!!.value)
|
TestCase.assertEquals(7, res21e!!.value)
|
||||||
|
|||||||
@@ -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
|
// 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) }
|
val localEvaluator by lazy { GenericReplCompiledEvaluator(templateClasspath, Thread.currentThread().contextClassLoader, getScriptArgs(getContext()), scriptArgsTypes) }
|
||||||
|
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult {
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult {
|
||||||
|
|
||||||
fun ReplCompileResult.Error.locationString() =
|
fun ReplCompileResult.Error.locationString() =
|
||||||
if (location == CompilerMessageLocation.NO_LOCATION) ""
|
if (location == CompilerMessageLocation.NO_LOCATION) ""
|
||||||
@@ -81,6 +81,6 @@ class KotlinJsr223JvmScriptEngine4Idea(
|
|||||||
is ReplCompileResult.CompiledClasses -> compileResult
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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
|
// 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) }
|
val localEvaluator by lazy { GenericReplCompiledEvaluator(templateClasspath, Thread.currentThread().contextClassLoader, getScriptArgs(getContext()), scriptArgsTypes) }
|
||||||
|
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult {
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult {
|
||||||
|
|
||||||
fun ReplCompileResult.Error.locationString() = if (location == CompilerMessageLocation.NO_LOCATION) ""
|
fun ReplCompileResult.Error.locationString() = if (location == CompilerMessageLocation.NO_LOCATION) ""
|
||||||
else " at ${location.line}:${location.column}:"
|
else " at ${location.line}:${location.column}:"
|
||||||
@@ -70,7 +70,7 @@ class KotlinJsr223JvmDaemonLocalEvalScriptEngine(
|
|||||||
is ReplCompileResult.CompiledClasses -> compileResult
|
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<ReplCodeLine>): ReplEvalResult = repl.eval(codeLine, history)
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult = repl.eval(codeLine, history)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun connectToCompileService(compilerJar: File): CompileService {
|
private fun connectToCompileService(compilerJar: File): CompileService {
|
||||||
|
|||||||
+1
-1
@@ -105,7 +105,7 @@ class KotlinJsr223JvmLocalScriptEngine(
|
|||||||
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
|
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun eval(codeLine: ReplCodeLine, history: Iterable<ReplCodeLine>): ReplEvalResult {
|
override fun eval(codeLine: ReplCodeLine, history: List<ReplCodeLine>): ReplEvalResult {
|
||||||
val evalResult = repl.eval(codeLine, history)
|
val evalResult = repl.eval(codeLine, history)
|
||||||
messageCollector.resetAndThrowOnErrors()
|
messageCollector.resetAndThrowOnErrors()
|
||||||
return evalResult
|
return evalResult
|
||||||
|
|||||||
Reference in New Issue
Block a user