From b7e1dd96b2176eecb0b5fe258d2941ed435dcef1 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 5 Feb 2019 11:38:44 +0100 Subject: [PATCH] Supply proper classloader to the evaluator, add another test for function type and some minor refactoring --- .../kotlin/cli/jvm/repl/GenericReplTest.kt | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) 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 5f5fb9b0bb4..a75fc724de6 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/jvm/repl/GenericReplTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/cli/jvm/repl/GenericReplTest.kt @@ -91,7 +91,10 @@ class GenericReplTest : KtUsefulTestCase() { fun testCompilingReplEvaluator() { TestRepl().use { replBase -> - val repl = GenericReplCompilingEvaluator(replBase.replCompiler, replBase.baseClasspath, fallbackScriptArgs = replBase.emptyScriptArgs) + val repl = GenericReplCompilingEvaluator( + replBase.replCompiler, replBase.baseClasspath, Thread.currentThread().contextClassLoader, + fallbackScriptArgs = replBase.emptyScriptArgs + ) val state = repl.createState() @@ -132,6 +135,16 @@ class GenericReplTest : KtUsefulTestCase() { } } + fun testReplResultFieldWithFunction() { + TestRepl().use { repl -> + val state = repl.createState() + + assertEvalResultIs>(repl, state, "{ 1 + 2 }") + assertEvalResultIs>(repl, state, "res0") + assertEvalResult(repl, state, "res0()", 3) + } + } + fun testReplResultField() { TestRepl().use { repl -> val state = repl.createState() @@ -142,10 +155,7 @@ class GenericReplTest : KtUsefulTestCase() { } private fun assertEvalUnit(repl: TestRepl, state: IReplStageState<*>, line: String) { - val codeLine = repl.nextCodeLine(line) - val compileResult = repl.replCompiler.compile(state, codeLine) - val compiledClasses = compileResult as? ReplCompileResult.CompiledClasses - TestCase.assertNotNull("Unexpected compile result: $compileResult", compiledClasses) + val compiledClasses = checkCompile(repl, state, line) val evalResult = repl.compiledEvaluator.eval(state, compiledClasses!!) val unitResult = evalResult as? ReplEvalResult.UnitResult @@ -153,16 +163,30 @@ class GenericReplTest : KtUsefulTestCase() { } private fun assertEvalResult(repl: TestRepl, state: IReplStageState<*>, line: String, expectedResult: R) { - val codeLine = repl.nextCodeLine(line) - val compileResult = repl.replCompiler.compile(state, codeLine) - val compiledClasses = compileResult as? ReplCompileResult.CompiledClasses - TestCase.assertNotNull("Unexpected compile result: $compileResult", compiledClasses) + val compiledClasses = checkCompile(repl, state, line) val evalResult = repl.compiledEvaluator.eval(state, compiledClasses!!) val valueResult = evalResult as? ReplEvalResult.ValueResult TestCase.assertNotNull("Unexpected eval result: $evalResult", valueResult) TestCase.assertEquals(expectedResult, valueResult!!.value) } + + private inline fun assertEvalResultIs(repl: TestRepl, state: IReplStageState<*>, line: String) { + val compiledClasses = checkCompile(repl, state, line) + + val evalResult = repl.compiledEvaluator.eval(state, compiledClasses!!) + val valueResult = evalResult as? ReplEvalResult.ValueResult + TestCase.assertNotNull("Unexpected eval result: $evalResult", valueResult) + TestCase.assertTrue(valueResult!!.value is R) + } + + private fun checkCompile(repl: TestRepl, state: IReplStageState<*>, line: String): ReplCompileResult.CompiledClasses? { + val codeLine = repl.nextCodeLine(line) + val compileResult = repl.replCompiler.compile(state, codeLine) + val compiledClasses = compileResult as? ReplCompileResult.CompiledClasses + TestCase.assertNotNull("Unexpected compile result: $compileResult", compiledClasses) + return compiledClasses + } } @@ -200,7 +224,7 @@ internal class TestRepl( } val compiledEvaluator: ReplEvaluator by lazy { - GenericReplEvaluator(baseClasspath, null, emptyScriptArgs, repeatingMode) + GenericReplEvaluator(baseClasspath, Thread.currentThread().contextClassLoader, emptyScriptArgs, repeatingMode) } fun createState(lock: ReentrantReadWriteLock = ReentrantReadWriteLock()): IReplStageState<*> =