PSI2IR: Generate adapted callable references
Callable reference is "adapted" if it requires some adaptation to an
expected function type - e.g., when a reference to
```
fun foo(vararg xs: Int): Int
```
is used where `(Int, Int, Int) -> Int` is expected.
For such callable references we generate the following IR (in
pseudo-Kotlin):
```
{
fun foo'(p0: Int, p1: Int, p2: Int): Int {
return [| foo(p0, p1, p2) |]
}
::foo'
}
```
where `[| foo(p0, p1, p2) |]` is calling function `foo` with arguments
`p0`, `p1`, and `p2`, as they were mapped by callable reference
resolution.
This commit is contained in:
@@ -193,6 +193,18 @@ class FakePositionalValueArgumentForCallableReferenceImpl(
|
||||
override fun isExternal(): Boolean = false
|
||||
}
|
||||
|
||||
class FakeImplicitSpreadValueArgumentForCallableReferenceImpl(
|
||||
private val callElement: KtElement,
|
||||
override val expression: ValueArgument
|
||||
) : FakeImplicitSpreadValueArgumentForCallableReference {
|
||||
override fun getArgumentExpression(): KtExpression? = null
|
||||
override fun getArgumentName(): ValueArgumentName? = null
|
||||
override fun isNamed(): Boolean = false
|
||||
override fun asElement(): KtElement = callElement
|
||||
override fun getSpreadElement(): LeafPsiElement? = null // TODO callElement?
|
||||
override fun isExternal(): Boolean = false
|
||||
}
|
||||
|
||||
class EmptyLabeledReturn(
|
||||
val returnExpression: KtReturnExpression,
|
||||
builtIns: KotlinBuiltIns
|
||||
|
||||
+9
-2
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.resolve.calls.tower
|
||||
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.builtins.createFunctionType
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
@@ -377,7 +380,11 @@ class ResolvedAtomCompleter(
|
||||
is ResolvedCallArgument.SimpleArgument -> {
|
||||
val valueArgument = makeFakeValueArgument(resolvedCallArgument.callArgument, callElement)
|
||||
if (valueParameter.isVararg)
|
||||
VarargValueArgument(listOf(valueArgument))
|
||||
VarargValueArgument(
|
||||
listOf(
|
||||
FakeImplicitSpreadValueArgumentForCallableReferenceImpl(callElement, valueArgument)
|
||||
)
|
||||
)
|
||||
else
|
||||
ExpressionValueArgument(valueArgument)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user