Minor: reformat
This commit is contained in:
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.resolve.DescriptorFactory
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.PropertyImportedFromObject
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.*
|
||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
||||
@@ -46,14 +45,14 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
||||
import org.jetbrains.org.objectweb.asm.commons.Method
|
||||
|
||||
class PropertyReferenceCodegen(
|
||||
state: GenerationState,
|
||||
parentCodegen: MemberCodegen<*>,
|
||||
context: ClassContext,
|
||||
expression: KtElement,
|
||||
classBuilder: ClassBuilder,
|
||||
private val localVariableDescriptorForReference: VariableDescriptor,
|
||||
private val target: VariableDescriptor,
|
||||
private val receiverType: Type?
|
||||
state: GenerationState,
|
||||
parentCodegen: MemberCodegen<*>,
|
||||
context: ClassContext,
|
||||
expression: KtElement,
|
||||
classBuilder: ClassBuilder,
|
||||
private val localVariableDescriptorForReference: VariableDescriptor,
|
||||
private val target: VariableDescriptor,
|
||||
private val receiverType: Type?
|
||||
) : MemberCodegen<KtElement>(state, parentCodegen, context, expression, classBuilder) {
|
||||
private val classDescriptor = context.contextDescriptor
|
||||
private val asmType = typeMapper.mapClass(classDescriptor)
|
||||
@@ -64,10 +63,10 @@ class PropertyReferenceCodegen(
|
||||
private val isLocalDelegatedProperty = target is LocalVariableDescriptor
|
||||
|
||||
private val getFunction =
|
||||
if (isLocalDelegatedProperty)
|
||||
(localVariableDescriptorForReference as VariableDescriptorWithAccessors).getter!!
|
||||
else
|
||||
findGetFunction(localVariableDescriptorForReference).original
|
||||
if (isLocalDelegatedProperty)
|
||||
(localVariableDescriptorForReference as VariableDescriptorWithAccessors).getter!!
|
||||
else
|
||||
findGetFunction(localVariableDescriptorForReference).original
|
||||
|
||||
// e.g. mutableProperty0(Lkotlin/jvm/internal/MutablePropertyReference0;)Lkotlin/reflect/KMutableProperty0;
|
||||
private val wrapperMethod = getWrapperMethodForPropertyReference(target, getFunction.valueParameters.size)
|
||||
@@ -75,7 +74,7 @@ class PropertyReferenceCodegen(
|
||||
private val closure = bindingContext.get(CodegenBinding.CLOSURE, classDescriptor)!!.apply {
|
||||
assert((captureReceiverType != null) == (receiverType != null)) {
|
||||
"Bound property reference can only be generated with the type of the receiver. " +
|
||||
"Captured type = $captureReceiverType, actual type = $receiverType"
|
||||
"Captured type = $captureReceiverType, actual type = $receiverType"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,13 +85,13 @@ class PropertyReferenceCodegen(
|
||||
|
||||
override fun generateDeclaration() {
|
||||
v.defineClass(
|
||||
element,
|
||||
state.classFileVersion,
|
||||
ACC_FINAL or ACC_SUPER or AsmUtil.getVisibilityAccessFlagForClass(classDescriptor),
|
||||
asmType.internalName,
|
||||
null,
|
||||
superAsmType.internalName,
|
||||
emptyArray()
|
||||
element,
|
||||
state.classFileVersion,
|
||||
ACC_FINAL or ACC_SUPER or AsmUtil.getVisibilityAccessFlagForClass(classDescriptor),
|
||||
asmType.internalName,
|
||||
null,
|
||||
superAsmType.internalName,
|
||||
emptyArray()
|
||||
)
|
||||
|
||||
v.visitSource(element.containingFile.name, null)
|
||||
@@ -102,8 +101,7 @@ class PropertyReferenceCodegen(
|
||||
override fun generateBody() {
|
||||
if (JvmCodegenUtil.isConst(closure)) {
|
||||
generateConstInstance(asmType, wrapperMethod.returnType)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
AsmUtil.genClosureFields(closure, v, typeMapper)
|
||||
}
|
||||
|
||||
@@ -135,8 +133,7 @@ class PropertyReferenceCodegen(
|
||||
assert(!shouldHaveBoundReferenceReceiver) { "No bound reference receiver in constructor parameters: $constructorArgs" }
|
||||
load(0, OBJECT_TYPE)
|
||||
invokespecial(superAsmType.internalName, "<init>", "()V", false)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
val (receiverIndex, receiverType) = receiverIndexAndType
|
||||
load(0, OBJECT_TYPE)
|
||||
loadBoundReferenceReceiverParameter(receiverIndex, receiverType)
|
||||
@@ -148,16 +145,44 @@ class PropertyReferenceCodegen(
|
||||
private fun generateAccessors() {
|
||||
val getFunction = findGetFunction(localVariableDescriptorForReference)
|
||||
val getImpl = createFakeOpenDescriptor(getFunction, classDescriptor)
|
||||
functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, getImpl, PropertyReferenceGenerationStrategy(true, getFunction, target, asmType, receiverType, element, state, false))
|
||||
functionCodegen.generateMethod(
|
||||
JvmDeclarationOrigin.NO_ORIGIN,
|
||||
getImpl,
|
||||
PropertyReferenceGenerationStrategy(
|
||||
true,
|
||||
getFunction,
|
||||
target,
|
||||
asmType,
|
||||
receiverType,
|
||||
element,
|
||||
state,
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
if (!ReflectionTypes.isNumberedKMutablePropertyType(localVariableDescriptorForReference.type)) return
|
||||
val setFunction = localVariableDescriptorForReference.type.memberScope.getContributedFunctions(OperatorNameConventions.SET, NoLookupLocation.FROM_BACKEND).single()
|
||||
val setFunction = localVariableDescriptorForReference.type.memberScope.getContributedFunctions(
|
||||
OperatorNameConventions.SET,
|
||||
NoLookupLocation.FROM_BACKEND
|
||||
).single()
|
||||
val setImpl = createFakeOpenDescriptor(setFunction, classDescriptor)
|
||||
functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, setImpl, PropertyReferenceGenerationStrategy(false, setFunction, target, asmType, receiverType, element, state, false))
|
||||
functionCodegen.generateMethod(
|
||||
JvmDeclarationOrigin.NO_ORIGIN,
|
||||
setImpl,
|
||||
PropertyReferenceGenerationStrategy(
|
||||
false,
|
||||
setFunction,
|
||||
target,
|
||||
asmType,
|
||||
receiverType,
|
||||
element,
|
||||
state,
|
||||
false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
private fun generateMethod(debugString: String, access: Int, method: Method, generate: InstructionAdapter.() -> Unit) {
|
||||
v.generateMethod(debugString, access, method, element, JvmDeclarationOrigin.NO_ORIGIN, state, generate)
|
||||
}
|
||||
@@ -171,8 +196,7 @@ class PropertyReferenceCodegen(
|
||||
if (JvmCodegenUtil.isConst(closure)) {
|
||||
assert(receiverValue == null) { "No receiver expected for unbound property reference: $classDescriptor" }
|
||||
iv.getstatic(asmType.internalName, JvmAbi.INSTANCE_FIELD, wrapperMethod.returnType.descriptor)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
assert(receiverValue != null) { "Receiver expected for bound property reference: $classDescriptor" }
|
||||
iv.anew(asmType)
|
||||
iv.dup()
|
||||
@@ -203,7 +227,7 @@ class PropertyReferenceCodegen(
|
||||
fun getSignatureString(callable: CallableDescriptor, state: GenerationState): String {
|
||||
if (callable is LocalVariableDescriptor) {
|
||||
val asmType = state.bindingContext.get(CodegenBinding.DELEGATED_PROPERTY_METADATA_OWNER, callable)
|
||||
?: throw AssertionError("No delegated property metadata owner for $callable")
|
||||
?: throw AssertionError("No delegated property metadata owner for $callable")
|
||||
val localDelegatedProperties = CodegenBinding.getLocalDelegatedProperties(state.bindingContext, asmType)
|
||||
val index = localDelegatedProperties?.indexOf(callable) ?: -1
|
||||
if (index < 0) {
|
||||
@@ -215,8 +239,7 @@ class PropertyReferenceCodegen(
|
||||
val accessor = when (callable) {
|
||||
is FunctionDescriptor -> callable
|
||||
is VariableDescriptorWithAccessors ->
|
||||
callable.getter ?:
|
||||
DescriptorFactory.createDefaultGetter(callable as PropertyDescriptor, Annotations.EMPTY).apply {
|
||||
callable.getter ?: DescriptorFactory.createDefaultGetter(callable as PropertyDescriptor, Annotations.EMPTY).apply {
|
||||
initialize(callable.type)
|
||||
}
|
||||
else -> error("Unsupported callable reference: $callable")
|
||||
@@ -251,20 +274,24 @@ class PropertyReferenceCodegen(
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun findGetFunction(localVariableDescriptorForReference: VariableDescriptor) = localVariableDescriptorForReference.type.memberScope.getContributedFunctions(OperatorNameConventions.GET, NoLookupLocation.FROM_BACKEND).single()
|
||||
fun findGetFunction(localVariableDescriptorForReference: VariableDescriptor) =
|
||||
localVariableDescriptorForReference.type.memberScope.getContributedFunctions(
|
||||
OperatorNameConventions.GET,
|
||||
NoLookupLocation.FROM_BACKEND
|
||||
).single()
|
||||
}
|
||||
|
||||
class PropertyReferenceGenerationStrategy(
|
||||
val isGetter: Boolean,
|
||||
private val originalFunctionDesc: FunctionDescriptor,
|
||||
val target: VariableDescriptor,
|
||||
val asmType: Type,
|
||||
val receiverType: Type?,
|
||||
val expression: KtElement,
|
||||
state: GenerationState,
|
||||
private val isInliningStrategy: Boolean
|
||||
val isGetter: Boolean,
|
||||
private val originalFunctionDesc: FunctionDescriptor,
|
||||
val target: VariableDescriptor,
|
||||
val asmType: Type,
|
||||
val receiverType: Type?,
|
||||
val expression: KtElement,
|
||||
state: GenerationState,
|
||||
private val isInliningStrategy: Boolean
|
||||
) :
|
||||
FunctionGenerationStrategy.CodegenBased(state) {
|
||||
FunctionGenerationStrategy.CodegenBased(state) {
|
||||
override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) {
|
||||
val v = codegen.v
|
||||
val typeMapper = state.typeMapper
|
||||
@@ -276,11 +303,11 @@ class PropertyReferenceCodegen(
|
||||
}
|
||||
|
||||
if (receiverType != null) {
|
||||
val expectedReceiver = target.extensionReceiverParameter?.type ?: (target.containingDeclaration as? ClassDescriptor)?.defaultType
|
||||
val expectedReceiver =
|
||||
target.extensionReceiverParameter?.type ?: (target.containingDeclaration as? ClassDescriptor)?.defaultType
|
||||
val expectedReceiverType = if (expectedReceiver != null) typeMapper.mapType(expectedReceiver) else receiverType
|
||||
capturedBoundReferenceReceiver(asmType, expectedReceiverType, isInliningStrategy).put(expectedReceiverType, v)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
val receivers = originalFunctionDesc.valueParameters.dropLast(if (isGetter) 0 else 1)
|
||||
receivers.forEachIndexed { i, valueParameterDescriptor ->
|
||||
StackValue.local(i + 1, OBJECT_TYPE).put(typeMapper.mapType(valueParameterDescriptor), valueParameterDescriptor.type, v)
|
||||
@@ -289,15 +316,14 @@ class PropertyReferenceCodegen(
|
||||
|
||||
val value = if (target is LocalVariableDescriptor) {
|
||||
codegen.findLocalOrCapturedValue(target)!!
|
||||
}
|
||||
else
|
||||
} else {
|
||||
codegen.intermediateValueForProperty(target as PropertyDescriptor, false, null, StackValue.none())
|
||||
}
|
||||
|
||||
codegen.markStartLineNumber(expression)
|
||||
if (isGetter) {
|
||||
value.put(OBJECT_TYPE, v)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
val functionDescriptor = codegen.context.functionDescriptor
|
||||
value.store(StackValue.local(codegen.frameMap.getIndex(functionDescriptor.valueParameters.last()), OBJECT_TYPE), v)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user