Bound callable references.
This commit is contained in:
committed by
Dmitry Petrov
parent
0da4c08520
commit
e23325b014
+17
-4
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.psi.KtClassLiteralExpression
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver
|
||||||
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
|
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
|
||||||
|
|
||||||
class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
|
||||||
@@ -48,10 +49,22 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
|||||||
|
|
||||||
fun generateCallableReference(ktCallableReference: KtCallableReferenceExpression): IrExpression {
|
fun generateCallableReference(ktCallableReference: KtCallableReferenceExpression): IrExpression {
|
||||||
val resolvedCall = getResolvedCall(ktCallableReference.callableReference)!!
|
val resolvedCall = getResolvedCall(ktCallableReference.callableReference)!!
|
||||||
// TODO bound method references
|
val irCallableRef = IrCallableReferenceImpl(ktCallableReference.startOffset, ktCallableReference.endOffset,
|
||||||
return IrCallableReferenceImpl(ktCallableReference.startOffset, ktCallableReference.endOffset,
|
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
|
||||||
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
|
resolvedCall.resultingDescriptor)
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
class A {
|
||||||
|
fun foo() {}
|
||||||
|
val bar = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun A.qux() {}
|
||||||
|
|
||||||
|
val test1 = A()::foo
|
||||||
|
|
||||||
|
val test2 = A()::bar
|
||||||
|
|
||||||
|
val test3 = A()::qux
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
FILE /boundCallableReferences.kt
|
||||||
|
CLASS CLASS A
|
||||||
|
CONSTRUCTOR public constructor A()
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='A'
|
||||||
|
FUN public final fun foo(): kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
PROPERTY public final val bar: kotlin.Int = 0
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST Int type=kotlin.Int value='0'
|
||||||
|
FUN public fun A.qux(): kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
PROPERTY public val test1: kotlin.reflect.KFunction0<kotlin.Unit>
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CALLABLE_REFERENCE 'foo(): Unit' type=kotlin.reflect.KFunction0<kotlin.Unit> operator=null
|
||||||
|
$this: CALL 'constructor A()' type=A operator=null
|
||||||
|
PROPERTY public val test2: kotlin.reflect.KProperty0<kotlin.Int>
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CALLABLE_REFERENCE 'bar: Int' type=kotlin.reflect.KProperty0<kotlin.Int> operator=null
|
||||||
|
$this: CALL 'constructor A()' type=A operator=null
|
||||||
|
PROPERTY public val test3: kotlin.reflect.KFunction0<kotlin.Unit>
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CALLABLE_REFERENCE 'qux() on A: Unit' type=kotlin.reflect.KFunction0<kotlin.Unit> operator=null
|
||||||
|
$receiver: CALL 'constructor A()' type=A operator=null
|
||||||
@@ -27,6 +27,7 @@ FILE /reflectionLiterals.kt
|
|||||||
PROPERTY public val test5: kotlin.reflect.KFunction0<kotlin.Unit>
|
PROPERTY public val test5: kotlin.reflect.KFunction0<kotlin.Unit>
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
CALLABLE_REFERENCE 'foo(): Unit' type=kotlin.reflect.KFunction0<kotlin.Unit> operator=null
|
CALLABLE_REFERENCE 'foo(): Unit' type=kotlin.reflect.KFunction0<kotlin.Unit> operator=null
|
||||||
|
$this: CALL 'constructor A()' type=A operator=null
|
||||||
PROPERTY public val test6: kotlin.reflect.KFunction0<kotlin.Unit>
|
PROPERTY public val test6: kotlin.reflect.KFunction0<kotlin.Unit>
|
||||||
EXPRESSION_BODY
|
EXPRESSION_BODY
|
||||||
CALLABLE_REFERENCE 'bar(): Unit' type=kotlin.reflect.KFunction0<kotlin.Unit> operator=null
|
CALLABLE_REFERENCE 'bar(): Unit' type=kotlin.reflect.KFunction0<kotlin.Unit> operator=null
|
||||||
|
|||||||
@@ -298,6 +298,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("boundCallableReferences.kt")
|
||||||
|
public void testBoundCallableReferences() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/boundCallableReferences.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("boxOk.kt")
|
@TestMetadata("boxOk.kt")
|
||||||
public void testBoxOk() throws Exception {
|
public void testBoxOk() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/boxOk.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/boxOk.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user