FIR2IR: fix assertion in getIrFunctionSymbol (anonymous function case)
This commit is contained in:
+13
-3
@@ -407,7 +407,11 @@ class Fir2IrDeclarationStorage(
|
|||||||
return created
|
return created
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getIrLocalFunction(function: FirAnonymousFunction): IrSimpleFunction {
|
fun getIrLocalFunction(
|
||||||
|
function: FirAnonymousFunction,
|
||||||
|
irParent: IrDeclarationParent? = null,
|
||||||
|
shouldLeaveScope: Boolean = false
|
||||||
|
): IrSimpleFunction {
|
||||||
val descriptor = WrappedSimpleFunctionDescriptor()
|
val descriptor = WrappedSimpleFunctionDescriptor()
|
||||||
val isLambda = function.psi is KtFunctionLiteral
|
val isLambda = function.psi is KtFunctionLiteral
|
||||||
val origin = if (isLambda) IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA else IrDeclarationOrigin.DEFINED
|
val origin = if (isLambda) IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA else IrDeclarationOrigin.DEFINED
|
||||||
@@ -426,7 +430,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
isOperator = false
|
isOperator = false
|
||||||
)
|
)
|
||||||
}.bindAndDeclareParameters(
|
}.bindAndDeclareParameters(
|
||||||
function, descriptor, irParent = null, isStatic = false, shouldLeaveScope = false
|
function, descriptor, irParent = irParent, isStatic = false, shouldLeaveScope = shouldLeaveScope
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -674,13 +678,19 @@ class Fir2IrDeclarationStorage(
|
|||||||
}
|
}
|
||||||
irSymbolTable.referenceSimpleFunction(irDeclaration.descriptor)
|
irSymbolTable.referenceSimpleFunction(irDeclaration.descriptor)
|
||||||
}
|
}
|
||||||
|
is FirAnonymousFunction -> {
|
||||||
|
val irDeclaration = getIrLocalFunction(firDeclaration, irParent, shouldLeaveScope = true).apply {
|
||||||
|
setAndModifyParent(irParent)
|
||||||
|
}
|
||||||
|
irSymbolTable.referenceSimpleFunction(irDeclaration.descriptor)
|
||||||
|
}
|
||||||
is FirConstructor -> {
|
is FirConstructor -> {
|
||||||
val irDeclaration = getIrConstructor(firDeclaration, irParent, shouldLeaveScope = true).apply {
|
val irDeclaration = getIrConstructor(firDeclaration, irParent, shouldLeaveScope = true).apply {
|
||||||
setAndModifyParent(irParent)
|
setAndModifyParent(irParent)
|
||||||
}
|
}
|
||||||
irSymbolTable.referenceConstructor(irDeclaration.descriptor)
|
irSymbolTable.referenceConstructor(irDeclaration.descriptor)
|
||||||
}
|
}
|
||||||
else -> throw AssertionError("Should not be here")
|
else -> throw AssertionError("Should not be here: ${firDeclaration::class.java}: ${firDeclaration.render()}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,4 +10,4 @@ FILE fqName:<root> fileName:/extensionLambda.kt
|
|||||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Int
|
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Int
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
CALL 'public open fun <get-length> (): kotlin.Int declared in kotlin.String' type=kotlin.Int origin=null
|
CALL 'public open fun <get-length> (): kotlin.Int declared in kotlin.String' type=kotlin.Int origin=null
|
||||||
$this: GET_VAR '<this>: kotlin.String declared in kotlin.String' type=kotlin.String origin=null
|
$this: ERROR_CALL 'Unresolved reference: this@R|special/anonymous|' type=kotlin.String
|
||||||
|
|||||||
@@ -106,4 +106,4 @@ FILE fqName:<root> fileName:/multipleImplicitReceivers.kt
|
|||||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Int
|
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Int
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
CALL 'public open fun invoke (): kotlin.Int [operator] declared in <root>.IInvoke' type=kotlin.Int origin=null
|
CALL 'public open fun invoke (): kotlin.Int [operator] declared in <root>.IInvoke' type=kotlin.Int origin=null
|
||||||
$this: GET_VAR '<this>: <root>.IInvoke declared in <root>.IInvoke' type=<root>.IInvoke origin=null
|
$this: ERROR_CALL 'Unresolved reference: this@R|special/anonymous|' type=<root>.IInvoke
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ FILE fqName:<root> fileName:/builtinMap.kt
|
|||||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Unit
|
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Unit
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
CALL 'public open fun put (p0: K1 of <root>.plus, p1: V1 of <root>.plus): V1 of <root>.plus? [operator] declared in java.util.HashMap' type=V1 of <root>.plus? origin=null
|
CALL 'public open fun put (p0: K1 of <root>.plus, p1: V1 of <root>.plus): V1 of <root>.plus? [operator] declared in java.util.HashMap' type=V1 of <root>.plus? origin=null
|
||||||
$this: GET_VAR '<this>: java.util.HashMap declared in java.util.HashMap' type=java.util.HashMap<*, *> origin=null
|
$this: ERROR_CALL 'Unresolved reference: this@R|special/anonymous|' type=java.util.LinkedHashMap<K1 of <root>.plus, V1 of <root>.plus>
|
||||||
p0: CALL 'public final fun <get-first> (): K1 of <root>.plus declared in kotlin.Pair' type=K1 of <root>.plus origin=null
|
p0: CALL 'public final fun <get-first> (): K1 of <root>.plus declared in kotlin.Pair' type=K1 of <root>.plus origin=null
|
||||||
$this: GET_VAR 'pair: kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> declared in <root>.plus' type=kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> origin=null
|
$this: GET_VAR 'pair: kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> declared in <root>.plus' type=kotlin.Pair<K1 of <root>.plus, V1 of <root>.plus> origin=null
|
||||||
p1: CALL 'public final fun <get-second> (): V1 of <root>.plus declared in kotlin.Pair' type=V1 of <root>.plus origin=null
|
p1: CALL 'public final fun <get-second> (): V1 of <root>.plus declared in kotlin.Pair' type=V1 of <root>.plus origin=null
|
||||||
|
|||||||
Reference in New Issue
Block a user