Implement property references in JVM_IR
This commit is contained in:
+1
-1
@@ -191,7 +191,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
|
||||
statementGenerator: StatementGenerator
|
||||
): IrCallableReference =
|
||||
ReflectionReferencesGenerator(statementGenerator).generateCallableReference(
|
||||
ktElement.startOffsetSkippingComments, ktElement.endOffset, type,
|
||||
ktElement, type,
|
||||
referencedDescriptor,
|
||||
null, IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
)
|
||||
|
||||
+19
-20
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.util.referenceClassifier
|
||||
import org.jetbrains.kotlin.ir.util.referenceFunction
|
||||
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
|
||||
import org.jetbrains.kotlin.psi.KtClassLiteralExpression
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
@@ -62,9 +63,6 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
val descriptorImportedFromObject = resultingDescriptor as? ImportedFromObjectCallableDescriptor<*>
|
||||
val referencedDescriptor = descriptorImportedFromObject?.callableFromObject ?: resultingDescriptor
|
||||
|
||||
val startOffset = ktCallableReference.startOffsetSkippingComments
|
||||
val endOffset = ktCallableReference.endOffset
|
||||
|
||||
return statementGenerator.generateCallReceiver(
|
||||
ktCallableReference,
|
||||
resultingDescriptor,
|
||||
@@ -72,7 +70,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
isSafe = false
|
||||
).call { dispatchReceiverValue, extensionReceiverValue ->
|
||||
generateCallableReference(
|
||||
startOffset, endOffset,
|
||||
ktCallableReference,
|
||||
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
|
||||
referencedDescriptor,
|
||||
resolvedCall.typeArguments
|
||||
@@ -84,27 +82,27 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
}
|
||||
|
||||
fun generateCallableReference(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
ktElement: KtElement,
|
||||
type: KotlinType,
|
||||
callableDescriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin? = null
|
||||
): IrCallableReference =
|
||||
when (callableDescriptor) {
|
||||
is FunctionDescriptor ->
|
||||
generateFunctionReference(
|
||||
startOffset, endOffset, type,
|
||||
context.symbolTable.referenceFunction(callableDescriptor.original),
|
||||
callableDescriptor,
|
||||
typeArguments,
|
||||
origin
|
||||
)
|
||||
is PropertyDescriptor ->
|
||||
generatePropertyReference(startOffset, endOffset, type, callableDescriptor, typeArguments, origin)
|
||||
): IrCallableReference {
|
||||
val startOffset = ktElement.startOffsetSkippingComments
|
||||
val endOffset = ktElement.endOffset
|
||||
return when (callableDescriptor) {
|
||||
is FunctionDescriptor -> {
|
||||
val symbol = context.symbolTable.referenceFunction(callableDescriptor.original)
|
||||
generateFunctionReference(startOffset, endOffset, type, symbol, callableDescriptor, typeArguments, origin)
|
||||
}
|
||||
is PropertyDescriptor -> {
|
||||
val mutable = get(BindingContext.VARIABLE, ktElement)?.isVar ?: true
|
||||
generatePropertyReference(startOffset, endOffset, type, callableDescriptor, typeArguments, origin, mutable)
|
||||
}
|
||||
else ->
|
||||
throw AssertionError("Unexpected callable reference: $callableDescriptor")
|
||||
}
|
||||
}
|
||||
|
||||
fun generateLocalDelegatedPropertyReference(
|
||||
startOffset: Int,
|
||||
@@ -135,10 +133,11 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
type: KotlinType,
|
||||
propertyDescriptor: PropertyDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin?
|
||||
origin: IrStatementOrigin?,
|
||||
mutable: Boolean
|
||||
): IrPropertyReference {
|
||||
val getterDescriptor = propertyDescriptor.getter
|
||||
val setterDescriptor = propertyDescriptor.setter
|
||||
val setterDescriptor = if (mutable) propertyDescriptor.setter else null
|
||||
|
||||
val fieldSymbol = if (getterDescriptor == null) context.symbolTable.referenceField(propertyDescriptor) else null
|
||||
val getterSymbol = getterDescriptor?.let { context.symbolTable.referenceSimpleFunction(it.original) }
|
||||
|
||||
Reference in New Issue
Block a user