[PSI2IR, IR] Support functional types and literals for IR
This commit is contained in:
committed by
TeamCityServer
parent
910660a083
commit
155e7b211b
+6
@@ -16238,6 +16238,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP/dp.kt");
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP/dp.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("functionalType.kt")
|
||||||
|
public void testFunctionalType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP/functionalType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("monoidSum.kt")
|
@TestMetadata("monoidSum.kt")
|
||||||
public void testMonoidSum() throws Exception {
|
public void testMonoidSum() throws Exception {
|
||||||
|
|||||||
+6
-2
@@ -52,11 +52,15 @@ internal class KFunctionProxy(
|
|||||||
// TODO check arity
|
// TODO check arity
|
||||||
var index = 0
|
var index = 0
|
||||||
val dispatchReceiver = state.irFunction.dispatchReceiverParameter?.let { environment.convertToState(args[index++], it.type) }
|
val dispatchReceiver = state.irFunction.dispatchReceiverParameter?.let { environment.convertToState(args[index++], it.type) }
|
||||||
|
val contextReceiverParametersCount = state.irFunction.contextReceiverParametersCount
|
||||||
|
val contextReceivers = state.irFunction.valueParameters.take(contextReceiverParametersCount).map {
|
||||||
|
environment.convertToState(args[index++], it.type)
|
||||||
|
}
|
||||||
val extensionReceiver = state.irFunction.extensionReceiverParameter?.let { environment.convertToState(args[index++], it.type) }
|
val extensionReceiver = state.irFunction.extensionReceiverParameter?.let { environment.convertToState(args[index++], it.type) }
|
||||||
val argsVariables = state.irFunction.valueParameters.map { parameter ->
|
val argsVariables = state.irFunction.valueParameters.drop(contextReceiverParametersCount).map { parameter ->
|
||||||
environment.convertToState(args[index++], parameter.type)
|
environment.convertToState(args[index++], parameter.type)
|
||||||
}
|
}
|
||||||
val valueArguments = listOfNotNull(dispatchReceiver, extensionReceiver) + argsVariables
|
val valueArguments = listOfNotNull(dispatchReceiver) + contextReceivers + listOfNotNull(extensionReceiver) + argsVariables
|
||||||
return callInterceptor.interceptProxy(state.irFunction, valueArguments)
|
return callInterceptor.interceptProxy(state.irFunction, valueArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-6
@@ -327,17 +327,16 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
|||||||
|
|
||||||
val bodyGenerator = createBodyGenerator(irFunction.symbol)
|
val bodyGenerator = createBodyGenerator(irFunction.symbol)
|
||||||
|
|
||||||
val contextReceiversNumber = ktContextReceiverParameterElements.size
|
val contextReceiverParametersCount = functionDescriptor.contextReceiverParameters.size
|
||||||
assert(functionDescriptor.contextReceiverParameters.size == contextReceiversNumber)
|
irFunction.contextReceiverParametersCount = contextReceiverParametersCount
|
||||||
irFunction.contextReceiverParametersCount = contextReceiversNumber
|
|
||||||
irFunction.valueParameters += functionDescriptor.contextReceiverParameters.mapIndexed { i, additionalReceiver ->
|
irFunction.valueParameters += functionDescriptor.contextReceiverParameters.mapIndexed { i, additionalReceiver ->
|
||||||
declareParameter(additionalReceiver, ktContextReceiverParameterElements[i], irFunction, null, i)
|
declareParameter(additionalReceiver, ktContextReceiverParameterElements.getOrNull(i) ?: ktParameterOwner, irFunction, null, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Declare all the value parameters up first.
|
// Declare all the value parameters up first.
|
||||||
irFunction.valueParameters += functionDescriptor.valueParameters.mapIndexed { i, valueParameterDescriptor ->
|
irFunction.valueParameters += functionDescriptor.valueParameters.mapIndexed { i, valueParameterDescriptor ->
|
||||||
val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter
|
val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter
|
||||||
declareParameter(valueParameterDescriptor, ktParameter, irFunction, null, i + contextReceiversNumber)
|
declareParameter(valueParameterDescriptor, ktParameter, irFunction, null, i + contextReceiverParametersCount)
|
||||||
}
|
}
|
||||||
// Only after value parameters have been declared, generate default values. This ensures
|
// Only after value parameters have been declared, generate default values. This ensures
|
||||||
// that forward references to other parameters works in default value lambdas. For example:
|
// that forward references to other parameters works in default value lambdas. For example:
|
||||||
@@ -345,7 +344,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
|||||||
// fun f(f1: () -> String = { f2() },
|
// fun f(f1: () -> String = { f2() },
|
||||||
// f2: () -> String) = f1()
|
// f2: () -> String) = f1()
|
||||||
if (withDefaultValues) {
|
if (withDefaultValues) {
|
||||||
irFunction.valueParameters.drop(contextReceiversNumber).forEachIndexed { index, irValueParameter ->
|
irFunction.valueParameters.drop(contextReceiverParametersCount).forEachIndexed { index, irValueParameter ->
|
||||||
val valueParameterDescriptor = functionDescriptor.valueParameters[index]
|
val valueParameterDescriptor = functionDescriptor.valueParameters[index]
|
||||||
val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter
|
val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter
|
||||||
irValueParameter.defaultValue = ktParameter?.defaultValue?.let { defaultValue ->
|
irValueParameter.defaultValue = ktParameter?.defaultValue?.let { defaultValue ->
|
||||||
|
|||||||
+1
@@ -367,6 +367,7 @@ class IrDescriptorBasedFunctionFactory(
|
|||||||
newFunction.overriddenSymbols = descriptor.overriddenDescriptors.map { symbolTable.referenceSimpleFunction(it.original) }
|
newFunction.overriddenSymbols = descriptor.overriddenDescriptors.map { symbolTable.referenceSimpleFunction(it.original) }
|
||||||
newFunction.dispatchReceiverParameter = descriptor.dispatchReceiverParameter?.let { newFunction.createValueParameter(it) }
|
newFunction.dispatchReceiverParameter = descriptor.dispatchReceiverParameter?.let { newFunction.createValueParameter(it) }
|
||||||
newFunction.extensionReceiverParameter = descriptor.extensionReceiverParameter?.let { newFunction.createValueParameter(it) }
|
newFunction.extensionReceiverParameter = descriptor.extensionReceiverParameter?.let { newFunction.createValueParameter(it) }
|
||||||
|
newFunction.contextReceiverParametersCount = descriptor.contextReceiverParameters.size
|
||||||
newFunction.valueParameters = descriptor.valueParameters.map { newFunction.createValueParameter(it) }
|
newFunction.valueParameters = descriptor.valueParameters.map { newFunction.createValueParameter(it) }
|
||||||
newFunction.correspondingPropertySymbol = property
|
newFunction.correspondingPropertySymbol = property
|
||||||
|
|
||||||
|
|||||||
Vendored
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// !LANGUAGE: +ContextReceivers
|
||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
// IGNORE_BACKEND_FIR: JVM_IR
|
||||||
|
|
||||||
|
class Param
|
||||||
|
class O {
|
||||||
|
val o = "o"
|
||||||
|
}
|
||||||
|
class K {
|
||||||
|
val k = "k"
|
||||||
|
}
|
||||||
|
|
||||||
|
context(O)
|
||||||
|
fun <T> K.f(g: context(O) K.(Param) -> T) = g(this@O, this@K, Param())
|
||||||
|
|
||||||
|
fun box() = with(O()) {
|
||||||
|
K().f { o + k }
|
||||||
|
}
|
||||||
+6
@@ -16238,6 +16238,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP/dp.kt");
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP/dp.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("functionalType.kt")
|
||||||
|
public void testFunctionalType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP/functionalType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("monoidSum.kt")
|
@TestMetadata("monoidSum.kt")
|
||||||
public void testMonoidSum() throws Exception {
|
public void testMonoidSum() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user