Implement property references in JVM_IR

This commit is contained in:
pyos
2019-03-08 14:59:54 +01:00
committed by max-kammerer
parent 43be01bbc8
commit 330c4648cb
11 changed files with 406 additions and 48 deletions
@@ -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
)
@@ -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) }