FIR2IR: fix origins for anonymous functions & lambdas

This commit is contained in:
Mikhail Glukhikh
2021-12-08 18:37:36 +03:00
committed by TeamCityServer
parent a6d4f9c3b0
commit e591f79533
9 changed files with 13 additions and 188 deletions
@@ -248,7 +248,7 @@ class Fir2IrVisitor(
val irFunction = declarationStorage.createIrFunction(
anonymousFunction,
irParent = conversionScope.parent(),
predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA,
predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION,
isLocal = true
)
conversionScope.withFunction(irFunction) {
@@ -257,7 +257,11 @@ class Fir2IrVisitor(
val type = anonymousFunction.typeRef.toIrType()
IrFunctionExpressionImpl(startOffset, endOffset, type, irFunction, IrStatementOrigin.LAMBDA)
IrFunctionExpressionImpl(
startOffset, endOffset, type, irFunction,
if (irFunction.origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA) IrStatementOrigin.LAMBDA
else IrStatementOrigin.ANONYMOUS_FUNCTION
)
}
}
@@ -47,8 +47,8 @@ FILE fqName:<root> fileName:/lambdas.kt
PROPERTY name:test4 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test4 type:kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> (i:kotlin.Int, j:kotlin.Int) returnType:kotlin.Unit
FUN_EXPR type=kotlin.Function2<kotlin.Int, kotlin.Int, kotlin.Unit> origin=ANONYMOUS_FUNCTION
FUN LOCAL_FUNCTION name:<no name provided> visibility:local modality:FINAL <> (i:kotlin.Int, j:kotlin.Int) returnType:kotlin.Unit
VALUE_PARAMETER name:i index:0 type:kotlin.Int
VALUE_PARAMETER name:j index:1 type:kotlin.Int
BLOCK_BODY
@@ -26,8 +26,8 @@ FILE fqName:<root> fileName:/variableAsFunctionCallWithGenerics.kt
$receiver: VALUE_PARAMETER name:<this> type:T of <root>.<get-kt26531Val>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-kt26531Val> <T> (): kotlin.Function0<T of <root>.<get-kt26531Val>> declared in <root>'
FUN_EXPR type=kotlin.Function0<T of <root>.<get-kt26531Val>> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> () returnType:T of <root>.<get-kt26531Val>
FUN_EXPR type=kotlin.Function0<T of <root>.<get-kt26531Val>> origin=ANONYMOUS_FUNCTION
FUN LOCAL_FUNCTION name:<no name provided> visibility:local modality:FINAL <> () returnType:T of <root>.<get-kt26531Val>
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <no name provided> (): T of <root>.<get-kt26531Val> declared in <root>.<get-kt26531Val>'
GET_VAR '<this>: T of <root>.<get-kt26531Val> declared in <root>.<get-kt26531Val>' type=T of <root>.<get-kt26531Val> origin=null
@@ -1,110 +0,0 @@
FILE fqName:<root> fileName:/functionLiteralGenericSignature.kt
PROPERTY name:unitFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:unitFun type:kotlin.Function0<kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function0<kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Unit
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <anonymous> (): kotlin.Unit declared in <root>.unitFun'
GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-unitFun> visibility:public modality:FINAL <> () returnType:kotlin.Function0<kotlin.Unit>
correspondingProperty: PROPERTY name:unitFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-unitFun> (): kotlin.Function0<kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:unitFun type:kotlin.Function0<kotlin.Unit> visibility:private [final,static]' type=kotlin.Function0<kotlin.Unit> origin=null
PROPERTY name:intFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:intFun type:kotlin.Function0<kotlin.Int> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function0<kotlin.Int> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Int
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <anonymous> (): kotlin.Int declared in <root>.intFun'
CONST Int type=kotlin.Int value=42
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-intFun> visibility:public modality:FINAL <> () returnType:kotlin.Function0<kotlin.Int>
correspondingProperty: PROPERTY name:intFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-intFun> (): kotlin.Function0<kotlin.Int> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:intFun type:kotlin.Function0<kotlin.Int> visibility:private [final,static]' type=kotlin.Function0<kotlin.Int> origin=null
PROPERTY name:stringParamFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:stringParamFun type:kotlin.Function1<kotlin.String, kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function1<kotlin.String, kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (x:kotlin.String) returnType:kotlin.Unit
VALUE_PARAMETER name:x index:0 type:kotlin.String
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <anonymous> (x: kotlin.String): kotlin.Unit declared in <root>.stringParamFun'
GET_OBJECT 'CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public superTypes:[kotlin.Any]' type=kotlin.Unit
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-stringParamFun> visibility:public modality:FINAL <> () returnType:kotlin.Function1<kotlin.String, kotlin.Unit>
correspondingProperty: PROPERTY name:stringParamFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-stringParamFun> (): kotlin.Function1<kotlin.String, kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:stringParamFun type:kotlin.Function1<kotlin.String, kotlin.Unit> visibility:private [final,static]' type=kotlin.Function1<kotlin.String, kotlin.Unit> origin=null
PROPERTY name:listFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:listFun type:kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.collections.List<kotlin.String>> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.collections.List<kotlin.String>> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (l:kotlin.collections.List<kotlin.String>) returnType:kotlin.collections.List<kotlin.String>
VALUE_PARAMETER name:l index:0 type:kotlin.collections.List<kotlin.String>
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <anonymous> (l: kotlin.collections.List<kotlin.String>): kotlin.collections.List<kotlin.String> declared in <root>.listFun'
GET_VAR 'l: kotlin.collections.List<kotlin.String> declared in <root>.listFun.<anonymous>' type=kotlin.collections.List<kotlin.String> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-listFun> visibility:public modality:FINAL <> () returnType:kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.collections.List<kotlin.String>>
correspondingProperty: PROPERTY name:listFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-listFun> (): kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.collections.List<kotlin.String>> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:listFun type:kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.collections.List<kotlin.String>> visibility:private [final,static]' type=kotlin.Function1<kotlin.collections.List<kotlin.String>, kotlin.collections.List<kotlin.String>> origin=null
PROPERTY name:mutableListFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:mutableListFun type:kotlin.Function1<kotlin.collections.MutableList<kotlin.Double>, kotlin.collections.MutableList<kotlin.Int>> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function1<kotlin.collections.MutableList<kotlin.Double>, kotlin.collections.MutableList<kotlin.Int>> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> (l:kotlin.collections.MutableList<kotlin.Double>) returnType:kotlin.collections.MutableList<kotlin.Int>
VALUE_PARAMETER name:l index:0 type:kotlin.collections.MutableList<kotlin.Double>
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <no name provided> (l: kotlin.collections.MutableList<kotlin.Double>): kotlin.collections.MutableList<kotlin.Int> declared in <root>.mutableListFun'
CALL 'public final fun CHECK_NOT_NULL <T0> (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): T0 of kotlin.internal.ir.CHECK_NOT_NULL declared in kotlin.internal.ir' type=kotlin.Nothing origin=EXCLEXCL
<T0>: kotlin.Nothing
arg0: CONST Null type=kotlin.Nothing? value=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-mutableListFun> visibility:public modality:FINAL <> () returnType:kotlin.Function1<kotlin.collections.MutableList<kotlin.Double>, kotlin.collections.MutableList<kotlin.Int>>
correspondingProperty: PROPERTY name:mutableListFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-mutableListFun> (): kotlin.Function1<kotlin.collections.MutableList<kotlin.Double>, kotlin.collections.MutableList<kotlin.Int>> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:mutableListFun type:kotlin.Function1<kotlin.collections.MutableList<kotlin.Double>, kotlin.collections.MutableList<kotlin.Int>> visibility:private [final,static]' type=kotlin.Function1<kotlin.collections.MutableList<kotlin.Double>, kotlin.collections.MutableList<kotlin.Int>> origin=null
PROPERTY name:funWithIn visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:funWithIn type:kotlin.Function1<kotlin.Comparable<kotlin.String>, kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function1<kotlin.Comparable<kotlin.String>, kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> (x:kotlin.Comparable<kotlin.String>) returnType:kotlin.Unit
VALUE_PARAMETER name:x index:0 type:kotlin.Comparable<kotlin.String>
BLOCK_BODY
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-funWithIn> visibility:public modality:FINAL <> () returnType:kotlin.Function1<kotlin.Comparable<kotlin.String>, kotlin.Unit>
correspondingProperty: PROPERTY name:funWithIn visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-funWithIn> (): kotlin.Function1<kotlin.Comparable<kotlin.String>, kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:funWithIn type:kotlin.Function1<kotlin.Comparable<kotlin.String>, kotlin.Unit> visibility:private [final,static]' type=kotlin.Function1<kotlin.Comparable<kotlin.String>, kotlin.Unit> origin=null
PROPERTY name:extensionFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:extensionFun type:@[ExtensionFunctionType] kotlin.Function1<kotlin.Any, kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=@[ExtensionFunctionType] kotlin.Function1<kotlin.Any, kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> ($receiver:kotlin.Any) returnType:kotlin.Unit
$receiver: VALUE_PARAMETER name:<this> type:kotlin.Any
BLOCK_BODY
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-extensionFun> visibility:public modality:FINAL <> () returnType:@[ExtensionFunctionType] kotlin.Function1<kotlin.Any, kotlin.Unit>
correspondingProperty: PROPERTY name:extensionFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-extensionFun> (): @[ExtensionFunctionType] kotlin.Function1<kotlin.Any, kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:extensionFun type:@[ExtensionFunctionType] kotlin.Function1<kotlin.Any, kotlin.Unit> visibility:private [final,static]' type=@[ExtensionFunctionType] kotlin.Function1<kotlin.Any, kotlin.Unit> origin=null
PROPERTY name:extensionWithArgFun visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:extensionWithArgFun type:@[ExtensionFunctionType] kotlin.Function2<kotlin.Long, kotlin.Any, java.util.Date> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=@[ExtensionFunctionType] kotlin.Function2<kotlin.Long, kotlin.Any, java.util.Date> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> ($receiver:kotlin.Long, x:kotlin.Any) returnType:java.util.Date
$receiver: VALUE_PARAMETER name:<this> type:kotlin.Long
VALUE_PARAMETER name:x index:0 type:kotlin.Any
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <no name provided> (x: kotlin.Any): java.util.Date declared in <root>.extensionWithArgFun'
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.util.Date' type=java.util.Date origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-extensionWithArgFun> visibility:public modality:FINAL <> () returnType:@[ExtensionFunctionType] kotlin.Function2<kotlin.Long, kotlin.Any, java.util.Date>
correspondingProperty: PROPERTY name:extensionWithArgFun visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-extensionWithArgFun> (): @[ExtensionFunctionType] kotlin.Function2<kotlin.Long, kotlin.Any, java.util.Date> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:extensionWithArgFun type:@[ExtensionFunctionType] kotlin.Function2<kotlin.Long, kotlin.Any, java.util.Date> visibility:private [final,static]' type=@[ExtensionFunctionType] kotlin.Function2<kotlin.Long, kotlin.Any, java.util.Date> origin=null
@@ -1,53 +0,0 @@
val unitFun: Function0<Unit>
field = local fun <anonymous>() {
return Unit
}
get
val intFun: Function0<Int>
field = local fun <anonymous>(): Int {
return 42
}
get
val stringParamFun: Function1<String, Unit>
field = local fun <anonymous>(x: String) {
return Unit
}
get
val listFun: Function1<List<String>, List<String>>
field = local fun <anonymous>(l: List<String>): List<String> {
return l
}
get
val mutableListFun: Function1<MutableList<Double>, MutableList<Int>>
field = local fun <no name provided>(l: MutableList<Double>): MutableList<Int> {
return CHECK_NOT_NULL<Nothing>(arg0 = null)
}
get
val funWithIn: Function1<Comparable<String>, Unit>
field = local fun <no name provided>(x: Comparable<String>) {
}
get
val extensionFun: @ExtensionFunctionType Function1<Any, Unit>
field = local fun Any.<no name provided>() {
}
get
val extensionWithArgFun: @ExtensionFunctionType Function2<Long, Any, Date>
field = local fun Long.<no name provided>(x: Any): Date {
return Date()
}
get
@@ -1,3 +1,5 @@
// SKIP_KLIB_TEST
// FIR_IDENTICAL
import java.util.Date
val unitFun = { }
@@ -1,13 +0,0 @@
FILE fqName:<root> fileName:/anonymousFunction.kt
PROPERTY name:anonymous visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:anonymous type:kotlin.Function0<kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function0<kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<no name provided> visibility:local modality:FINAL <> () returnType:kotlin.Unit
BLOCK_BODY
CALL 'public final fun println (): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-anonymous> visibility:public modality:FINAL <> () returnType:kotlin.Function0<kotlin.Unit>
correspondingProperty: PROPERTY name:anonymous visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-anonymous> (): kotlin.Function0<kotlin.Unit> declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:anonymous type:kotlin.Function0<kotlin.Unit> visibility:private [final,static]' type=kotlin.Function0<kotlin.Unit> origin=null
@@ -1,6 +0,0 @@
val anonymous: Function0<Unit>
field = local fun <no name provided>() {
println()
}
get
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// WITH_STDLIB
val anonymous = fun() { println() }