Support KParameter.kind: instance, extension receiver, or value
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
import kotlin.reflect.*
|
||||||
|
import kotlin.reflect.KParameter.Kind.*
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class A {
|
||||||
|
fun Int.foo(x: String) {}
|
||||||
|
|
||||||
|
inner class Inner(s: String) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val foo = A::class.memberExtensionFunctions.single()
|
||||||
|
|
||||||
|
assertEquals(listOf(INSTANCE, EXTENSION_RECEIVER, VALUE), foo.parameters.map { it.kind })
|
||||||
|
assertEquals(listOf(INSTANCE, VALUE), A::Inner.parameters.map { it.kind })
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -3597,6 +3597,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
doTestWithStdlib(fileName);
|
doTestWithStdlib(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kinds.kt")
|
||||||
|
public void testKinds() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters/kinds.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("propertySetter.kt")
|
@TestMetadata("propertySetter.kt")
|
||||||
public void testPropertySetter() throws Exception {
|
public void testPropertySetter() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters/propertySetter.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters/propertySetter.kt");
|
||||||
|
|||||||
@@ -40,4 +40,24 @@ public interface KParameter : KAnnotatedElement {
|
|||||||
* not the individual element.
|
* not the individual element.
|
||||||
*/
|
*/
|
||||||
public val type: KType
|
public val type: KType
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kind of this parameter.
|
||||||
|
*/
|
||||||
|
public val kind: Kind
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kind represents a particular position of the parameter declaration in the source code,
|
||||||
|
* such as an instance, an extension receiver parameter or a value parameter.
|
||||||
|
*/
|
||||||
|
public enum class Kind {
|
||||||
|
/** Instance required to make a call to the member, or an outer class instance for an inner class constructor. */
|
||||||
|
INSTANCE,
|
||||||
|
|
||||||
|
/** Extension receiver of an extension function or property. */
|
||||||
|
EXTENSION_RECEIVER,
|
||||||
|
|
||||||
|
/** Ordinary named value parameter. */
|
||||||
|
VALUE,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,15 +36,15 @@ interface KCallableImpl<out R> : KCallable<R>, KAnnotatedElementImpl {
|
|||||||
var index = 0
|
var index = 0
|
||||||
|
|
||||||
if (descriptor.dispatchReceiverParameter != null) {
|
if (descriptor.dispatchReceiverParameter != null) {
|
||||||
result.add(KParameterImpl(this, index++) { descriptor.dispatchReceiverParameter!! })
|
result.add(KParameterImpl(this, index++, KParameter.Kind.INSTANCE) { descriptor.dispatchReceiverParameter!! })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor.extensionReceiverParameter != null) {
|
if (descriptor.extensionReceiverParameter != null) {
|
||||||
result.add(KParameterImpl(this, index++) { descriptor.extensionReceiverParameter!! })
|
result.add(KParameterImpl(this, index++, KParameter.Kind.EXTENSION_RECEIVER) { descriptor.extensionReceiverParameter!! })
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i in descriptor.valueParameters.indices) {
|
for (i in descriptor.valueParameters.indices) {
|
||||||
result.add(KParameterImpl(this, index++) { descriptor.valueParameters[i] })
|
result.add(KParameterImpl(this, index++, KParameter.Kind.VALUE) { descriptor.valueParameters[i] })
|
||||||
}
|
}
|
||||||
|
|
||||||
result.trimToSize()
|
result.trimToSize()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import kotlin.reflect.KType
|
|||||||
class KParameterImpl(
|
class KParameterImpl(
|
||||||
val callable: KCallableImpl<*>,
|
val callable: KCallableImpl<*>,
|
||||||
override val index: Int,
|
override val index: Int,
|
||||||
|
override val kind: KParameter.Kind,
|
||||||
computeDescriptor: () -> ParameterDescriptor
|
computeDescriptor: () -> ParameterDescriptor
|
||||||
) : KParameter, KAnnotatedElementImpl {
|
) : KParameter, KAnnotatedElementImpl {
|
||||||
private val descriptor: ParameterDescriptor by ReflectProperties.lazySoft(computeDescriptor)
|
private val descriptor: ParameterDescriptor by ReflectProperties.lazySoft(computeDescriptor)
|
||||||
|
|||||||
Reference in New Issue
Block a user