Implement IR backend support in scripting tests, enable for some tests

This commit is contained in:
Ilya Chernikov
2020-11-26 19:14:36 +01:00
parent d1ee05c7f6
commit 4c6b5ff0b8
12 changed files with 76 additions and 22 deletions
+3 -1
View File
@@ -729,7 +729,8 @@ tasks {
register("scriptingTest") {
dependsOn("dist")
dependsOn(":kotlin-script-util:test")
dependsOn(":kotlin-scripting-compiler-embeddable:test")
dependsOn(":kotlin-scripting-compiler:test")
dependsOn(":kotlin-scripting-compiler:testWithIr")
dependsOn(":kotlin-scripting-common:test")
dependsOn(":kotlin-scripting-jvm:test")
dependsOn(":kotlin-scripting-jvm-host-test:test")
@@ -740,6 +741,7 @@ tasks {
// dependsOn(":kotlin-scripting-jvm-host-test:embeddableTest")
dependsOn(":kotlin-scripting-jsr223-test:embeddableTest")
dependsOn(":kotlin-main-kts-test:test")
dependsOn(":kotlin-main-kts-test:testWithIr")
dependsOn(":kotlin-scripting-ide-services-test:test")
dependsOn(":kotlin-scripting-ide-services-test:embeddableTest")
dependsOn(":kotlin-scripting-js-test:test")
@@ -24,3 +24,9 @@ projectTest(parallel = true) {
dependsOn(":dist")
workingDir = rootDir
}
projectTest(taskName = "testWithIr", parallel = true) {
dependsOn(":dist")
workingDir = rootDir
systemProperty("kotlin.script.test.base.compiler.arguments", "-Xuse-ir")
}
@@ -62,3 +62,11 @@ projectTest(parallel = true) {
workingDir = rootDir
systemProperty("kotlin.test.script.classpath", testSourceSet.output.classesDirs.joinToString(File.pathSeparator))
}
projectTest(taskName = "testWithIr", parallel = true) {
dependsOn(":dist")
workingDir = rootDir
systemProperty("kotlin.test.script.classpath", testSourceSet.output.classesDirs.joinToString(File.pathSeparator))
systemProperty("kotlin.script.test.base.compiler.arguments", "-Xuse-ir")
}
@@ -163,29 +163,40 @@ private fun CompilerConfiguration.updateWithCompilerOptions(
messageCollector: ScriptDiagnosticsMessageCollector,
ignoredOptionsReportingState: IgnoredOptionsReportingState,
isRefinement: Boolean
) {
updateWithCompilerOptions(compilerOptions) {
validateArguments(it.errors)?.let { error ->
messageCollector.report(CompilerMessageSeverity.ERROR, error)
false
} ?: run {
messageCollector.reportArgumentParseProblems(it)
reportArgumentsIgnoredGenerally(
it,
messageCollector,
ignoredOptionsReportingState
)
if (isRefinement) {
reportArgumentsIgnoredFromRefinement(
it,
messageCollector,
ignoredOptionsReportingState
)
}
true
}
}
}
internal fun CompilerConfiguration.updateWithCompilerOptions(
compilerOptions: List<String>,
validate: (K2JVMCompilerArguments) -> Boolean = {
validateArguments(it.errors)?.let { throw Exception("Error parsing arguments: $it") } ?: true
}
) {
val compilerArguments = K2JVMCompilerArguments()
parseCommandLineArguments(compilerOptions, compilerArguments)
validateArguments(compilerArguments.errors)?.let {
messageCollector.report(CompilerMessageSeverity.ERROR, it)
return
}
messageCollector.reportArgumentParseProblems(compilerArguments)
reportArgumentsIgnoredGenerally(
compilerArguments,
messageCollector,
ignoredOptionsReportingState
)
if (isRefinement) {
reportArgumentsIgnoredFromRefinement(
compilerArguments,
messageCollector,
ignoredOptionsReportingState
)
}
if (!validate(compilerArguments)) return
processPluginsCommandLine(compilerArguments)
@@ -11,8 +11,8 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
@@ -65,6 +65,7 @@ class ScriptingCompilerPluginTest : TestCase() {
confBody: CompilerConfiguration.() -> Unit
): KotlinCoreEnvironment {
val configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.NO_KOTLIN_REFLECT, TestJdkKind.FULL_JDK).apply {
updateWithBaseCompilerArguments()
put<MessageCollector>(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
addKotlinSourceRoots(sources)
put(JVMConfigurationKeys.OUTPUT_DIRECTORY, destDir)
@@ -9,6 +9,8 @@ import com.intellij.openapi.Disposable
import com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.cli.common.CLITool
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.updateWithCompilerOptions
import org.junit.Assert
import java.io.ByteArrayOutputStream
import java.io.File
@@ -18,6 +20,11 @@ import java.nio.file.Files
import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
const val SCRIPT_TEST_BASE_COMPILER_ARGUMENTS_PROPERTY = "kotlin.script.test.base.compiler.arguments"
private fun getBaseCompilerArgumentsFromProperty(): List<String>? =
System.getProperty(SCRIPT_TEST_BASE_COMPILER_ARGUMENTS_PROPERTY)?.takeIf { it.isNotBlank() }?.split(' ')
// TODO: partially copypasted from LauncherReplTest, consider extracting common parts to some (new) test util module
fun runWithKotlinc(
scriptPath: String,
@@ -52,6 +59,7 @@ fun runWithKotlinLauncherScript(
add("-cp")
add(classpath.joinToString(File.pathSeparator))
}
getBaseCompilerArgumentsFromProperty()?.let { addAll(it) }
addAll(compilerArgs)
}
@@ -161,10 +169,11 @@ fun runWithK2JVMCompiler(
expectedExitCode: Int = 0,
expectedSomeErrPatterns: List<String>? = null
) {
val argsWithBasefromProp = getBaseCompilerArgumentsFromProperty()?.let { (it + args).toTypedArray() } ?: args
val (out, err, ret) = captureOutErrRet {
CLITool.doMainNoExit(
K2JVMCompiler(),
args
argsWithBasefromProp
)
}
try {
@@ -243,4 +252,9 @@ class TestDisposable : Disposable {
}
}
fun CompilerConfiguration.updateWithBaseCompilerArguments() {
getBaseCompilerArgumentsFromProperty()?.let {
updateWithCompilerOptions(it)
}
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.script.loadScriptingPlugin
import org.jetbrains.kotlin.scripting.compiler.plugin.TestDisposable
import org.jetbrains.kotlin.scripting.compiler.plugin.updateWithBaseCompilerArguments
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.test.ConfigurationKind
@@ -58,6 +59,7 @@ class CollectScriptCompilationDependenciesTest : TestCase() {
private fun runTest(scriptFile: String, expectedDependencies: List<String>, classPath: List<File> = emptyList()) {
val configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.NO_KOTLIN_REFLECT, TestJdkKind.MOCK_JDK).apply {
updateWithBaseCompilerArguments()
add(
ScriptingConfigurationKeys.SCRIPT_DEFINITIONS,
ScriptDefinition.FromTemplate(
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.script.loadScriptingPlugin
import org.jetbrains.kotlin.scripting.compiler.plugin.TestDisposable
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.ScriptJvmCompilerFromEnvironment
import org.jetbrains.kotlin.scripting.compiler.plugin.updateWithBaseCompilerArguments
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider
@@ -94,6 +95,7 @@ class CompileTimeFibonacciTest : TestCase() {
script: SourceCode
): ResultWithDiagnostics<CompiledScript> {
val configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.NO_KOTLIN_REFLECT, TestJdkKind.FULL_JDK).apply {
updateWithBaseCompilerArguments()
val hostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration)
add(
ScriptingConfigurationKeys.SCRIPT_DEFINITIONS,
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.TestDisposable
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.ScriptDiagnosticsMessageCollector
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.createCompilationContextFromEnvironment
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.getScriptKtFile
import org.jetbrains.kotlin.scripting.compiler.plugin.updateWithBaseCompilerArguments
import org.jetbrains.kotlin.scripting.resolve.InvalidScriptResolverAnnotation
import org.jetbrains.kotlin.scripting.resolve.getScriptCollectedData
import org.jetbrains.kotlin.test.ConfigurationKind
@@ -99,6 +100,7 @@ class ConstructAnnotationTest : TestCase() {
private fun annotations(filename: String, vararg classes: KClass<out Annotation>): ResultWithDiagnostics<List<Annotation>> {
val file = File(testDataPath, filename)
val compilationConfiguration = KotlinTestUtils.newConfiguration(ConfigurationKind.NO_KOTLIN_REFLECT, TestJdkKind.MOCK_JDK).apply {
updateWithBaseCompilerArguments()
addKotlinSourceRoot(file.path)
loadScriptingPlugin(this)
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.script.loadScriptingPlugin
import org.jetbrains.kotlin.scripting.compiler.plugin.TestDisposable
import org.jetbrains.kotlin.scripting.compiler.plugin.TestMessageCollector
import org.jetbrains.kotlin.scripting.compiler.plugin.updateWithBaseCompilerArguments
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.test.ConfigurationKind
@@ -67,6 +68,7 @@ class ScriptCliCompilationTest : TestCase() {
val collector = TestMessageCollector()
val configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.NO_KOTLIN_REFLECT, TestJdkKind.FULL_JDK).apply {
updateWithBaseCompilerArguments()
put(MESSAGE_COLLECTOR_KEY, collector)
if (scriptDef != null) {
val hostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.script.loadScriptingPlugin
import org.jetbrains.kotlin.scripting.compiler.plugin.TestMessageCollector
import org.jetbrains.kotlin.scripting.compiler.plugin.assertHasMessage
import org.jetbrains.kotlin.scripting.compiler.plugin.updateWithBaseCompilerArguments
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
@@ -368,6 +369,7 @@ class ScriptTemplateTest : TestCase() {
TestJdkKind.FULL_JDK,
*additionalClasspath
)
configuration.updateWithBaseCompilerArguments()
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
configuration.add(
ScriptingConfigurationKeys.SCRIPT_DEFINITIONS,
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.codegen.CompilationException
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.script.loadScriptingPlugin
import org.jetbrains.kotlin.scripting.compiler.plugin.updateWithBaseCompilerArguments
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
@@ -118,6 +119,7 @@ class ScriptTest : TestCase() {
val rootDisposable = Disposer.newDisposable()
try {
val configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.ALL, TestJdkKind.FULL_JDK)
configuration.updateWithBaseCompilerArguments()
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
configuration.add(
ScriptingConfigurationKeys.SCRIPT_DEFINITIONS,