Implement simple "add to compilation" functionality for scripts

(incomplete import - scripts added to the compilation but not yet
imported into scope)
Base functionality needed for #KT-27960
This commit is contained in:
Ilya Chernikov
2018-11-16 16:13:50 +01:00
parent 57c12476d7
commit 729ebcac9b
13 changed files with 298 additions and 84 deletions
@@ -15,6 +15,7 @@ dependencies {
compileOnly(project(":compiler:cli"))
compileOnly(intellijCoreDep())
runtime(projectRuntimeJar(":kotlin-compiler"))
testCompile(projectTests(":compiler:tests-common"))
testCompile(commonDep("junit"))
}
@@ -27,3 +28,6 @@ standardPublicJars()
publish()
projectTest {
workingDir = rootDir
}
@@ -16,15 +16,13 @@ import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.cli.jvm.compiler.*
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.cli.jvm.config.JvmModulePathRoot
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.modules.CoreJrtFileSystem
import org.jetbrains.kotlin.codegen.ClassBuilderFactories
import org.jetbrains.kotlin.codegen.CompilationErrorHandler
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.*
@@ -133,7 +131,9 @@ class KJvmCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) : KJvm
val psiFile: KtFile = psiFileFactory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, true, false) as KtFile?
?: return failure("Unable to make PSI file from script".asErrorDiagnostics())
val sourceFiles = listOf(psiFile)
val sourceFiles = arrayListOf(psiFile).also {
it.addAll(collectRequiredSourcesFromDependencies(kotlinCompilerConfiguration, environment.project, it))
}
analyzerWithCompilerReport.analyzeAndReport(sourceFiles) {
val project = environment.project
@@ -158,13 +158,7 @@ class KJvmCompilerImpl(val hostConfiguration: ScriptingHostConfiguration) : KJvm
sourceFiles,
kotlinCompilerConfiguration
).build()
generationState.beforeCompile()
KotlinCodegenFacade.generatePackage(
generationState,
psiFile.script!!.containingKtFile.packageFqName,
setOf(psiFile.script!!.containingKtFile),
org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION
)
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
val res = KJvmCompiledScript<Any>(updatedConfiguration, generationState, scriptFileName.capitalize())
@@ -5,6 +5,7 @@
package kotlin.script.experimental.jvmhost.test
import junit.framework.TestCase
import kotlinx.coroutines.runBlocking
import org.junit.Assert
import org.junit.Test
@@ -21,7 +22,11 @@ import kotlin.script.experimental.jvmhost.impl.CompiledScriptClassLoader
import kotlin.script.experimental.jvmhost.impl.KJvmCompiledScript
import kotlin.script.templates.standard.SimpleScriptTemplate
class ScriptingHostTest {
class ScriptingHostTest : TestCase() {
companion object {
const val TEST_DATA_DIR = "libraries/scripting/jvm-host/testData"
}
@Test
fun testSimpleUsage() {
@@ -32,6 +37,19 @@ class ScriptingHostTest {
Assert.assertEquals(greeting, output)
}
@Test
fun testSimpleRequire() {
val greeting = "Hello from required!"
val script = "val subj = RequiredClass().value\nprintln(\"Hello from \$subj!\")"
val compilationConfiguration = createJvmCompilationConfigurationFromTemplate<SimpleScriptTemplate> {
importScripts(File(TEST_DATA_DIR, "importTest/requiredSrc.kt").toScriptSource())
}
val output = captureOut {
BasicJvmScriptingHost().eval(script.toScriptSource(), compilationConfiguration, null).throwOnFailure()
}
Assert.assertEquals(greeting, output)
}
@Test
fun testMemoryCache() {
val script = "val x = 1\nprintln(\"x = \$x\")"
@@ -0,0 +1,5 @@
class RequiredClass {
val value = "required"
}