Metadata: 'non-stable parameter names' flag for callables
^KT-34602
This commit is contained in:
@@ -9,7 +9,7 @@ import kotlinx.metadata.*
|
||||
import kotlinx.metadata.jvm.*
|
||||
import org.jetbrains.org.objectweb.asm.ClassWriter
|
||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Test
|
||||
import java.net.URLClassLoader
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
@@ -169,4 +169,38 @@ class MetadataSmokeTest {
|
||||
) as KotlinClassMetadata.SyntheticClass
|
||||
metadata.accept(KmLambda())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun unstableParameterNames() {
|
||||
@Suppress("unused")
|
||||
class Test(a: String, b: Int, c: Boolean) {
|
||||
fun foo(a: String, b: Int, c: Boolean) = Unit
|
||||
}
|
||||
|
||||
val classWithStableParameterNames =
|
||||
(KotlinClassMetadata.read(Test::class.java.readMetadata()) as KotlinClassMetadata.Class).toKmClass()
|
||||
|
||||
classWithStableParameterNames.constructors.forEach { assertFalse(Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES(it.flags)) }
|
||||
classWithStableParameterNames.functions.forEach { assertFalse(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES(it.flags)) }
|
||||
|
||||
val newMetadata = KotlinClassMetadata.Class.Writer().let { writer ->
|
||||
KmClass().apply {
|
||||
classWithStableParameterNames.accept(
|
||||
object : KmClassVisitor(this) {
|
||||
override fun visitConstructor(flags: Flags) =
|
||||
super.visitConstructor(flags + flagsOf(Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES))
|
||||
|
||||
override fun visitFunction(flags: Flags, name: String) =
|
||||
super.visitFunction(flags + flagsOf(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES), name)
|
||||
}
|
||||
)
|
||||
}.accept(writer)
|
||||
writer.write()
|
||||
}
|
||||
|
||||
val classWithUnstableParameterNames = newMetadata.toKmClass()
|
||||
|
||||
classWithUnstableParameterNames.constructors.forEach { assertTrue(Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES(it.flags)) }
|
||||
classWithUnstableParameterNames.functions.forEach { assertTrue(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES(it.flags)) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,6 +224,12 @@ class Flag(private val offset: Int, private val bitWidth: Int, private val value
|
||||
*/
|
||||
@JvmField
|
||||
val IS_PRIMARY = Flag(F.IS_SECONDARY, 0)
|
||||
|
||||
/**
|
||||
* Signifies that the corresponding constructor has non-stable parameter names, i.e. cannot be called with named arguments.
|
||||
*/
|
||||
@JvmField
|
||||
val HAS_NON_STABLE_PARAMETER_NAMES = Flag(F.IS_CONSTRUCTOR_WITH_NON_STABLE_PARAMETER_NAMES)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -302,6 +308,12 @@ class Flag(private val offset: Int, private val bitWidth: Int, private val value
|
||||
*/
|
||||
@JvmField
|
||||
val IS_EXPECT = Flag(F.IS_EXPECT_FUNCTION)
|
||||
|
||||
/**
|
||||
* Signifies that the corresponding function has non-stable parameter names, i.e. cannot be called with named arguments.
|
||||
*/
|
||||
@JvmField
|
||||
val HAS_NON_STABLE_PARAMETER_NAMES = Flag(F.IS_FUNCTION_WITH_NON_STABLE_PARAMETER_NAMES)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -958,7 +958,8 @@ private val CLASS_FLAGS_MAP = COMMON_FLAGS_MAP + mapOf(
|
||||
)
|
||||
|
||||
private val CONSTRUCTOR_FLAGS_MAP = VISIBILITY_FLAGS_MAP + mapOf(
|
||||
Flag.Constructor.IS_PRIMARY to "/* primary */"
|
||||
Flag.Constructor.IS_PRIMARY to "/* primary */",
|
||||
Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES to "/* non-stable parameter names */"
|
||||
)
|
||||
|
||||
private val FUNCTION_FLAGS_MAP = COMMON_FLAGS_MAP + mapOf(
|
||||
@@ -973,7 +974,9 @@ private val FUNCTION_FLAGS_MAP = COMMON_FLAGS_MAP + mapOf(
|
||||
Flag.Function.IS_TAILREC to "tailrec",
|
||||
Flag.Function.IS_EXTERNAL to "external",
|
||||
Flag.Function.IS_SUSPEND to "suspend",
|
||||
Flag.Function.IS_EXPECT to "expect"
|
||||
Flag.Function.IS_EXPECT to "expect",
|
||||
|
||||
Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES to "/* non-stable parameter names */"
|
||||
)
|
||||
|
||||
private val PROPERTY_FLAGS_MAP = COMMON_FLAGS_MAP + mapOf(
|
||||
|
||||
Reference in New Issue
Block a user