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:
+10
@@ -802,6 +802,16 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest {
|
|||||||
runTest("compiler/testData/ir/irText/expressions/callableReferenceTypeArguments.kt");
|
runTest("compiler/testData/ir/irText/expressions/callableReferenceTypeArguments.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callableReferenceWithArgumentsConversion.kt")
|
||||||
|
public void testCallableReferenceWithArgumentsConversion() throws Exception {
|
||||||
|
runTest("compiler/testData/ir/irText/expressions/callableReferenceWithArgumentsConversion.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callableReferenceWithVarargViewedAsArray.kt")
|
||||||
|
public void testCallableReferenceWithVarargViewedAsArray() throws Exception {
|
||||||
|
runTest("compiler/testData/ir/irText/expressions/callableReferenceWithVarargViewedAsArray.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("calls.kt")
|
@TestMetadata("calls.kt")
|
||||||
public void testCalls() throws Exception {
|
public void testCalls() throws Exception {
|
||||||
runTest("compiler/testData/ir/irText/expressions/calls.kt");
|
runTest("compiler/testData/ir/irText/expressions/calls.kt");
|
||||||
|
|||||||
@@ -193,6 +193,18 @@ class FakePositionalValueArgumentForCallableReferenceImpl(
|
|||||||
override fun isExternal(): Boolean = false
|
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(
|
class EmptyLabeledReturn(
|
||||||
val returnExpression: KtReturnExpression,
|
val returnExpression: KtReturnExpression,
|
||||||
builtIns: KotlinBuiltIns
|
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.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.createFunctionType
|
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.FunctionDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
@@ -377,7 +380,11 @@ class ResolvedAtomCompleter(
|
|||||||
is ResolvedCallArgument.SimpleArgument -> {
|
is ResolvedCallArgument.SimpleArgument -> {
|
||||||
val valueArgument = makeFakeValueArgument(resolvedCallArgument.callArgument, callElement)
|
val valueArgument = makeFakeValueArgument(resolvedCallArgument.callArgument, callElement)
|
||||||
if (valueParameter.isVararg)
|
if (valueParameter.isVararg)
|
||||||
VarargValueArgument(listOf(valueArgument))
|
VarargValueArgument(
|
||||||
|
listOf(
|
||||||
|
FakeImplicitSpreadValueArgumentForCallableReferenceImpl(callElement, valueArgument)
|
||||||
|
)
|
||||||
|
)
|
||||||
else
|
else
|
||||||
ExpressionValueArgument(valueArgument)
|
ExpressionValueArgument(valueArgument)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,8 +134,11 @@ val IrType.isBoxedArray: Boolean
|
|||||||
fun IrType.getArrayElementType(irBuiltIns: IrBuiltIns): IrType =
|
fun IrType.getArrayElementType(irBuiltIns: IrBuiltIns): IrType =
|
||||||
if (isBoxedArray)
|
if (isBoxedArray)
|
||||||
((this as IrSimpleType).arguments.single() as IrTypeProjection).type
|
((this as IrSimpleType).arguments.single() as IrTypeProjection).type
|
||||||
else
|
else {
|
||||||
irBuiltIns.primitiveArrayElementTypes.getValue(this.classOrNull!!)
|
val classifier = this.classOrNull!!
|
||||||
|
irBuiltIns.primitiveArrayElementTypes[classifier]
|
||||||
|
?: throw AssertionError("Primitive array expected: $classifier")
|
||||||
|
}
|
||||||
|
|
||||||
val IrStatementOrigin?.isLambda: Boolean
|
val IrStatementOrigin?.isLambda: Boolean
|
||||||
get() = this == IrStatementOrigin.LAMBDA || this == IrStatementOrigin.ANONYMOUS_FUNCTION
|
get() = this == IrStatementOrigin.LAMBDA || this == IrStatementOrigin.ANONYMOUS_FUNCTION
|
||||||
|
|||||||
+269
-3
@@ -16,19 +16,30 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.psi2ir.generators
|
package org.jetbrains.kotlin.psi2ir.generators
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.MetadataSource
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
|
||||||
|
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.referenceClassifier
|
import org.jetbrains.kotlin.ir.util.referenceClassifier
|
||||||
import org.jetbrains.kotlin.ir.util.referenceFunction
|
import org.jetbrains.kotlin.ir.util.referenceFunction
|
||||||
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
|
import org.jetbrains.kotlin.ir.util.withScope
|
||||||
import org.jetbrains.kotlin.psi.KtClassLiteralExpression
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
||||||
|
import org.jetbrains.kotlin.psi2ir.intermediate.CallBuilder
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
|
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
|
||||||
|
|
||||||
@@ -61,6 +72,15 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
|||||||
|
|
||||||
val callBuilder = unwrapCallableDescriptorAndTypeArguments(resolvedCall, context.extensions.samConversion)
|
val callBuilder = unwrapCallableDescriptorAndTypeArguments(resolvedCall, context.extensions.samConversion)
|
||||||
|
|
||||||
|
if (resolvedCall.valueArguments.isNotEmpty()) {
|
||||||
|
val adaptedCallableReference = generateAdaptedCallableReference(ktCallableReference, callBuilder)
|
||||||
|
if (adaptedCallableReference.hasResultAdaptation ||
|
||||||
|
!isTrivialArgumentAdaptation(adaptedCallableReference.irAdapteeCall)
|
||||||
|
) {
|
||||||
|
return adaptedCallableReference.irReferenceExpression
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return statementGenerator.generateCallReceiver(
|
return statementGenerator.generateCallReceiver(
|
||||||
ktCallableReference,
|
ktCallableReference,
|
||||||
resolvedDescriptor,
|
resolvedDescriptor,
|
||||||
@@ -79,6 +99,252 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isTrivialArgumentAdaptation(irAdapteeCall: IrFunctionAccessExpression): Boolean {
|
||||||
|
for (i in 0 until irAdapteeCall.valueArgumentsCount) {
|
||||||
|
val irValueArgument = irAdapteeCall.getValueArgument(i) ?: return false
|
||||||
|
if (irValueArgument is IrVararg) {
|
||||||
|
val irVarargElements = irValueArgument.elements
|
||||||
|
if (irVarargElements.size != 1 || irVarargElements[0] !is IrSpreadElement) return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AdaptedCallableReference(
|
||||||
|
val irReferenceExpression: IrExpression,
|
||||||
|
val irAdapteeCall: IrFunctionAccessExpression,
|
||||||
|
val hasResultAdaptation: Boolean
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun generateAdaptedCallableReference(
|
||||||
|
ktCallableReference: KtCallableReferenceExpression,
|
||||||
|
callBuilder: CallBuilder
|
||||||
|
): AdaptedCallableReference {
|
||||||
|
val adapteeDescriptor = callBuilder.descriptor
|
||||||
|
if (adapteeDescriptor !is FunctionDescriptor) {
|
||||||
|
throw AssertionError("Function descriptor expected in adapted callable reference: $adapteeDescriptor")
|
||||||
|
}
|
||||||
|
|
||||||
|
val startOffset = ktCallableReference.startOffsetSkippingComments
|
||||||
|
val endOffset = ktCallableReference.endOffset
|
||||||
|
|
||||||
|
val adapteeSymbol = context.symbolTable.referenceFunction(adapteeDescriptor.original)
|
||||||
|
|
||||||
|
val ktFunctionalType = getTypeInferredByFrontendOrFail(ktCallableReference)
|
||||||
|
val irFunctionalType = ktFunctionalType.toIrType()
|
||||||
|
|
||||||
|
val ktFunctionalTypeArguments = ktFunctionalType.arguments
|
||||||
|
val ktExpectedReturnType = ktFunctionalTypeArguments.last().type
|
||||||
|
val ktExpectedParameterTypes = ktFunctionalTypeArguments.take(ktFunctionalTypeArguments.size - 1).map { it.type }
|
||||||
|
|
||||||
|
val irAdapterFun = createAdapterFun(startOffset, endOffset, adapteeDescriptor, ktExpectedParameterTypes, ktExpectedReturnType)
|
||||||
|
val (irCall, irAdapteeCallInner) =
|
||||||
|
createAdapteeCall(startOffset, endOffset, ktCallableReference, adapteeSymbol, callBuilder, irAdapterFun)
|
||||||
|
|
||||||
|
irAdapterFun.body = IrBlockBodyImpl(startOffset, endOffset).apply {
|
||||||
|
if (KotlinBuiltIns.isUnit(ktExpectedReturnType))
|
||||||
|
statements.add(irCall)
|
||||||
|
else
|
||||||
|
statements.add(IrReturnImpl(startOffset, endOffset, context.irBuiltIns.nothingType, irAdapterFun.symbol, irCall))
|
||||||
|
}
|
||||||
|
|
||||||
|
val irBlock = IrBlockImpl(startOffset, endOffset, irFunctionalType).apply {
|
||||||
|
statements.add(irAdapterFun)
|
||||||
|
statements.add(
|
||||||
|
IrFunctionReferenceImpl(
|
||||||
|
startOffset, endOffset,
|
||||||
|
irFunctionalType,
|
||||||
|
irAdapterFun.symbol,
|
||||||
|
0,
|
||||||
|
irAdapterFun.valueParameters.size
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return AdaptedCallableReference(
|
||||||
|
irBlock, irAdapteeCallInner,
|
||||||
|
KotlinBuiltIns.isUnit(ktExpectedReturnType) && !KotlinBuiltIns.isUnit(adapteeDescriptor.returnType!!)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createAdapteeCall(
|
||||||
|
startOffset: Int,
|
||||||
|
endOffset: Int,
|
||||||
|
ktCallableReference: KtCallableReferenceExpression,
|
||||||
|
adapteeSymbol: IrFunctionSymbol,
|
||||||
|
callBuilder: CallBuilder,
|
||||||
|
irAdapterFun: IrSimpleFunction
|
||||||
|
): Pair<IrExpression, IrFunctionAccessExpression> {
|
||||||
|
val resolvedCall = callBuilder.original
|
||||||
|
val resolvedDescriptor = resolvedCall.resultingDescriptor
|
||||||
|
|
||||||
|
var irAdapteeCall: IrFunctionAccessExpression? = null
|
||||||
|
val irCall = statementGenerator.generateCallReceiver(
|
||||||
|
ktCallableReference,
|
||||||
|
resolvedDescriptor,
|
||||||
|
resolvedCall.dispatchReceiver, resolvedCall.extensionReceiver,
|
||||||
|
isSafe = false
|
||||||
|
).call { dispatchReceiverValue, extensionReceiverValue ->
|
||||||
|
val irType = resolvedDescriptor.returnType!!.toIrType()
|
||||||
|
|
||||||
|
val irAdapteeCallInner =
|
||||||
|
if (resolvedDescriptor is ConstructorDescriptor)
|
||||||
|
IrConstructorCallImpl.fromSymbolDescriptor(
|
||||||
|
startOffset, endOffset, irType,
|
||||||
|
adapteeSymbol as IrConstructorSymbol
|
||||||
|
)
|
||||||
|
else
|
||||||
|
IrCallImpl(
|
||||||
|
startOffset, endOffset, irType,
|
||||||
|
adapteeSymbol,
|
||||||
|
origin = null, superQualifierSymbol = null
|
||||||
|
)
|
||||||
|
|
||||||
|
context.callToSubstitutedDescriptorMap[irAdapteeCallInner] = resolvedDescriptor
|
||||||
|
|
||||||
|
irAdapteeCallInner.dispatchReceiver = dispatchReceiverValue?.load()
|
||||||
|
irAdapteeCallInner.extensionReceiver = extensionReceiverValue?.load()
|
||||||
|
|
||||||
|
irAdapteeCallInner.putTypeArguments(callBuilder.typeArguments) { it.toIrType() }
|
||||||
|
|
||||||
|
putAdaptedValueArguments(startOffset, endOffset, irAdapteeCallInner, irAdapterFun, resolvedCall)
|
||||||
|
|
||||||
|
irAdapteeCall = irAdapteeCallInner
|
||||||
|
|
||||||
|
irAdapteeCallInner
|
||||||
|
}
|
||||||
|
|
||||||
|
return Pair(irCall, irAdapteeCall!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun putAdaptedValueArguments(
|
||||||
|
startOffset: Int,
|
||||||
|
endOffset: Int,
|
||||||
|
irAdapteeCall: IrFunctionAccessExpression,
|
||||||
|
irAdapterFun: IrSimpleFunction,
|
||||||
|
resolvedCall: ResolvedCall<*>
|
||||||
|
) {
|
||||||
|
val adaptedArguments = resolvedCall.valueArguments
|
||||||
|
if (adaptedArguments.isEmpty()) {
|
||||||
|
throw AssertionError("Callable reference with adapted arguments expected: ${resolvedCall.call.callElement.text}")
|
||||||
|
}
|
||||||
|
|
||||||
|
for ((valueParameter, valueArgument) in adaptedArguments) {
|
||||||
|
irAdapteeCall.putValueArgument(
|
||||||
|
valueParameter.index,
|
||||||
|
adaptResolvedValueArgument(startOffset, endOffset, valueArgument, irAdapterFun, valueParameter)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun adaptResolvedValueArgument(
|
||||||
|
startOffset: Int,
|
||||||
|
endOffset: Int,
|
||||||
|
resolvedValueArgument: ResolvedValueArgument,
|
||||||
|
irAdapterFun: IrSimpleFunction,
|
||||||
|
valueParameter: ValueParameterDescriptor
|
||||||
|
): IrExpression? =
|
||||||
|
when (resolvedValueArgument) {
|
||||||
|
is DefaultValueArgument ->
|
||||||
|
null
|
||||||
|
is VarargValueArgument ->
|
||||||
|
IrVarargImpl(
|
||||||
|
startOffset, endOffset,
|
||||||
|
valueParameter.type.toIrType(), valueParameter.varargElementType!!.toIrType(),
|
||||||
|
resolvedValueArgument.arguments.map {
|
||||||
|
adaptValueArgument(startOffset, endOffset, it, irAdapterFun)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
is ExpressionValueArgument -> {
|
||||||
|
val valueArgument = resolvedValueArgument.valueArgument!!
|
||||||
|
|
||||||
|
adaptValueArgument(startOffset, endOffset, valueArgument, irAdapterFun) as IrExpression
|
||||||
|
}
|
||||||
|
else ->
|
||||||
|
throw AssertionError("Unexpected ResolvedValueArgument: $resolvedValueArgument")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun adaptValueArgument(
|
||||||
|
startOffset: Int,
|
||||||
|
endOffset: Int,
|
||||||
|
valueArgument: ValueArgument,
|
||||||
|
irAdapterFun: IrSimpleFunction
|
||||||
|
): IrVarargElement =
|
||||||
|
when (valueArgument) {
|
||||||
|
is FakeImplicitSpreadValueArgumentForCallableReference ->
|
||||||
|
IrSpreadElementImpl(
|
||||||
|
startOffset, endOffset,
|
||||||
|
adaptValueArgument(startOffset, endOffset, valueArgument.expression, irAdapterFun) as IrExpression
|
||||||
|
)
|
||||||
|
|
||||||
|
is FakePositionalValueArgumentForCallableReference -> {
|
||||||
|
val irAdapterParameter = irAdapterFun.valueParameters[valueArgument.index]
|
||||||
|
IrGetValueImpl(startOffset, endOffset, irAdapterParameter.type, irAdapterParameter.symbol)
|
||||||
|
}
|
||||||
|
|
||||||
|
else ->
|
||||||
|
throw AssertionError("Unexpected ValueArgument: $valueArgument")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createAdapterFun(
|
||||||
|
startOffset: Int,
|
||||||
|
endOffset: Int,
|
||||||
|
adapteeDescriptor: FunctionDescriptor,
|
||||||
|
ktExpectedParameterTypes: List<KotlinType>,
|
||||||
|
ktExpectedReturnType: KotlinType
|
||||||
|
): IrSimpleFunction {
|
||||||
|
val adapterFunctionDescriptor = WrappedSimpleFunctionDescriptor()
|
||||||
|
val adapterOrigin = IrDeclarationOrigin.DEFINED // TODO special declaration origin for callable reference adapter?
|
||||||
|
|
||||||
|
return context.symbolTable.declareSimpleFunction(
|
||||||
|
startOffset, endOffset, adapterOrigin, adapterFunctionDescriptor
|
||||||
|
) { irAdapterSymbol ->
|
||||||
|
IrFunctionImpl(
|
||||||
|
startOffset, endOffset, adapterOrigin,
|
||||||
|
irAdapterSymbol,
|
||||||
|
adapteeDescriptor.name,
|
||||||
|
Visibilities.LOCAL,
|
||||||
|
Modality.FINAL,
|
||||||
|
ktExpectedReturnType.toIrType(),
|
||||||
|
isInline = adapteeDescriptor.isInline, // TODO ?
|
||||||
|
isExternal = false,
|
||||||
|
isTailrec = false,
|
||||||
|
isSuspend = adapteeDescriptor.isSuspend, // TODO ?
|
||||||
|
isOperator = adapteeDescriptor.isOperator, // TODO ?
|
||||||
|
isExpect = false,
|
||||||
|
isFakeOverride = false
|
||||||
|
).also { irAdapterFun ->
|
||||||
|
adapterFunctionDescriptor.bind(irAdapterFun)
|
||||||
|
|
||||||
|
context.symbolTable.withScope(adapterFunctionDescriptor) {
|
||||||
|
irAdapterFun.metadata = MetadataSource.Function(adapteeDescriptor)
|
||||||
|
|
||||||
|
irAdapterFun.dispatchReceiverParameter = null
|
||||||
|
irAdapterFun.extensionReceiverParameter = null
|
||||||
|
|
||||||
|
ktExpectedParameterTypes.mapIndexedTo(irAdapterFun.valueParameters) { index, ktExpectedParameterType ->
|
||||||
|
val adapterValueParameterDescriptor = WrappedValueParameterDescriptor()
|
||||||
|
context.symbolTable.declareValueParameter(
|
||||||
|
startOffset, endOffset, adapterOrigin, adapterValueParameterDescriptor,
|
||||||
|
ktExpectedParameterType.toIrType()
|
||||||
|
) { irAdapterParameterSymbol ->
|
||||||
|
IrValueParameterImpl(
|
||||||
|
startOffset, endOffset, adapterOrigin,
|
||||||
|
irAdapterParameterSymbol,
|
||||||
|
Name.identifier("p$index"),
|
||||||
|
index,
|
||||||
|
ktExpectedParameterType.toIrType(),
|
||||||
|
varargElementType = null, isCrossinline = false, isNoinline = false
|
||||||
|
).also { irAdapterValueParameter ->
|
||||||
|
adapterValueParameterDescriptor.bind(irAdapterValueParameter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun generateCallableReference(
|
fun generateCallableReference(
|
||||||
ktElement: KtElement,
|
ktElement: KtElement,
|
||||||
type: KotlinType,
|
type: KotlinType,
|
||||||
|
|||||||
@@ -377,20 +377,18 @@ class DumpTreeFromSourceLineVisitor(
|
|||||||
|
|
||||||
internal fun IrMemberAccessExpression.getValueParameterNamesForDebug(): List<String> {
|
internal fun IrMemberAccessExpression.getValueParameterNamesForDebug(): List<String> {
|
||||||
val expectedCount = valueArgumentsCount
|
val expectedCount = valueArgumentsCount
|
||||||
return if (this is IrDeclarationReference && symbol.isBound) {
|
if (symbol.isBound) {
|
||||||
val owner = symbol.owner
|
val owner = symbol.owner
|
||||||
if (owner is IrFunction) {
|
if (owner is IrFunction) {
|
||||||
(0 until expectedCount).map {
|
return (0 until expectedCount).map {
|
||||||
if (it < owner.valueParameters.size)
|
if (it < owner.valueParameters.size)
|
||||||
owner.valueParameters[it].name.asString()
|
owner.valueParameters[it].name.asString()
|
||||||
else
|
else
|
||||||
"${it + 1}"
|
"${it + 1}"
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
getPlaceholderParameterNames(expectedCount)
|
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
getPlaceholderParameterNames(expectedCount)
|
return getPlaceholderParameterNames(expectedCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun getPlaceholderParameterNames(expectedCount: Int) =
|
internal fun getPlaceholderParameterNames(expectedCount: Int) =
|
||||||
|
|||||||
@@ -40,6 +40,10 @@ interface FakePositionalValueArgumentForCallableReference : ValueArgument {
|
|||||||
val index: Int
|
val index: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface FakeImplicitSpreadValueArgumentForCallableReference : ValueArgument {
|
||||||
|
val expression: ValueArgument
|
||||||
|
}
|
||||||
|
|
||||||
interface LambdaArgument : ValueArgument {
|
interface LambdaArgument : ValueArgument {
|
||||||
fun getLambdaExpression(): KtLambdaExpression?
|
fun getLambdaExpression(): KtLambdaExpression?
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-6
@@ -266,7 +266,9 @@ class CallableReferencesCandidateFactory(
|
|||||||
*/
|
*/
|
||||||
var defaults = 0
|
var defaults = 0
|
||||||
var varargMappingState = VarargMappingState.UNMAPPED
|
var varargMappingState = VarargMappingState.UNMAPPED
|
||||||
val mappedArguments = arrayOfNulls<KotlinType?>(fakeArguments.size)
|
val mappedArguments = linkedMapOf<ValueParameterDescriptor, ResolvedCallArgument>()
|
||||||
|
val mappedVarargElements = linkedMapOf<ValueParameterDescriptor, MutableList<KotlinCallArgument>>()
|
||||||
|
val mappedArgumentTypes = arrayOfNulls<KotlinType?>(fakeArguments.size)
|
||||||
|
|
||||||
for ((valueParameter, resolvedArgument) in argumentMapping.parameterToCallArgumentMap) {
|
for ((valueParameter, resolvedArgument) in argumentMapping.parameterToCallArgumentMap) {
|
||||||
for (fakeArgument in resolvedArgument.arguments) {
|
for (fakeArgument in resolvedArgument.arguments) {
|
||||||
@@ -283,25 +285,42 @@ class CallableReferencesCandidateFactory(
|
|||||||
)
|
)
|
||||||
varargMappingState = newVarargMappingState
|
varargMappingState = newVarargMappingState
|
||||||
mappedArgument = varargType
|
mappedArgument = varargType
|
||||||
|
|
||||||
|
when (newVarargMappingState) {
|
||||||
|
VarargMappingState.MAPPED_WITH_ARRAY -> {
|
||||||
|
if (valueParameter in mappedArguments.keys) {
|
||||||
|
throw AssertionError("Vararg parameter already mapped: $valueParameter, fakeArgument: $fakeArgument")
|
||||||
|
}
|
||||||
|
mappedArguments[valueParameter] = ResolvedCallArgument.SimpleArgument(fakeArgument)
|
||||||
|
}
|
||||||
|
|
||||||
|
VarargMappingState.MAPPED_WITH_PLAIN_ARGS -> {
|
||||||
|
mappedVarargElements.getOrPut(valueParameter) { ArrayList() }.add(fakeArgument)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
mappedArgument = substitutedParameter.type
|
mappedArgument = substitutedParameter.type
|
||||||
|
mappedArguments[valueParameter] = resolvedArgument
|
||||||
}
|
}
|
||||||
|
|
||||||
mappedArguments[index] = mappedArgument
|
mappedArgumentTypes[index] = mappedArgument
|
||||||
}
|
}
|
||||||
if (resolvedArgument == ResolvedCallArgument.DefaultArgument) defaults++
|
if (resolvedArgument == ResolvedCallArgument.DefaultArgument) defaults++
|
||||||
}
|
}
|
||||||
if (mappedArguments.any { it == null }) return null
|
if (mappedArgumentTypes.any { it == null }) return null
|
||||||
|
|
||||||
|
for ((valueParameter, varargElements) in mappedVarargElements) {
|
||||||
|
mappedArguments[valueParameter] = ResolvedCallArgument.VarargArgument(varargElements)
|
||||||
|
}
|
||||||
|
|
||||||
// lower(Unit!) = Unit
|
// lower(Unit!) = Unit
|
||||||
val returnExpectedType = inputOutputTypes.outputType
|
val returnExpectedType = inputOutputTypes.outputType
|
||||||
|
|
||||||
val coercion = if (returnExpectedType.isUnit()) CoercionStrategy.COERCION_TO_UNIT else CoercionStrategy.NO_COERCION
|
val coercion = if (returnExpectedType.isUnit()) CoercionStrategy.COERCION_TO_UNIT else CoercionStrategy.NO_COERCION
|
||||||
|
|
||||||
|
|
||||||
return CallableReferenceAdaptation(
|
return CallableReferenceAdaptation(
|
||||||
@Suppress("UNCHECKED_CAST") (mappedArguments as Array<KotlinType>),
|
@Suppress("UNCHECKED_CAST") (mappedArgumentTypes as Array<KotlinType>),
|
||||||
coercion, defaults, argumentMapping.parameterToCallArgumentMap
|
coercion, defaults, mappedArguments
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
FILE fqName:<root> fileName:/callableReferenceWithArgumentsConversion.kt
|
||||||
|
FUN name:use visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Int, kotlin.String>) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Int, kotlin.String>
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun use (fn: kotlin.Function1<kotlin.Int, kotlin.String>): kotlin.String declared in <root>'
|
||||||
|
CALL 'public abstract fun invoke (p1: kotlin.Int): kotlin.String [operator] declared in kotlin.Function1' type=kotlin.String origin=null
|
||||||
|
$this: GET_VAR 'fn: kotlin.Function1<kotlin.Int, kotlin.String> declared in <root>.use' type=kotlin.Function1<kotlin.Int, kotlin.String> origin=null
|
||||||
|
p1: CONST Int type=kotlin.Int value=1
|
||||||
|
FUN name:coerceToUnit visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Int, kotlin.Unit>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Int, kotlin.Unit>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:fnWithDefault visibility:public modality:FINAL <> (a:kotlin.Int, b:kotlin.Int) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:a index:0 type:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:b index:1 type:kotlin.Int
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST Int type=kotlin.Int value=42
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun fnWithDefault (a: kotlin.Int, b: kotlin.Int): kotlin.String declared in <root>'
|
||||||
|
CONST String type=kotlin.String value="abc"
|
||||||
|
FUN name:fnWithVarargs visibility:public modality:FINAL <> (xs:kotlin.IntArray) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:xs index:0 type:kotlin.IntArray
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun fnWithVarargs (xs: kotlin.IntArray): kotlin.String declared in <root>'
|
||||||
|
CONST String type=kotlin.String value="abc"
|
||||||
|
CLASS OBJECT name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]
|
||||||
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Host
|
||||||
|
CONSTRUCTOR visibility:private <> () returnType:<root>.Host [primary]
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]'
|
||||||
|
FUN name:importedObjectMemberWithVarargs visibility:public modality:FINAL <> ($this:<root>.Host, xs:kotlin.IntArray) returnType:kotlin.String
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:<root>.Host
|
||||||
|
VALUE_PARAMETER name:xs index:0 type:kotlin.IntArray
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun importedObjectMemberWithVarargs (xs: kotlin.IntArray): kotlin.String declared in <root>.Host'
|
||||||
|
CONST String type=kotlin.String value="abc"
|
||||||
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||||
|
overridden:
|
||||||
|
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||||
|
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
|
||||||
|
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
|
||||||
|
overridden:
|
||||||
|
public open fun hashCode (): kotlin.Int declared in kotlin.Any
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||||
|
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
|
||||||
|
overridden:
|
||||||
|
public open fun toString (): kotlin.String declared in kotlin.Any
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||||
|
FUN name:testDefault visibility:public modality:FINAL <> () returnType:IrErrorType
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testDefault (): IrErrorType declared in <root>'
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/use]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun fnWithDefault (a: kotlin.Int, b: kotlin.Int): kotlin.String declared in <root>' type=kotlin.reflect.KFunction2<kotlin.Int, kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:testVararg visibility:public modality:FINAL <> () returnType:IrErrorType
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testVararg (): IrErrorType declared in <root>'
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/use]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun fnWithVarargs (xs: kotlin.IntArray): kotlin.String declared in <root>' type=kotlin.reflect.KFunction1<kotlin.IntArray, kotlin.String> origin=null
|
||||||
|
FUN name:testCoercionToUnit visibility:public modality:FINAL <> () returnType:IrErrorType
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testCoercionToUnit (): IrErrorType declared in <root>'
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/coerceToUnit]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun fnWithDefault (a: kotlin.Int, b: kotlin.Int): kotlin.String declared in <root>' type=kotlin.reflect.KFunction2<kotlin.Int, kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:testImportedObjectMember visibility:public modality:FINAL <> () returnType:IrErrorType
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testImportedObjectMember (): IrErrorType declared in <root>'
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/use]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun importedObjectMemberWithVarargs (xs: kotlin.IntArray): kotlin.String declared in <root>.Host' type=kotlin.reflect.KFunction1<kotlin.IntArray, kotlin.String> origin=null
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
// !LANGUAGE: +NewInference, +FunctionReferenceWithDefaultValueAsOtherType
|
||||||
|
import Host.importedObjectMemberWithVarargs
|
||||||
|
|
||||||
|
fun use(fn: (Int) -> String) = fn(1)
|
||||||
|
|
||||||
|
fun coerceToUnit(fn: (Int) -> Unit) {}
|
||||||
|
|
||||||
|
fun fnWithDefault(a: Int, b: Int = 42) = "abc"
|
||||||
|
|
||||||
|
fun fnWithVarargs(vararg xs: Int) = "abc"
|
||||||
|
|
||||||
|
object Host {
|
||||||
|
fun importedObjectMemberWithVarargs(vararg xs: Int) = "abc"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testDefault() = use(::fnWithDefault)
|
||||||
|
|
||||||
|
fun testVararg() = use(::fnWithVarargs)
|
||||||
|
|
||||||
|
fun testCoercionToUnit() = coerceToUnit(::fnWithDefault)
|
||||||
|
|
||||||
|
fun testImportedObjectMember() = use(::importedObjectMemberWithVarargs)
|
||||||
+100
@@ -0,0 +1,100 @@
|
|||||||
|
FILE fqName:<root> fileName:/callableReferenceWithArgumentsConversion.kt
|
||||||
|
FUN name:use visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Int, kotlin.String>) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Int, kotlin.String>
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun use (fn: kotlin.Function1<kotlin.Int, kotlin.String>): kotlin.String declared in <root>'
|
||||||
|
CALL 'public abstract fun invoke (p1: P1 of kotlin.Function1): R of kotlin.Function1 [operator] declared in kotlin.Function1' type=kotlin.String origin=INVOKE
|
||||||
|
$this: GET_VAR 'fn: kotlin.Function1<kotlin.Int, kotlin.String> declared in <root>.use' type=kotlin.Function1<kotlin.Int, kotlin.String> origin=VARIABLE_AS_FUNCTION
|
||||||
|
p1: CONST Int type=kotlin.Int value=1
|
||||||
|
FUN name:coerceToUnit visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Int, kotlin.Unit>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Int, kotlin.Unit>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:fnWithDefault visibility:public modality:FINAL <> (a:kotlin.Int, b:kotlin.Int) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:a index:0 type:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:b index:1 type:kotlin.Int
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST Int type=kotlin.Int value=42
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun fnWithDefault (a: kotlin.Int, b: kotlin.Int): kotlin.String declared in <root>'
|
||||||
|
CONST String type=kotlin.String value="abc"
|
||||||
|
FUN name:fnWithVarargs visibility:public modality:FINAL <> (xs:kotlin.IntArray) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:xs index:0 type:kotlin.IntArray varargElementType:kotlin.Int [vararg]
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun fnWithVarargs (vararg xs: kotlin.Int): kotlin.String declared in <root>'
|
||||||
|
CONST String type=kotlin.String value="abc"
|
||||||
|
CLASS OBJECT name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]
|
||||||
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Host
|
||||||
|
CONSTRUCTOR visibility:private <> () returnType:<root>.Host [primary]
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
|
||||||
|
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]'
|
||||||
|
FUN name:importedObjectMemberWithVarargs visibility:public modality:FINAL <> ($this:<root>.Host, xs:kotlin.IntArray) returnType:kotlin.String
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:<root>.Host
|
||||||
|
VALUE_PARAMETER name:xs index:0 type:kotlin.IntArray varargElementType:kotlin.Int [vararg]
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun importedObjectMemberWithVarargs (vararg xs: kotlin.Int): kotlin.String declared in <root>.Host'
|
||||||
|
CONST String type=kotlin.String value="abc"
|
||||||
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||||
|
overridden:
|
||||||
|
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||||
|
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
|
||||||
|
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
|
||||||
|
overridden:
|
||||||
|
public open fun hashCode (): kotlin.Int declared in kotlin.Any
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||||
|
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
|
||||||
|
overridden:
|
||||||
|
public open fun toString (): kotlin.String declared in kotlin.Any
|
||||||
|
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||||
|
FUN name:testDefault visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testDefault (): kotlin.String declared in <root>'
|
||||||
|
CALL 'public final fun use (fn: kotlin.Function1<kotlin.Int, kotlin.String>): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
|
fn: BLOCK type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:fnWithDefault visibility:local modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:p0 index:0 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='local final fun fnWithDefault (p0: kotlin.Int): kotlin.String declared in <root>.testDefault'
|
||||||
|
CALL 'public final fun fnWithDefault (a: kotlin.Int, b: kotlin.Int): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
|
a: GET_VAR 'p0: kotlin.Int declared in <root>.testDefault.fnWithDefault' type=kotlin.Int origin=null
|
||||||
|
FUNCTION_REFERENCE 'local final fun fnWithDefault (p0: kotlin.Int): kotlin.String declared in <root>.testDefault' type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:testVararg visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testVararg (): kotlin.String declared in <root>'
|
||||||
|
CALL 'public final fun use (fn: kotlin.Function1<kotlin.Int, kotlin.String>): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
|
fn: BLOCK type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:fnWithVarargs visibility:local modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:p0 index:0 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='local final fun fnWithVarargs (p0: kotlin.Int): kotlin.String declared in <root>.testVararg'
|
||||||
|
CALL 'public final fun fnWithVarargs (vararg xs: kotlin.Int): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
|
xs: VARARG type=kotlin.IntArray varargElementType=kotlin.Int
|
||||||
|
GET_VAR 'p0: kotlin.Int declared in <root>.testVararg.fnWithVarargs' type=kotlin.Int origin=null
|
||||||
|
FUNCTION_REFERENCE 'local final fun fnWithVarargs (p0: kotlin.Int): kotlin.String declared in <root>.testVararg' type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:testCoercionToUnit visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testCoercionToUnit (): kotlin.Unit declared in <root>'
|
||||||
|
CALL 'public final fun coerceToUnit (fn: kotlin.Function1<kotlin.Int, kotlin.Unit>): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
fn: BLOCK type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.Unit> origin=null
|
||||||
|
FUN name:fnWithDefault visibility:local modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:p0 index:0 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||||
|
CALL 'public final fun fnWithDefault (a: kotlin.Int, b: kotlin.Int): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
|
a: GET_VAR 'p0: kotlin.Int declared in <root>.testCoercionToUnit.fnWithDefault' type=kotlin.Int origin=null
|
||||||
|
FUNCTION_REFERENCE 'local final fun fnWithDefault (p0: kotlin.Int): kotlin.Unit declared in <root>.testCoercionToUnit' type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.Unit> origin=null
|
||||||
|
FUN name:testImportedObjectMember visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun testImportedObjectMember (): kotlin.String declared in <root>'
|
||||||
|
CALL 'public final fun use (fn: kotlin.Function1<kotlin.Int, kotlin.String>): kotlin.String declared in <root>' type=kotlin.String origin=null
|
||||||
|
fn: BLOCK type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.String> origin=null
|
||||||
|
FUN name:importedObjectMemberWithVarargs visibility:local modality:FINAL <> (p0:kotlin.Int) returnType:kotlin.String
|
||||||
|
VALUE_PARAMETER name:p0 index:0 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='local final fun importedObjectMemberWithVarargs (p0: kotlin.Int): kotlin.String declared in <root>.testImportedObjectMember'
|
||||||
|
CALL 'public final fun importedObjectMemberWithVarargs (vararg xs: kotlin.Int): kotlin.String declared in <root>.Host' type=kotlin.String origin=null
|
||||||
|
$this: GET_OBJECT 'CLASS OBJECT name:Host modality:FINAL visibility:public superTypes:[kotlin.Any]' type=<root>.Host
|
||||||
|
xs: VARARG type=kotlin.IntArray varargElementType=kotlin.Int
|
||||||
|
GET_VAR 'p0: kotlin.Int declared in <root>.testImportedObjectMember.importedObjectMemberWithVarargs' type=kotlin.Int origin=null
|
||||||
|
FUNCTION_REFERENCE 'local final fun importedObjectMemberWithVarargs (p0: kotlin.Int): kotlin.String declared in <root>.testImportedObjectMember' type=kotlin.reflect.KFunction1<kotlin.Int, kotlin.String> origin=null
|
||||||
+74
@@ -0,0 +1,74 @@
|
|||||||
|
FILE fqName:<root> fileName:/callableReferenceWithVarargViewedAsArray.kt
|
||||||
|
FUN name:sum visibility:public modality:FINAL <> (args:kotlin.IntArray) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:args index:0 type:kotlin.IntArray
|
||||||
|
BLOCK_BODY
|
||||||
|
VAR name:result type:kotlin.Int [var]
|
||||||
|
CONST Int type=kotlin.Int value=0
|
||||||
|
VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.IntArray [val]
|
||||||
|
GET_VAR 'args: kotlin.IntArray declared in <root>.sum' type=kotlin.IntArray origin=null
|
||||||
|
VAR IR_TEMPORARY_VARIABLE name:tmp_1 type:kotlin.collections.IntIterator [val]
|
||||||
|
CALL 'public final fun iterator (): kotlin.collections.IntIterator [operator] declared in kotlin.IntArray' type=kotlin.collections.IntIterator origin=null
|
||||||
|
$this: GET_VAR 'val tmp_0: kotlin.IntArray [val] declared in <root>.sum' type=kotlin.IntArray origin=null
|
||||||
|
WHILE label=null origin=FOR_LOOP_INNER_WHILE
|
||||||
|
condition: CALL 'public abstract fun hasNext (): kotlin.Boolean [operator] declared in kotlin.collections.Iterator' type=kotlin.Boolean origin=null
|
||||||
|
$this: GET_VAR 'val tmp_1: kotlin.collections.IntIterator [val] declared in <root>.sum' type=kotlin.collections.IntIterator origin=null
|
||||||
|
body: BLOCK type=kotlin.Unit origin=null
|
||||||
|
VAR name:arg type:kotlin.Int [val]
|
||||||
|
CALL 'public final fun next (): kotlin.Int [operator] declared in kotlin.collections.IntIterator' type=kotlin.Int origin=null
|
||||||
|
$this: GET_VAR 'val tmp_1: kotlin.collections.IntIterator [val] declared in <root>.sum' type=kotlin.collections.IntIterator origin=null
|
||||||
|
SET_VAR 'var result: kotlin.Int [var] declared in <root>.sum' type=kotlin.Int origin=null
|
||||||
|
CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=null
|
||||||
|
$this: GET_VAR 'var result: kotlin.Int [var] declared in <root>.sum' type=kotlin.Int origin=null
|
||||||
|
other: GET_VAR 'val arg: kotlin.Int [val] declared in <root>.sum' type=kotlin.Int origin=null
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun sum (args: kotlin.IntArray): kotlin.Int declared in <root>'
|
||||||
|
GET_VAR 'var result: kotlin.Int [var] declared in <root>.sum' type=kotlin.Int origin=null
|
||||||
|
FUN name:nsum visibility:public modality:FINAL <> (args:kotlin.Array<kotlin.Number>) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:args index:0 type:kotlin.Array<kotlin.Number>
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun nsum (args: kotlin.Array<kotlin.Number>): kotlin.Int declared in <root>'
|
||||||
|
CALL 'public final fun sum (args: kotlin.IntArray): kotlin.Int declared in <root>' type=kotlin.Int origin=null
|
||||||
|
args: CONSTRUCTOR_CALL 'public constructor <init> (size: kotlin.Int, init: kotlin.Function1<kotlin.Int, kotlin.Int>) declared in kotlin.IntArray' type=kotlin.IntArray origin=null
|
||||||
|
size: CALL 'public final fun <get-size> (): kotlin.Int declared in kotlin.Array' type=kotlin.Int origin=null
|
||||||
|
$this: GET_VAR 'args: kotlin.Array<kotlin.Number> declared in <root>.nsum' type=kotlin.Array<kotlin.Number> origin=null
|
||||||
|
init: FUN_EXPR type=kotlin.Function1<kotlin.Int, kotlin.Int> origin=LAMBDA
|
||||||
|
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.Int) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:it index:0 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public abstract fun toInt (): kotlin.Int declared in kotlin.Number' type=kotlin.Int origin=null
|
||||||
|
$this: CALL 'public final fun get (index: kotlin.Int): kotlin.Number [operator] declared in kotlin.Array' type=kotlin.Number origin=null
|
||||||
|
$this: GET_VAR 'args: kotlin.Array<kotlin.Number> declared in <root>.nsum' type=kotlin.Array<kotlin.Number> origin=null
|
||||||
|
index: GET_VAR 'it: kotlin.Int declared in <root>.nsum.<anonymous>' type=kotlin.Int origin=null
|
||||||
|
FUN name:zap visibility:public modality:FINAL <> (b:kotlin.Array<kotlin.String>, k:kotlin.Int) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:b index:0 type:kotlin.Array<kotlin.String>
|
||||||
|
VALUE_PARAMETER name:k index:1 type:kotlin.Int
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST Int type=kotlin.Int value=42
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:usePlainArgs visibility:public modality:FINAL <> (fn:kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Int>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Int>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:usePrimitiveArray visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.IntArray, kotlin.Int>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.IntArray, kotlin.Int>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:useArray visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Array<kotlin.Int>, kotlin.Int>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Array<kotlin.Int>, kotlin.Int>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:useStringArray visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Array<kotlin.String>, kotlin.Unit>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Array<kotlin.String>, kotlin.Unit>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:testPlainArgs visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/usePlainArgs]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun sum (args: kotlin.IntArray): kotlin.Int declared in <root>' type=kotlin.reflect.KFunction1<kotlin.IntArray, kotlin.Int> origin=null
|
||||||
|
FUN name:testPrimitiveArrayAsVararg visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public final fun usePrimitiveArray (fn: kotlin.Function1<kotlin.IntArray, kotlin.Int>): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
fn: FUNCTION_REFERENCE 'public final fun sum (args: kotlin.IntArray): kotlin.Int declared in <root>' type=kotlin.reflect.KFunction1<kotlin.IntArray, kotlin.Int> origin=null
|
||||||
|
FUN name:testArrayAsVararg visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/useArray]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun nsum (args: kotlin.Array<kotlin.Number>): kotlin.Int declared in <root>' type=kotlin.reflect.KFunction1<kotlin.Array<kotlin.Number>, kotlin.Int> origin=null
|
||||||
|
FUN name:testArrayAndDefaults visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
ERROR_CALL 'Unresolved reference: <Inapplicable(INAPPLICABLE): [/useStringArray]>#' type=IrErrorType
|
||||||
|
FUNCTION_REFERENCE 'public final fun zap (b: kotlin.Array<kotlin.String>, k: kotlin.Int): kotlin.Unit declared in <root>' type=kotlin.reflect.KFunction2<kotlin.Array<kotlin.String>, kotlin.Int, kotlin.Unit> origin=null
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
// !LANGUAGE: +NewInference, +FunctionReferenceWithDefaultValueAsOtherType
|
||||||
|
|
||||||
|
fun sum(vararg args: Int): Int {
|
||||||
|
var result = 0
|
||||||
|
for (arg in args)
|
||||||
|
result += arg
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun nsum(vararg args: Number) = sum(*IntArray(args.size) { args[it].toInt() })
|
||||||
|
|
||||||
|
fun zap(vararg b: String, k: Int = 42) {}
|
||||||
|
|
||||||
|
fun usePlainArgs(fn: (Int, Int) -> Int) {}
|
||||||
|
fun usePrimitiveArray(fn: (IntArray) -> Int) {}
|
||||||
|
fun useArray(fn: (Array<Int>) -> Int) {}
|
||||||
|
fun useStringArray(fn: (Array<String>) -> Unit) {}
|
||||||
|
|
||||||
|
fun testPlainArgs() { usePlainArgs(::sum) }
|
||||||
|
fun testPrimitiveArrayAsVararg() { usePrimitiveArray(::sum) }
|
||||||
|
fun testArrayAsVararg() { useArray(::nsum) }
|
||||||
|
fun testArrayAndDefaults() { useStringArray(::zap) }
|
||||||
+94
@@ -0,0 +1,94 @@
|
|||||||
|
FILE fqName:<root> fileName:/callableReferenceWithVarargViewedAsArray.kt
|
||||||
|
FUN name:sum visibility:public modality:FINAL <> (args:kotlin.IntArray) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:args index:0 type:kotlin.IntArray varargElementType:kotlin.Int [vararg]
|
||||||
|
BLOCK_BODY
|
||||||
|
VAR name:result type:kotlin.Int [var]
|
||||||
|
CONST Int type=kotlin.Int value=0
|
||||||
|
BLOCK type=kotlin.Unit origin=FOR_LOOP
|
||||||
|
VAR FOR_LOOP_ITERATOR name:tmp_0 type:kotlin.collections.IntIterator [val]
|
||||||
|
CALL 'public final fun iterator (): kotlin.collections.IntIterator [operator] declared in kotlin.IntArray' type=kotlin.collections.IntIterator origin=FOR_LOOP_ITERATOR
|
||||||
|
$this: GET_VAR 'args: kotlin.IntArray [vararg] declared in <root>.sum' type=kotlin.IntArray origin=null
|
||||||
|
WHILE label=null origin=FOR_LOOP_INNER_WHILE
|
||||||
|
condition: CALL 'public abstract fun hasNext (): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.IntIterator' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
|
||||||
|
$this: GET_VAR 'val tmp_0: kotlin.collections.IntIterator [val] declared in <root>.sum' type=kotlin.collections.IntIterator origin=null
|
||||||
|
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
|
||||||
|
VAR FOR_LOOP_VARIABLE name:arg type:kotlin.Int [val]
|
||||||
|
CALL 'public final fun next (): kotlin.Int [operator] declared in kotlin.collections.IntIterator' type=kotlin.Int origin=FOR_LOOP_NEXT
|
||||||
|
$this: GET_VAR 'val tmp_0: kotlin.collections.IntIterator [val] declared in <root>.sum' type=kotlin.collections.IntIterator origin=null
|
||||||
|
SET_VAR 'var result: kotlin.Int [var] declared in <root>.sum' type=kotlin.Unit origin=PLUSEQ
|
||||||
|
CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=PLUSEQ
|
||||||
|
$this: GET_VAR 'var result: kotlin.Int [var] declared in <root>.sum' type=kotlin.Int origin=PLUSEQ
|
||||||
|
other: GET_VAR 'val arg: kotlin.Int [val] declared in <root>.sum' type=kotlin.Int origin=null
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun sum (vararg args: kotlin.Int): kotlin.Int declared in <root>'
|
||||||
|
GET_VAR 'var result: kotlin.Int [var] declared in <root>.sum' type=kotlin.Int origin=null
|
||||||
|
FUN name:nsum visibility:public modality:FINAL <> (args:kotlin.Array<out kotlin.Number>) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:args index:0 type:kotlin.Array<out kotlin.Number> varargElementType:kotlin.Number [vararg]
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='public final fun nsum (vararg args: kotlin.Number): kotlin.Int declared in <root>'
|
||||||
|
CALL 'public final fun sum (vararg args: kotlin.Int): kotlin.Int declared in <root>' type=kotlin.Int origin=null
|
||||||
|
args: VARARG type=kotlin.IntArray varargElementType=kotlin.Int
|
||||||
|
SPREAD_ELEMENT
|
||||||
|
CONSTRUCTOR_CALL 'public constructor <init> (size: kotlin.Int, init: kotlin.Function1<kotlin.Int, kotlin.Int>) declared in kotlin.IntArray' type=kotlin.IntArray origin=null
|
||||||
|
size: CALL 'public final fun <get-size> (): kotlin.Int declared in kotlin.Array' type=kotlin.Int origin=GET_PROPERTY
|
||||||
|
$this: GET_VAR 'args: kotlin.Array<out kotlin.Number> [vararg] declared in <root>.nsum' type=kotlin.Array<out kotlin.Number> origin=null
|
||||||
|
init: FUN_EXPR type=kotlin.Function1<kotlin.Int, kotlin.Int> origin=LAMBDA
|
||||||
|
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.Int) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:it index:0 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='local final fun <anonymous> (it: kotlin.Int): kotlin.Int declared in <root>.nsum'
|
||||||
|
CALL 'public abstract fun toInt (): kotlin.Int declared in kotlin.Number' type=kotlin.Int origin=null
|
||||||
|
$this: CALL 'public final fun get (index: kotlin.Int): T of kotlin.Array [operator] declared in kotlin.Array' type=kotlin.Number origin=GET_ARRAY_ELEMENT
|
||||||
|
$this: GET_VAR 'args: kotlin.Array<out kotlin.Number> [vararg] declared in <root>.nsum' type=kotlin.Array<out kotlin.Number> origin=null
|
||||||
|
index: GET_VAR 'it: kotlin.Int declared in <root>.nsum.<anonymous>' type=kotlin.Int origin=null
|
||||||
|
FUN name:zap visibility:public modality:FINAL <> (b:kotlin.Array<out kotlin.String>, k:kotlin.Int) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:b index:0 type:kotlin.Array<out kotlin.String> varargElementType:kotlin.String [vararg]
|
||||||
|
VALUE_PARAMETER name:k index:1 type:kotlin.Int
|
||||||
|
EXPRESSION_BODY
|
||||||
|
CONST Int type=kotlin.Int value=42
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:usePlainArgs visibility:public modality:FINAL <> (fn:kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Int>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Int>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:usePrimitiveArray visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.IntArray, kotlin.Int>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.IntArray, kotlin.Int>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:useArray visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Array<kotlin.Int>, kotlin.Int>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Array<kotlin.Int>, kotlin.Int>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:useStringArray visibility:public modality:FINAL <> (fn:kotlin.Function1<kotlin.Array<kotlin.String>, kotlin.Unit>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:fn index:0 type:kotlin.Function1<kotlin.Array<kotlin.String>, kotlin.Unit>
|
||||||
|
BLOCK_BODY
|
||||||
|
FUN name:testPlainArgs visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public final fun usePlainArgs (fn: kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Int>): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
fn: BLOCK type=kotlin.reflect.KFunction2<kotlin.Int, kotlin.Int, kotlin.Int> origin=null
|
||||||
|
FUN name:sum visibility:local modality:FINAL <> (p0:kotlin.Int, p1:kotlin.Int) returnType:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:p0 index:0 type:kotlin.Int
|
||||||
|
VALUE_PARAMETER name:p1 index:1 type:kotlin.Int
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='local final fun sum (p0: kotlin.Int, p1: kotlin.Int): kotlin.Int declared in <root>.testPlainArgs'
|
||||||
|
CALL 'public final fun sum (vararg args: kotlin.Int): kotlin.Int declared in <root>' type=kotlin.Int origin=null
|
||||||
|
args: VARARG type=kotlin.IntArray varargElementType=kotlin.Int
|
||||||
|
GET_VAR 'p0: kotlin.Int declared in <root>.testPlainArgs.sum' type=kotlin.Int origin=null
|
||||||
|
GET_VAR 'p1: kotlin.Int declared in <root>.testPlainArgs.sum' type=kotlin.Int origin=null
|
||||||
|
FUNCTION_REFERENCE 'local final fun sum (p0: kotlin.Int, p1: kotlin.Int): kotlin.Int declared in <root>.testPlainArgs' type=kotlin.reflect.KFunction2<kotlin.Int, kotlin.Int, kotlin.Int> origin=null
|
||||||
|
FUN name:testPrimitiveArrayAsVararg visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public final fun usePrimitiveArray (fn: kotlin.Function1<kotlin.IntArray, kotlin.Int>): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
fn: FUNCTION_REFERENCE 'public final fun sum (vararg args: kotlin.Int): kotlin.Int declared in <root>' type=kotlin.reflect.KFunction1<kotlin.IntArray, kotlin.Int> origin=null
|
||||||
|
FUN name:testArrayAsVararg visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public final fun useArray (fn: kotlin.Function1<kotlin.Array<kotlin.Int>, kotlin.Int>): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
fn: FUNCTION_REFERENCE 'public final fun nsum (vararg args: kotlin.Number): kotlin.Int declared in <root>' type=kotlin.reflect.KFunction1<kotlin.Array<out kotlin.Number>, kotlin.Int> origin=null
|
||||||
|
FUN name:testArrayAndDefaults visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public final fun useStringArray (fn: kotlin.Function1<kotlin.Array<kotlin.String>, kotlin.Unit>): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
fn: BLOCK type=kotlin.reflect.KFunction1<kotlin.Array<out kotlin.String>, kotlin.Unit> origin=null
|
||||||
|
FUN name:zap visibility:local modality:FINAL <> (p0:kotlin.Array<out kotlin.String>) returnType:kotlin.Unit
|
||||||
|
VALUE_PARAMETER name:p0 index:0 type:kotlin.Array<out kotlin.String>
|
||||||
|
BLOCK_BODY
|
||||||
|
CALL 'public final fun zap (vararg b: kotlin.String, k: kotlin.Int): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||||
|
b: VARARG type=kotlin.Array<out kotlin.String> varargElementType=kotlin.String
|
||||||
|
SPREAD_ELEMENT
|
||||||
|
GET_VAR 'p0: kotlin.Array<out kotlin.String> declared in <root>.testArrayAndDefaults.zap' type=kotlin.Array<out kotlin.String> origin=null
|
||||||
|
FUNCTION_REFERENCE 'local final fun zap (p0: kotlin.Array<out kotlin.String>): kotlin.Unit declared in <root>.testArrayAndDefaults' type=kotlin.reflect.KFunction1<kotlin.Array<out kotlin.String>, kotlin.Unit> origin=null
|
||||||
@@ -801,6 +801,16 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
|||||||
runTest("compiler/testData/ir/irText/expressions/callableReferenceTypeArguments.kt");
|
runTest("compiler/testData/ir/irText/expressions/callableReferenceTypeArguments.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callableReferenceWithArgumentsConversion.kt")
|
||||||
|
public void testCallableReferenceWithArgumentsConversion() throws Exception {
|
||||||
|
runTest("compiler/testData/ir/irText/expressions/callableReferenceWithArgumentsConversion.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("callableReferenceWithVarargViewedAsArray.kt")
|
||||||
|
public void testCallableReferenceWithVarargViewedAsArray() throws Exception {
|
||||||
|
runTest("compiler/testData/ir/irText/expressions/callableReferenceWithVarargViewedAsArray.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("calls.kt")
|
@TestMetadata("calls.kt")
|
||||||
public void testCalls() throws Exception {
|
public void testCalls() throws Exception {
|
||||||
runTest("compiler/testData/ir/irText/expressions/calls.kt");
|
runTest("compiler/testData/ir/irText/expressions/calls.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user