Callable references now can have receivers and arguments
(for bound references implementation).
This commit is contained in:
committed by
Dmitry Petrov
parent
fe397eddbe
commit
a3dadd9e3f
@@ -126,6 +126,3 @@ fun IrBuilderWithScope.irString(value: String) =
|
||||
|
||||
fun IrBuilderWithScope.irConcat() =
|
||||
IrStringConcatenationImpl(startOffset, endOffset, context.builtIns.stringType)
|
||||
|
||||
fun IrBuilderWithScope.irCallableReference(type: KotlinType, descriptor: CallableDescriptor) =
|
||||
IrCallableReferenceImpl(startOffset, endOffset, type, descriptor)
|
||||
@@ -19,18 +19,12 @@ package org.jetbrains.kotlin.psi2ir.generators
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunctionBase
|
||||
import org.jetbrains.kotlin.ir.descriptors.IrPropertyDelegateDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.kotlin.psi2ir.builders.irBlockBody
|
||||
import org.jetbrains.kotlin.psi2ir.builders.irCallableReference
|
||||
import org.jetbrains.kotlin.psi2ir.builders.irGet
|
||||
import org.jetbrains.kotlin.psi2ir.builders.irReturn
|
||||
import org.jetbrains.kotlin.psi2ir.intermediate.VariableLValue
|
||||
import org.jetbrains.kotlin.psi2ir.intermediate.setExplicitReceiverValue
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import java.lang.AssertionError
|
||||
import java.util.*
|
||||
|
||||
class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context: GeneratorContext): GeneratorWithScope {
|
||||
|
||||
+2
-1
@@ -86,7 +86,8 @@ class DelegatedPropertyGenerator(override val context: GeneratorContext) : Gener
|
||||
BackingFieldLValue(ktDelegate.startOffset, ktDelegate.endOffset, delegateDescriptor, null)
|
||||
|
||||
private fun createCallableReference(ktElement: KtElement, type: KotlinType, referencedDescriptor: CallableDescriptor): IrCallableReference =
|
||||
IrCallableReferenceImpl(ktElement.startOffset, ktElement.endOffset, type, referencedDescriptor)
|
||||
IrCallableReferenceImpl(ktElement.startOffset, ktElement.endOffset, type,
|
||||
referencedDescriptor, IrOperator.PROPERTY_REFERENCE_FOR_DELEGATE)
|
||||
|
||||
fun generateLocalDelegatedProperty(
|
||||
ktProperty: KtProperty,
|
||||
|
||||
+4
-2
@@ -40,7 +40,8 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
|
||||
irFun.body = BodyGenerator(lambdaDescriptor, statementGenerator.context).generateLambdaBody(ktFun)
|
||||
irBlock.addStatement(irFun)
|
||||
|
||||
irBlock.addStatement(IrCallableReferenceImpl(ktLambda.startOffset, ktLambda.endOffset, lambdaExpressionType, lambdaDescriptor))
|
||||
irBlock.addStatement(IrCallableReferenceImpl(ktLambda.startOffset, ktLambda.endOffset, lambdaExpressionType,
|
||||
lambdaDescriptor, IrOperator.LAMBDA))
|
||||
|
||||
return irBlock
|
||||
}
|
||||
@@ -57,7 +58,8 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
|
||||
val irFun = generateFunctionDeclaration(ktFun)
|
||||
irBlock.addStatement(irFun)
|
||||
|
||||
irBlock.addStatement(IrCallableReferenceImpl(ktFun.startOffset, ktFun.endOffset, funExpressionType, irFun.descriptor))
|
||||
irBlock.addStatement(IrCallableReferenceImpl(ktFun.startOffset, ktFun.endOffset, funExpressionType,
|
||||
irFun.descriptor, IrOperator.ANONYMOUS_FUNCTION))
|
||||
|
||||
irBlock
|
||||
}
|
||||
|
||||
@@ -17,37 +17,19 @@
|
||||
package org.jetbrains.kotlin.ir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
|
||||
interface IrCallableReference : IrDeclarationReference {
|
||||
override val descriptor: CallableDescriptor
|
||||
|
||||
// TODO closure
|
||||
}
|
||||
interface IrCallableReference : IrGeneralCall
|
||||
|
||||
class IrCallableReferenceImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType,
|
||||
descriptor: CallableDescriptor
|
||||
) : IrDeclarationReferenceBase<CallableDescriptor>(startOffset, endOffset, type, descriptor), IrCallableReference {
|
||||
override val descriptor: CallableDescriptor,
|
||||
override val operator: IrOperator? = null
|
||||
) : IrGeneralCallBase(startOffset, endOffset, type, descriptor.valueParameters.size, operator), IrCallableReference {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitCallableReference(this, data)
|
||||
}
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
override fun getChild(slot: Int): IrElement? {
|
||||
// TODO
|
||||
return null
|
||||
}
|
||||
|
||||
override fun replaceChild(slot: Int, newChild: IrElement) {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
@@ -91,7 +91,8 @@ interface IrOperator {
|
||||
|
||||
object SUPER_CONSTRUCTOR_CALL : IrOperatorImpl("SUPER_CONSTRUCTOR_CALL")
|
||||
object INITIALIZE_PROPERTY_FROM_PARAMETER : IrOperatorImpl("INITIALIZE_PROPERTY_FROM_PARAMETER")
|
||||
object ANONYMOUS_INITIALIZER : IrOperatorImpl("ANONYMOUS_INITIALIZER")
|
||||
|
||||
object PROPERTY_REFERENCE_FOR_DELEGATE : IrOperatorImpl("PROPERTY_REFERENCE_FOR_DELEGATE")
|
||||
|
||||
data class COMPONENT_N private constructor(val index: Int) : IrOperatorImpl("COMPONENT_$index") {
|
||||
companion object {
|
||||
|
||||
@@ -171,10 +171,10 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
"THROW type=${expression.type.render()}"
|
||||
|
||||
override fun visitCallableReference(expression: IrCallableReference, data: Nothing?): String =
|
||||
"CALLABLE_REFERENCE ${expression.descriptor.render()} type=${expression.type.render()}"
|
||||
"CALLABLE_REFERENCE ${expression.descriptor.name} type=${expression.type.render()} operator=${expression.operator}"
|
||||
|
||||
override fun visitClassReference(expression: IrClassReference, data: Nothing?): String =
|
||||
"CLASS_REFERENCE ${expression.descriptor.render()} type=${expression.type.render()}"
|
||||
"CLASS_REFERENCE ${expression.descriptor.name} type=${expression.type.render()}"
|
||||
|
||||
override fun visitGetClass(expression: IrGetClass, data: Nothing?): String =
|
||||
"GET_CLASS type=${expression.type.render()}"
|
||||
|
||||
Reference in New Issue
Block a user