From 771f5c13dd45cff10f11b1da984be09ce22d1a6e Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 4 Sep 2019 16:18:12 +0200 Subject: [PATCH] Fix imported script functionality in JSR-223/REPL: - setup compilation properly to take imported scripts into account - add compiled imported scripts into generated results = calculate ScriptLightVirtualFile path as relative - simplifies imported scripts location --- .../jvmhost/test/ScriptingHostTest.kt | 2 +- .../kotlin/mainKts/test/mainKtsJsr223Test.kt | 17 +++++++++++++++++ .../kotlin/mainKts/test/mainKtsTest.kt | 6 +++--- .../resolve/refineCompilationConfiguration.kt | 4 ++-- .../plugin/impl/KJvmReplCompilerImpl.kt | 2 +- .../compiler/plugin/repl/ReplCodeAnalyzer.kt | 4 +++- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt index b230a9324d7..8c08ab9ff77 100644 --- a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt +++ b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt @@ -267,7 +267,7 @@ class ScriptingHostTest : TestCase() { assertTrue(res is ResultWithDiagnostics.Failure) val report = res.reports.find { it.message.startsWith("Source file or directory not found") } assertNotNull(report) - assertEquals("/script.kts", report?.sourcePath) + assertEquals("script.kts", report?.sourcePath) } @Test diff --git a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsJsr223Test.kt b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsJsr223Test.kt index b5bf9eddca7..e9c77b9ad9a 100644 --- a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsJsr223Test.kt +++ b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsJsr223Test.kt @@ -1,4 +1,6 @@ import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback +import org.jetbrains.kotlin.mainKts.test.TEST_DATA_ROOT +import org.jetbrains.kotlin.mainKts.test.captureOut import org.junit.Assert import org.junit.Test import javax.script.ScriptEngineManager @@ -32,5 +34,20 @@ class MainKtsJsr223Test { val res2 = engine.eval("z * x") Assert.assertEquals(42, res2) } + + @Test + fun testWithImport() { + val engine = ScriptEngineManager().getEngineByExtension("main.kts")!! + val out = captureOut { + val res1 = engine.eval(""" + @file:Import("$TEST_DATA_ROOT/import-common.main.kts") + @file:Import("$TEST_DATA_ROOT/import-middle.main.kts") + sharedVar = sharedVar + 1 + println(sharedVar) + """.trimIndent()) + Assert.assertNull(res1) + }.lines() + Assert.assertEquals(listOf("Hi from common", "Hi from middle", "5"), out) + } } diff --git a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt index a9870426463..edc8bad6d88 100644 --- a/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt +++ b/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt @@ -12,10 +12,10 @@ import java.io.File import java.io.PrintStream import kotlin.script.experimental.api.* import kotlin.script.experimental.host.toScriptSource -import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost -import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate import kotlin.script.experimental.jvm.baseClassLoader import kotlin.script.experimental.jvm.jvm +import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost +import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate fun evalFile(scriptFile: File): ResultWithDiagnostics { @@ -107,7 +107,7 @@ class MainKtsTest { } } -private fun captureOut(body: () -> Unit): String { +internal fun captureOut(body: () -> Unit): String { val outStream = ByteArrayOutputStream() val prevOut = System.out System.setOut(PrintStream(outStream)) diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt index 8d45a256af3..68bf0fe4082 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt @@ -30,7 +30,6 @@ import kotlin.script.experimental.dependencies.ScriptDependencies import kotlin.script.experimental.host.* import kotlin.script.experimental.jvm.* import kotlin.script.experimental.jvm.compat.mapToDiagnostics -import kotlin.script.experimental.jvm.impl.refineWith import kotlin.script.experimental.jvm.impl.toClassPathOrEmpty import kotlin.script.experimental.jvm.impl.toDependencies @@ -97,7 +96,8 @@ class ScriptLightVirtualFile(name: String, private val _path: String?, text: Str charset = CharsetToolkit.UTF8_CHARSET } - override fun getPath(): String = _path ?: super.getPath() + override fun getPath(): String = _path ?: if (parent != null) parent.path + "/" + name else name + override fun getCanonicalPath(): String? = path } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerImpl.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerImpl.kt index 2b73ff71c76..faea2b633af 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerImpl.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/KJvmReplCompilerImpl.kt @@ -140,7 +140,7 @@ class KJvmReplCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) : KotlinCodegenFacade.generatePackage( generationState, snippetKtFile.script!!.containingKtFile.packageFqName, - setOf(snippetKtFile.script!!.containingKtFile), + sourceFiles, CompilationErrorHandler.THROW_EXCEPTION ) diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplCodeAnalyzer.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplCodeAnalyzer.kt index 30eff7e9140..db2a75a2876 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplCodeAnalyzer.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/repl/ReplCodeAnalyzer.kt @@ -103,7 +103,9 @@ class ReplCodeAnalyzer(environment: KotlinCoreEnvironment) { } private fun doAnalyze(linePsi: KtFile, importedScripts: List, codeLine: ReplCodeLine): ReplLineAnalysisResult { - scriptDeclarationFactory.setDelegateFactory(FileBasedDeclarationProviderFactory(resolveSession.storageManager, listOf(linePsi))) + scriptDeclarationFactory.setDelegateFactory( + FileBasedDeclarationProviderFactory(resolveSession.storageManager, listOf(linePsi) + importedScripts) + ) replState.submitLine(linePsi, codeLine) val context = topDownAnalyzer.analyzeDeclarations(topDownAnalysisContext.topDownAnalysisMode, listOf(linePsi) + importedScripts)