Bound callable references.

This commit is contained in:
Dmitry Petrov
2016-09-07 12:31:34 +03:00
committed by Dmitry Petrov
parent 0da4c08520
commit e23325b014
5 changed files with 61 additions and 4 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.psi.KtClassLiteralExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
@@ -48,10 +49,22 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
fun generateCallableReference(ktCallableReference: KtCallableReferenceExpression): IrExpression {
val resolvedCall = getResolvedCall(ktCallableReference.callableReference)!!
// TODO bound method references
return IrCallableReferenceImpl(ktCallableReference.startOffset, ktCallableReference.endOffset,
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
resolvedCall.resultingDescriptor)
val irCallableRef = IrCallableReferenceImpl(ktCallableReference.startOffset, ktCallableReference.endOffset,
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
resolvedCall.resultingDescriptor)
resolvedCall.dispatchReceiver?.let { dispatchReceiver ->
if (dispatchReceiver !is TransientReceiver) {
irCallableRef.dispatchReceiver = statementGenerator.generateReceiver(ktCallableReference, dispatchReceiver).load()
}
}
resolvedCall.extensionReceiver?.let { extensionReceiver ->
if (extensionReceiver !is TransientReceiver) {
irCallableRef.extensionReceiver = statementGenerator.generateReceiver(ktCallableReference, extensionReceiver).load()
}
}
return irCallableRef
}
}