From dbadd5846a440eb98e913b8c64f7fef583129c0a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 15 Feb 2021 20:18:00 +0100 Subject: [PATCH] Add test for script flag in kotlin.Metadata It passes at the moment because the test uses old backend, but the required behavior is not yet supported in JVM IR, and it'll need to be fixed. --- .../testData/compiler/metadata_flag.kts | 3 +++ .../scripting/compiler/test/ScriptTest.kt | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 plugins/scripting/scripting-compiler/testData/compiler/metadata_flag.kts diff --git a/plugins/scripting/scripting-compiler/testData/compiler/metadata_flag.kts b/plugins/scripting/scripting-compiler/testData/compiler/metadata_flag.kts new file mode 100644 index 00000000000..2c6cf40c67d --- /dev/null +++ b/plugins/scripting/scripting-compiler/testData/compiler/metadata_flag.kts @@ -0,0 +1,3 @@ +class RandomClass + +println() diff --git a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptTest.kt b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptTest.kt index 73e4f3c8ec4..e0f63bb36fa 100644 --- a/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptTest.kt +++ b/plugins/scripting/scripting-compiler/tests/org/jetbrains/kotlin/scripting/compiler/test/ScriptTest.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment 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.configuration.ScriptingConfigurationKeys import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition @@ -86,6 +87,23 @@ class ScriptTest : TestCase() { assertEqualsTrimmed("[(1, a)]", out) } + fun testMetadataFlag() { + // Test that we're writing the flag to [Metadata.extraInt] that distinguishes scripts from other classes. + + fun Class<*>.isFlagSet(): Boolean { + val metadata = annotations.single { it.annotationClass.java.name == Metadata::class.java.name } + val extraInt = metadata.javaClass.methods.single { it.name == JvmAnnotationNames.METADATA_EXTRA_INT_FIELD_NAME } + return (extraInt(metadata) as Int) and JvmAnnotationNames.METADATA_SCRIPT_FLAG != 0 + } + + val scriptClass = compileScript("metadata_flag.kts", StandardScriptDefinition)!! + assertTrue("Script class SHOULD have the metadata flag set", scriptClass.isFlagSet()) + assertFalse( + "Non-script class in a script should NOT have the metadata flag set", + scriptClass.classLoader.loadClass("Metadata_flag\$RandomClass").isFlagSet() + ) + } + private fun compileScript( scriptPath: String, scriptDefinition: KotlinScriptDefinition,