[FIR] Fix translation of invokes & add return expressions for lambdas

* fixed NoSuchMethod caused by mismatched signatures of the "invoke" method generated for lambda arguments
* added test cases in invoke.kt for KFunction and anonymous functions
* added a transformer to wrap the last expression in the bodies of lambdas with return
This commit is contained in:
Juan Chen
2020-02-01 18:18:03 -08:00
committed by Mikhail Glukhikh
parent 5eedba3903
commit 7249d2f889
194 changed files with 397 additions and 506 deletions
@@ -12,18 +12,14 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope
import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator
@@ -485,8 +481,8 @@ class Fir2IrVisitor(
}
}
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?): IrElement =
anonymousFunction.convertWithOffsets { startOffset, endOffset ->
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?): IrElement {
return anonymousFunction.convertWithOffsets { startOffset, endOffset ->
val irFunction = declarationStorage.getIrLocalFunction(anonymousFunction)
irFunction.setParentByParentStack().withFunction {
setFunctionContent(irFunction.descriptor, anonymousFunction)
@@ -496,6 +492,7 @@ class Fir2IrVisitor(
IrFunctionExpressionImpl(startOffset, endOffset, type, irFunction, IrStatementOrigin.LAMBDA)
}
}
private fun IrValueParameter.setDefaultValue(firValueParameter: FirValueParameter) {
val firDefaultValue = firValueParameter.defaultValue
@@ -708,6 +705,7 @@ class Fir2IrVisitor(
is FirPropertyFromParameterResolvedNamedReference -> IrStatementOrigin.INITIALIZE_PROPERTY_FROM_PARAMETER
is FirResolvedNamedReference -> when (resolvedSymbol) {
is AccessorSymbol, is SyntheticPropertySymbol -> IrStatementOrigin.GET_PROPERTY
is FirNamedFunctionSymbol -> if (resolvedSymbol.callableId.isInvoke()) IrStatementOrigin.INVOKE else null
else -> null
}
else -> null
@@ -893,12 +891,30 @@ class Fir2IrVisitor(
val convertibleCall = if (functionCall.toResolvedCallableSymbol()?.fir is FirIntegerOperator) {
functionCall.copy().transformSingle(integerApproximator, null)
} else {
functionCall
checkIfInvoke(functionCall)
}
return convertibleCall.toIrExpression(convertibleCall.typeRef)
.applyCallArguments(convertibleCall).applyTypeArguments(convertibleCall).applyReceivers(convertibleCall)
}
// Use the generic invoke method in Function classes, to match bridges generated by the backend.
private fun checkIfInvoke(functionCall: FirFunctionCall): FirFunctionCall {
if (functionCall !is FirFunctionCallImpl) {
return functionCall
}
val calleeReference = (functionCall.calleeReference as? FirResolvedNamedReferenceImpl) ?: return functionCall
val resolvedSymbol = (calleeReference.resolvedSymbol as? FirNamedFunctionSymbol) ?: return functionCall
if (resolvedSymbol.callableId.isInvoke()) {
functionCall.calleeReference =
FirResolvedNamedReferenceImpl(
source = calleeReference.source,
name = calleeReference.name,
resolvedSymbol = resolvedSymbol.overriddenSymbol!!
)
}
return functionCall
}
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Any?): IrElement {
return annotationCall.toIrExpression().applyCallArguments(annotationCall)
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
@@ -438,3 +439,8 @@ fun BodyResolveComponents.transformQualifiedAccessUsingSmartcastInfo(qualifiedAc
}
return FirExpressionWithSmartcastImpl(qualifiedAccessExpression, intersectedTypeRef, typesFromSmartCast)
}
fun CallableId.isInvoke() =
packageName == KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME
&& className?.asString()?.startsWith("Function") == true
&& callableName.asString() == "invoke"
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirFunctionTarget
import org.jetbrains.kotlin.fir.copy
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
@@ -13,7 +14,10 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.impl.FirReturnExpressionImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -27,10 +31,7 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirErrorTypeRefImpl
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -406,10 +407,10 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
return when (data) {
ResolutionMode.ContextDependent -> {
dataFlowAnalyzer.visitPostponedAnonymousFunction(anonymousFunction)
anonymousFunction.compose()
anonymousFunction.addReturn().compose()
}
is ResolutionMode.LambdaResolution -> {
transformAnonymousFunctionWithLambdaResolution(anonymousFunction, data).compose()
transformAnonymousFunctionWithLambdaResolution(anonymousFunction, data).addReturn().compose()
}
is ResolutionMode.WithExpectedType, is ResolutionMode.ContextIndependent -> {
val expectedTypeRef = (data as? ResolutionMode.WithExpectedType)?.expectedTypeRef ?: FirImplicitTypeRefImpl(null)
@@ -484,7 +485,7 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
val returnTypes = dataFlowAnalyzer.returnExpressionsOfAnonymousFunction(af).mapNotNull { (it as? FirExpression)?.resultType?.coneTypeUnsafe() }
af.replaceReturnTypeRef(af.returnTypeRef.resolvedTypeFromPrototype(inferenceComponents.ctx.commonSuperTypeOrNull(returnTypes) ?: session.builtinTypes.unitType.coneTypeUnsafe()))
af.replaceTypeRef(af.constructFunctionalTypeRef(session))
af.compose()
af.addReturn().compose()
}
is ResolutionMode.WithStatus -> {
throw AssertionError("Should not be here in WithStatus mode")
@@ -492,6 +493,36 @@ class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransformer)
}
}
private fun FirAnonymousFunction.addReturn(): FirAnonymousFunction {
val lastStatement = body?.statements?.lastOrNull()
val returnType = (body?.typeRef as? FirResolvedTypeRef) ?: return this
val returnNothing = returnType.isNothing || returnType.isUnit
if (lastStatement is FirExpression && !returnNothing) {
body?.transformChildren(
object : FirDefaultTransformer<FirExpression>() {
override fun <E : FirElement> transformElement(element: E, data: FirExpression): CompositeTransformResult<E> {
if (element == lastStatement) {
val returnExpression = FirReturnExpressionImpl(element.source, lastStatement)
returnExpression.target = FirFunctionTarget(null)
(returnExpression.target as FirFunctionTarget).bind(this@addReturn)
return (returnExpression as E).compose()
}
return element.compose()
}
override fun transformReturnExpression(
returnExpression: FirReturnExpression,
data: FirExpression
): CompositeTransformResult<FirStatement> {
return returnExpression.compose()
}
},
FirUnitExpression(null)
)
}
return this
}
private inline fun <T> withLabelAndReceiverType(
labelName: Name?,
owner: FirDeclaration,
@@ -3,7 +3,7 @@ FILE: incorrectFunctionalType.kt
}
public final fun test(): R|kotlin/Unit| {
R|/foo|(<L> = foo@fun R|kotlin/Int|.<anonymous>(it: R|kotlin/Int|): R|kotlin/Int| {
this@R|special/anonymous|.R|kotlin/Int.plus|(R|<local>/it|)
^ this@R|special/anonymous|.R|kotlin/Int.plus|(R|<local>/it|)
}
)
}
@@ -26,29 +26,29 @@ FILE: integerLiteralTypes.kt
}
public final fun test_3(): R|kotlin/Unit| {
R|/takeInt|(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
))
R|/takeByte|(R|kotlin/run|<R|kotlin/Byte|>(<L> = run@fun <anonymous>(): R|kotlin/Byte| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
))
R|/takeLong|(R|kotlin/run|<R|kotlin/Long|>(<L> = run@fun <anonymous>(): R|kotlin/Long| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
))
}
public final fun test_4(): R|kotlin/Unit| {
R|/takeAny|(Int(1))
R|/takeAny|(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
))
}
public final fun test_5(): R|kotlin/Unit| {
<Inapplicable(INAPPLICABLE): [/takeString]>#(Int(1))
<Inapplicable(INAPPLICABLE): [/takeString]>#(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
))
}
@@ -27,7 +27,7 @@ FILE: lambdaInLambda.kt
R|/buildString|(<L> = buildString@fun R|StringBuilder|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/insert|<R|StringBuilder|, R|KDocTemplate|>(R|/KDocTemplate.KDocTemplate|(), <L> = insert@fun R|KDocTemplate|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/KDocTemplate.definition|(<L> = definition@fun R|StringBuilder|.<anonymous>(): R|kotlin/Unit| {
R|<local>/ordinal|?.R|kotlin/let|<R|kotlin/Int|, R|kotlin/Unit|>(<L> = let@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
^ R|<local>/ordinal|?.R|kotlin/let|<R|kotlin/Int|, R|kotlin/Unit|>(<L> = let@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
Unit
}
)
@@ -8,7 +8,7 @@ FILE: main.kt
}
public final fun test(): R|kotlin/Unit| {
lval processor: <ERROR TYPE REF: Inapplicable(INAPPLICABLE): [/AdapterProcessor.AdapterProcessor]> = <Inapplicable(INAPPLICABLE): [/AdapterProcessor.AdapterProcessor]>#<R|PsiMethod|, R|PsiClass|>(R|/Function|<R|PsiMethod?|, R|PsiClass?|>(<L> = Function@fun <anonymous>(method: R|PsiMethod?|): R|PsiClass?| {
R|<local>/method|?.R|/PsiMethod.containingClass|
^ R|<local>/method|?.R|/PsiMethod.containingClass|
}
))
}
@@ -5,13 +5,13 @@ FILE: lambdaInUnresolvedCall.kt
public final fun test_1(): R|kotlin/Unit| {
<Unresolved name: myRun>#(<L> = myRun@fun <anonymous>(): R|kotlin/Int| {
lval x: R|kotlin/Int| = Int(1)
R|<local>/x|.R|kotlin/Int.times|(Int(2))
^ R|<local>/x|.R|kotlin/Int.times|(Int(2))
}
)
}
public final fun test_2(): R|kotlin/Unit| {
<Unresolved name: myRun>#(<L> = myRun@fun <anonymous>(): R|kotlin/Any?| {
R|/materialize|<R|kotlin/Any?|>()
^ R|/materialize|<R|kotlin/Any?|>()
}
)
}
@@ -56,7 +56,7 @@ fun test_5() {
fun test_6() {
<!INAPPLICABLE_CANDIDATE!>takeByte<!>(run { 127 + 1 })
<!INAPPLICABLE_CANDIDATE!>takeByte<!>(1 <!INAPPLICABLE_CANDIDATE!>+<!> run { 1 })
<!INAPPLICABLE_CANDIDATE!>takeByte<!>(1 + run { 1 })
takeByte(run { 1 + 1 })
1 + 1
run { 1 }
@@ -52,24 +52,24 @@ FILE: operatorsOverLiterals.kt
}
public final fun test_6(): R|kotlin/Unit| {
<Inapplicable(INAPPLICABLE): [/takeByte]>#(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(127).R|kotlin/Int.plus|(Int(1))
^ Int(127).R|kotlin/Int.plus|(Int(1))
}
))
<Inapplicable(INAPPLICABLE): [/takeByte]>#(Int(1).<Inapplicable(INAPPLICABLE): [kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus]>#(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(1)
<Inapplicable(INAPPLICABLE): [/takeByte]>#(Int(1).R|<local>/plus|(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
^ Int(1)
}
)))
R|/takeByte|(R|kotlin/run|<R|kotlin/Byte|>(<L> = run@fun <anonymous>(): R|kotlin/Byte| <kind=EXACTLY_ONCE> {
Int(1).R|kotlin/Int.plus|(Int(1))
^ Int(1).R|kotlin/Int.plus|(Int(1))
}
))
Int(1).R|kotlin/Int.plus|(Int(1))
R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
)
Int(1).R|<local>/plus|(R|kotlin/run|<R|kotlin/Int|>(<L> = run@fun <anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
Int(1)
^ Int(1)
}
))
}
@@ -7,7 +7,7 @@ FILE: overloadWithDefault.kt
}
public final fun test(a: R|A|): R|kotlin/Unit| {
R|<local>/a|.R|/A.foo|(<L> = foo@fun <anonymous>(): R|kotlin/Boolean| {
Boolean(true)
^ Boolean(true)
}
)
}
+2 -2
View File
@@ -14,12 +14,12 @@ FILE: cast.kt
public get(): R|() -> kotlin/Unit|
public final val h: R|(kotlin/String) -> kotlin/Boolean| = fun <anonymous>(_: R|kotlin/String|): R|kotlin/Boolean| {
Boolean(false)
^ Boolean(false)
}
public get(): R|(kotlin/String) -> kotlin/Boolean|
public final val hError: R|(ERROR CLASS: No type for parameter) -> kotlin/Boolean| = fun <anonymous>(_: R|ERROR CLASS: No type for parameter|): R|kotlin/Boolean| {
Boolean(true)
^ Boolean(true)
}
public get(): R|(ERROR CLASS: No type for parameter) -> kotlin/Boolean|
+1 -1
View File
@@ -31,7 +31,7 @@ digraph complex_kt {
17 [label="Postponed enter to lambda"];
18 [label="Postponed exit from lambda"];
19 [label="Function call: <Unresolved name: HttpRequests>#.<Unresolved name: request>#(R|<local>/url|).<Unresolved name: connect>#(<L> = connect@fun <anonymous>(): R|ERROR CLASS: Unresolved name: fromJson| {
<Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|)
^ <Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|)
}
)"];
20 [label="Exit block"];
+1 -1
View File
@@ -3,7 +3,7 @@ FILE: complex.kt
lval url: R|kotlin/String| = <strcat>(String(https://plugins.jetbrains.com/api/plugins/), R|<local>/pluginId|.<Unresolved name: idString>#.R|kotlin/toString|(), String(/updates?version=), R|<local>/version|.R|kotlin/Any.toString|())
lval pluginDTOs: R|kotlin/Array<ERROR CLASS: Symbol not found, for `PluginDTO`>| = try {
<Unresolved name: HttpRequests>#.<Unresolved name: request>#(R|<local>/url|).<Unresolved name: connect>#(<L> = connect@fun <anonymous>(): R|ERROR CLASS: Unresolved name: fromJson| {
<Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|)
^ <Unresolved name: GsonBuilder>#().<Unresolved name: create>#().<Unresolved name: fromJson>#(<Unresolved name: it>#.<Unresolved name: inputStream>#.<Ambiguity: reader, [kotlin/io/reader, kotlin/io/reader, kotlin/io/reader]>#(), <getClass>(Q|kotlin/Array|).R|kotlin/jvm/java|)
}
)
}
@@ -13,7 +13,7 @@ FILE: initBlockAndInPlaceLambda.kt
init {
lval c: R|C?| = R|<local>/a|.R|/A.b|?.R|kotlin/let|<R|B|, R|C|>(<L> = let@fun <anonymous>(it: R|B|): R|C| <kind=EXACTLY_ONCE> {
R|/C.C|(R|<local>/a|, R|<local>/it|)
^ R|/C.C|(R|<local>/a|, R|<local>/it|)
}
)
}
+1 -1
View File
@@ -41,7 +41,7 @@ digraph lambdas_kt {
}
17 [label="Postponed exit from lambda"];
18 [label="Function call: R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
R|<local>/x|.R|kotlin/Int.inc|()
^ R|<local>/x|.R|kotlin/Int.inc|()
}
)"];
19 [label="Exit block"];
+2 -2
View File
@@ -6,7 +6,7 @@ FILE: lambdas.kt
when () {
(R|<local>/x| is R|kotlin/Int|) -> {
R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
R|<local>/x|.R|kotlin/Int.inc|()
^ R|<local>/x|.R|kotlin/Int.inc|()
}
)
}
@@ -17,7 +17,7 @@ FILE: lambdas.kt
when () {
(R|<local>/x| is R|kotlin/Int|) -> {
lval lambda: R|() -> kotlin/Int| = fun <anonymous>(): R|kotlin/Int| {
R|<local>/x|.R|kotlin/Int.inc|()
^ R|<local>/x|.R|kotlin/Int.inc|()
}
}
-68
View File
@@ -1,68 +0,0 @@
0: Enter function "testWhile" -> 1
1: Enter block -> 2 | <- 0
2: Enter while loop -> 3 | <- 1
3: Enter loop condition -> 4 | <- 2, 12
4: Access variable R|<local>/b| -> 5 | <- 3
5: Exit loop condition -> 6, 13 | <- 4
6: Enter loop block -> 7 | <- 5
7: Enter block -> 8 | <- 6
8: Access variable R|<local>/x| -> 9 | <- 7
9: Type operator: "x is String" -> 10 | <- 8
10: Variable declaration: lval y: R|kotlin/Boolean| -> 11 | <- 9
11: Exit block -> 12 | <- 10
12: Exit loop block -> 3 | <- 11
13: Exit whileloop -> 14 | <- 5
14: Access variable R|<local>/x| -> 15 | <- 13
15: Type operator: "x is String" -> 16 | <- 14
16: Exit block -> 17 | <- 15
17: Exit function "testWhile" -> | <- 16
0: Enter function "testDoWhile" -> 1
1: Enter block -> 2 | <- 0
2: Enter do-while loop -> 3 | <- 1
3: Enter loop block -> 4 | <- 2, 12
4: Enter block -> 5 | <- 3
5: Access variable R|<local>/x| -> 6 | <- 4
6: Type operator: "x is String" -> 7 | <- 5
7: Variable declaration: lval y: R|kotlin/Boolean| -> 8 | <- 6
8: Exit block -> 9 | <- 7
9: Exit loop block -> 10 | <- 8
10: Enter loop condition -> 11 | <- 9
11: Access variable R|<local>/b| -> 12 | <- 10
12: Exit loop condition -> 3, 13 | <- 11
13: Exit do-whileloop -> 14 | <- 12
14: Access variable R|<local>/x| -> 15 | <- 13
15: Type operator: "x is String" -> 16 | <- 14
16: Exit block -> 17 | <- 15
17: Exit function "testDoWhile" -> | <- 16
0: Enter function "testFor" -> 1
1: Enter block -> 2 | <- 0
2: Const: Int(0) -> 3 | <- 1
3: Const: Int(5) -> 4 | <- 2
4: Function call: Int(0).R|kotlin/Int.rangeTo|(Int(5)) -> 5 | <- 3
5: Variable declaration: lval <range>: R|kotlin/ranges/IntRange| -> 6 | <- 4
6: Access variable R|<local>/<range>| -> 7 | <- 5
7: Function call: R|<local>/<range>|.R|kotlin/ranges/IntProgression.iterator|() -> 8 | <- 6
8: Variable declaration: lval <iterator>: R|kotlin/collections/IntIterator| -> 9 | <- 7
9: Enter while loop -> 10 | <- 8
10: Enter loop condition -> 11 | <- 9, 23
11: Access variable R|<local>/<iterator>| -> 12 | <- 10
12: Function call: R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.hasNext: R|kotlin/Boolean|>|() -> 13 | <- 11
13: Exit loop condition -> 14, 24 | <- 12
14: Enter loop block -> 15 | <- 13
15: Enter block -> 16 | <- 14
16: Access variable R|<local>/<iterator>| -> 17 | <- 15
17: Function call: R|<local>/<iterator>|.R|kotlin/collections/IntIterator.next|() -> 18 | <- 16
18: Variable declaration: lval i: R|kotlin/Int| -> 19 | <- 17
19: Access variable R|<local>/x| -> 20 | <- 18
20: Type operator: "x is String" -> 21 | <- 19
21: Variable declaration: lval y: R|kotlin/Boolean| -> 22 | <- 20
22: Exit block -> 23 | <- 21
23: Exit loop block -> 10 | <- 22
24: Exit whileloop -> 25 | <- 13
25: Access variable R|<local>/x| -> 26 | <- 24
26: Type operator: "x is String" -> 27 | <- 25
27: Exit block -> 28 | <- 26
28: Exit function "testFor" -> | <- 27
@@ -25,7 +25,7 @@ digraph postponedLambdas_kt {
8 [label="Postponed exit from lambda"];
9 [label="Access variable R|<local>/b|"];
10 [label="Function call: R|/foo|(vararg(R|<local>/a|, foo@fun <anonymous>(): R|kotlin/String| <kind=UNKNOWN> {
String()
^ String()
}
, R|<local>/b|))"];
11 [label="Exit function test" style="filled" fillcolor=red];
@@ -3,7 +3,7 @@ FILE: postponedLambdas.kt
}
public final fun test(a: R|kotlin/Any|, b: R|kotlin/Any|, c: R|kotlin/Any|): R|kotlin/Unit| {
R|/foo|(vararg(R|<local>/a|, foo@fun <anonymous>(): R|kotlin/String| <kind=UNKNOWN> {
String()
^ String()
}
, R|<local>/b|))
}
@@ -59,7 +59,7 @@ digraph returnValuesFromLambda_kt {
}
}
R|/C.C|()
^ R|/C.C|()
}
)"];
24 [label="Variable declaration: lval x: R|A|"];
@@ -21,7 +21,7 @@ FILE: returnValuesFromLambda.kt
}
}
R|/C.C|()
^ R|/C.C|()
}
)
}
@@ -15,7 +15,7 @@ FILE: CallBasedInExpressionGenerator.kt
public final override fun generate(argument: R|ERROR CLASS: Symbol not found, for `StackValue`|): R|ERROR CLASS: Symbol not found, for `BranchedValue`| {
^generate R?C|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.gen|(R|<local>/argument|).<Inapplicable(WRONG_RECEIVER): [kotlin/let]>#(<L> = let@fun <anonymous>(): R|ERROR CLASS: Can't resolve when expression| {
when () {
^ when () {
this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.isInverted| -> {
<Unresolved name: Invert>#(<Unresolved name: it>#)
}
@@ -20,7 +20,7 @@ FILE: extensionPropertyInLambda.kt
}
public final fun test1(): R|kotlin/Unit| {
R|/use|(<L> = use@fun <anonymous>(): R|kotlin/String| {
R|/C.C|<R|kotlin/String|>(String(abc)).R|/y|
^ R|/C.C|<R|kotlin/String|>(String(abc)).R|/y|
}
)
R|/use|(R|/C.C|<R|kotlin/String|>(String(abc))::R|/y<kotlin/String>|)
@@ -1,7 +1,7 @@
FILE: doubleBrackets.kt
public final fun R|kotlin/String|.k(): R|() -> kotlin/String| {
^k fun <anonymous>(): R|kotlin/String| {
this@R|/k|
^ this@R|/k|
}
}
@@ -9,27 +9,27 @@ FILE: lambda.kt
}
public final fun main(): R|kotlin/Unit| {
R|/foo|(<L> = foo@fun <anonymous>(): R|kotlin/Unit| {
String(This is test)
^ String(This is test)
}
)
R|/bar|(<L> = bar@fun <anonymous>(): R|kotlin/String| {
String(This is also test)
^ String(This is also test)
}
)
R|/itIs|(<L> = itIs@fun <anonymous>(it: R|kotlin/String|): R|kotlin/String| {
<strcat>(String(this is ), R|<local>/it|.R|kotlin/Any.toString|(), String( test))
^ <strcat>(String(this is ), R|<local>/it|.R|kotlin/Any.toString|(), String( test))
}
)
R|/multipleArgs|(<L> = multipleArgs@fun <anonymous>(a: R|kotlin/String|, b: R|kotlin/String|): R|kotlin/String| {
<strcat>(String(This is test of ), R|<local>/a|.R|kotlin/Any.toString|(), String(, ), R|<local>/b|.R|kotlin/Any.toString|())
^ <strcat>(String(This is test of ), R|<local>/a|.R|kotlin/Any.toString|(), String(, ), R|<local>/b|.R|kotlin/Any.toString|())
}
)
lval s: R|kotlin/String| = fun <anonymous>(): R|kotlin/String| {
String(OK)
^ String(OK)
}
.R|FakeOverride<kotlin/Function0.invoke: R|kotlin/String|>|()
lval f: R|() -> kotlin/String| = fun <anonymous>(): R|kotlin/String| {
String(OK)
^ String(OK)
}
lval ss: R|kotlin/String| = R|<local>/f|.R|FakeOverride<kotlin/Function0.invoke: R|kotlin/String|>|()
@@ -35,7 +35,7 @@ FILE: lambdaWithReceiver.kt
R|/complexLambda|(<L> = complexLambda@fun R|kotlin/Int|.<anonymous>(it: R|kotlin/String|): R|kotlin/Unit| {
this@R|special/anonymous|.R|kotlin/Int.inc|()
this@R|special/anonymous|.R|kotlin/Int.inc|()
R|<local>/it|.R|kotlin/String.length|
^ R|<local>/it|.R|kotlin/String.length|
}
)
}
@@ -18,8 +18,8 @@ FILE: nestedLambdas.kt
^associateBy1 R|kotlin/TODO|()
}
public final val x: R|MyMap<kotlin/Int, kotlin/String>| = R|/myRun|<R|MyMap<kotlin/Int, kotlin/String>|>(<L> = myRun@fun <anonymous>(): R|MyMap<kotlin/Int, kotlin/String>| {
R|/w|.R|/associateBy1|<R|kotlin/String|, R|kotlin/Int|>(<L> = associateBy1@fun <anonymous>(f: R|kotlin/String|): R|kotlin/Int| {
R|<local>/f|.R|kotlin/String.length|
^ R|/w|.R|/associateBy1|<R|kotlin/String|, R|kotlin/Int|>(<L> = associateBy1@fun <anonymous>(f: R|kotlin/String|): R|kotlin/Int| {
^ R|<local>/f|.R|kotlin/String.length|
}
)
}
+2 -2
View File
@@ -19,7 +19,7 @@ FILE: localObject.kt
}
Int(2)
^ Int(2)
}
)
}
@@ -76,7 +76,7 @@ FILE: localObject.kt
}
Int(2)
^ Int(2)
}
)
public get(): R|kotlin/Int|
@@ -20,7 +20,7 @@ FILE: covariantArrayAsReceiver.kt
lval adjusted: R|kotlin/collections/List<UsageInfo>?| = when () {
(R|<local>/element| is R|KtParameter|) -> {
R|<local>/usages|.R|/filterNot|<R|UsageInfo|>(<L> = filterNot@fun <anonymous>(it: R|UsageInfo|): R|kotlin/Boolean| {
(R|<local>/it|.R|/UsageInfo.usage| is R|KtLightMethod|)
^ (R|<local>/it|.R|/UsageInfo.usage| is R|KtLightMethod|)
}
)
}
@@ -1,7 +1,7 @@
FILE: main.kt
public final fun test(): R|kotlin/Unit| {
<Inapplicable(INAPPLICABLE): [/Foo.Foo]>#(<L> = Foo@fun <anonymous>(): R|ERROR CLASS: Unresolved name: it| {
<Unresolved name: it>#
^ <Unresolved name: it>#
}
)
}
@@ -1,15 +1,15 @@
FILE: main.kt
public final fun main(): R|kotlin/Unit| {
R|/MyFunction|<R|kotlin/Int|, R|kotlin/String|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Any.toString|()
}
)
R|/MyFunction|<R|ft<kotlin/Int, kotlin/Int?>!|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Any.toString|()
}
)
R|/MyFunction|<R|kotlin/Any?|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Any?|): R|kotlin/String| {
String()
^ String()
}
)
}
@@ -7,23 +7,23 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
R|/foo1|(R|/MyFunction|<R|kotlin/Int|, R|kotlin/String|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Any.toString|()
}
))
R|/foo2|(R|/MyFunction|<R|kotlin/Number|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Number|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
}
))
<Inapplicable(INAPPLICABLE): [/foo2]>#(R|/MyFunction|<R|ft<kotlin/Int, kotlin/Int?>!|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Any.toString|()
}
))
R|/foo3|<R|kotlin/Int|, R|ft<kotlin/String, kotlin/String?>!|>(R|/MyFunction|<R|kotlin/Int|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Int.plus|(Int(1)).R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Int.plus|(Int(1)).R|kotlin/Any.toString|()
}
), Int(1))
R|/foo3|<R|kotlin/Int|, R|ft<kotlin/String, kotlin/String?>!|>(R|/MyFunction|<R|kotlin/Int|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Number|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
}
), Int(2))
}
@@ -7,15 +7,15 @@ FILE: kotlinSam.kt
}
public final fun main(): R|kotlin/Unit| {
R|/foo|(R|/MyRunnable|(<L> = MyRunnable@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
))
R|/foo|(R|/MyRunnable|(MyRunnable@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/it|, Int(1))
^ >(R|<local>/it|, Int(1))
}
))
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
R|/foo|(R|/MyRunnable|(R|<local>/x|))
@@ -6,15 +6,15 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
<Inapplicable(INAPPLICABLE): [/foo]>#(R|/MyRunnable|(<L> = MyRunnable@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
))
<Inapplicable(INAPPLICABLE): [/foo]>#(R|/MyRunnable|(MyRunnable@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/it|, Int(1))
^ >(R|<local>/it|, Int(1))
}
))
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
<Inapplicable(INAPPLICABLE): [/foo]>#(R|/MyRunnable|(R|<local>/x|))
@@ -3,15 +3,15 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
R|/foo|(R|/MyRunnable|(<L> = MyRunnable@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
))
R|/foo|(R|/MyRunnable|(MyRunnable@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/it|, Int(1))
^ >(R|<local>/it|, Int(1))
}
))
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
R|/foo|(R|/MyRunnable|(R|<local>/x|))
@@ -1,23 +1,23 @@
FILE: main.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaUsage|.R|/JavaUsage.foo1|(<L> = foo1@fun <anonymous>(x: R|ft<kotlin/Int, kotlin/Int?>!|): R|ft<kotlin/String, kotlin/String?>!| {
R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Any.toString|()
}
)
Q|JavaUsage|.R|/JavaUsage.foo2|(<L> = foo2@fun <anonymous>(x: R|ft<kotlin/Number, kotlin/Number?>!|): R|ft<kotlin/CharSequence, kotlin/CharSequence?>!| {
R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
}
)
Q|JavaUsage|.<Inapplicable(INAPPLICABLE): [/JavaUsage.foo2]>#(<L> = foo2@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Any.toString|()
}
)
Q|JavaUsage|.R|/JavaUsage.foo3|<R|kotlin/Int|, R|ft<kotlin/String, kotlin/String?>!|>(foo3@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Int.plus|(Int(1)).R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Int.plus|(Int(1)).R|kotlin/Any.toString|()
}
, Int(1))
Q|JavaUsage|.R|/JavaUsage.foo3|<R|kotlin/Int|, R|ft<kotlin/String, kotlin/String?>!|>(foo3@fun <anonymous>(x: R|kotlin/Number|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Number.toInt|().R|kotlin/Any.toString|()
}
, Int(2))
}
@@ -30,26 +30,26 @@ FILE: kotlinSam.kt
}
public final fun main(): R|kotlin/Unit| {
lval f: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(t: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/t|, Int(1))
^ >(R|<local>/t|, Int(1))
}
R|/foo1|(<L> = foo1@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
R|/foo1|(R|<local>/f|)
<Inapplicable(INAPPLICABLE): [/foo2]>#(<L> = foo2@fun <anonymous>(x: R|ERROR CLASS: No type for parameter|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
<Inapplicable(INAPPLICABLE): [/foo2]>#(R|<local>/f|)
<Inapplicable(INAPPLICABLE): [/foo3]>#(<L> = foo3@fun <anonymous>(x: R|ERROR CLASS: No type for parameter|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
<Inapplicable(INAPPLICABLE): [/foo3]>#(R|<local>/f|)
R|/foo4|(<L> = foo4@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
R|/foo4|(R|<local>/f|)
@@ -3,15 +3,15 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
Q|JavaUsage|.<Inapplicable(INAPPLICABLE): [/JavaUsage.foo]>#(<L> = foo@fun <anonymous>(x: R|ERROR CLASS: No type for parameter|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
Q|JavaUsage|.<Inapplicable(INAPPLICABLE): [/JavaUsage.foo]>#(foo@fun <anonymous>(): R|kotlin/Boolean| {
>(<Unresolved name: it>#, Int(1))
^ >(<Unresolved name: it>#, Int(1))
}
)
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
Q|JavaUsage|.<Inapplicable(INAPPLICABLE): [/JavaUsage.foo]>#(R|<local>/x|)
@@ -1,11 +1,11 @@
FILE: main.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.foo|(<L> = foo@fun <anonymous>(): R|kotlin/Unit| {
String()
^ String()
}
)
R|/JavaClass.JavaClass|().R|/JavaClass.bar|(<L> = bar@fun <anonymous>(): R|kotlin/Unit| {
String()
^ String()
}
)
}
@@ -3,15 +3,15 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
Q|JavaUsage|.R|/JavaUsage.foo|(<L> = foo@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
Q|JavaUsage|.R|/JavaUsage.foo|(foo@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/it|, Int(1))
^ >(R|<local>/it|, Int(1))
}
)
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
Q|JavaUsage|.R|/JavaUsage.foo|(R|<local>/x|)
@@ -3,15 +3,15 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
Q|JavaUsage|.R|/JavaUsage.foo|(<L> = foo@fun <anonymous>(x: R|kotlin/Int|): R|ft<kotlin/Boolean, kotlin/Boolean?>!| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
Q|JavaUsage|.R|/JavaUsage.foo|(foo@fun <anonymous>(it: R|kotlin/Int|): R|ft<kotlin/Boolean, kotlin/Boolean?>!| {
>(R|<local>/it|, Int(1))
^ >(R|<local>/it|, Int(1))
}
)
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
Q|JavaUsage|.R|/JavaUsage.foo|(R|<local>/x|)
@@ -12,7 +12,7 @@ FILE: main.kt
}
}
Boolean(false)
^ Boolean(false)
}
)
}
@@ -3,15 +3,15 @@ FILE: main.kt
}
public final fun main(): R|kotlin/Unit| {
Q|JavaUsage|.R|/JavaUsage.foo|(<L> = foo@fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
)
Q|JavaUsage|.R|/JavaUsage.foo|(foo@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/it|, Int(1))
^ >(R|<local>/it|, Int(1))
}
)
lval x: R|(kotlin/Int) -> kotlin/Boolean| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/Boolean| {
>(R|<local>/x|, Int(1))
^ >(R|<local>/x|, Int(1))
}
Q|JavaUsage|.R|/JavaUsage.foo|(R|<local>/x|)
@@ -103,7 +103,7 @@ digraph inPlaceLambdas_kt {
}
33 [label="Postponed exit from lambda"];
34 [label="Function call: R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
(R|<local>/x| as R|B|)
^ (R|<local>/x| as R|B|)
}
)"];
35 [label="Access variable R|<local>/x|"];
@@ -155,7 +155,7 @@ digraph inPlaceLambdas_kt {
54 [label="Postponed exit from lambda"];
55 [label="Function call: R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
R|<local>/x|.R|/A.foo|()
(R|<local>/x| as R|B|)
^ (R|<local>/x| as R|B|)
}
)"];
56 [label="Access variable R|<local>/x|"];
@@ -23,7 +23,7 @@ FILE: inPlaceLambdas.kt
}
public final fun test_2(x: R|kotlin/Any?|): R|kotlin/Unit| {
R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
(R|<local>/x| as R|B|)
^ (R|<local>/x| as R|B|)
}
)
R|<local>/x|.R|/B.bar|()
@@ -33,7 +33,7 @@ FILE: inPlaceLambdas.kt
(R|<local>/x| is R|A|) -> {
R|/run|(<L> = run@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
R|<local>/x|.R|/A.foo|()
(R|<local>/x| as R|B|)
^ (R|<local>/x| as R|B|)
}
)
R|<local>/x|.R|/B.bar|()
@@ -116,7 +116,7 @@ digraph safeCalls_kt {
46 [label="Postponed enter to lambda"];
47 [label="Postponed exit from lambda"];
48 [label="Function call: (R|<local>/x| as? R|A|)?.R|/A.bar|(R|<local>/x|)?.R|/foo|(R|<local>/x|.R|/A.bool|())?.R|/let|(<L> = let@fun <anonymous>(): R|kotlin/Unit| {
R|<local>/x|.R|/A.bool|()
^ R|<local>/x|.R|/A.bool|()
}
)"];
49 [label="Exit safe call"];
@@ -21,7 +21,7 @@ FILE: safeCalls.kt
}
public final fun test_3(x: R|kotlin/Any|): R|kotlin/Unit| {
(R|<local>/x| as? R|A|)?.R|/A.bar|(R|<local>/x|)?.R|/foo|(R|<local>/x|.R|/A.bool|())?.R|/let|(<L> = let@fun <anonymous>(): R|kotlin/Unit| {
R|<local>/x|.R|/A.bool|()
^ R|<local>/x|.R|/A.bool|()
}
)
R|<local>/x|.<Unresolved name: bool>#()
@@ -2,7 +2,7 @@ FILE: addAllOnJavaCollection.kt
public final fun foo(): R|kotlin/Unit| {
lval y: R|kotlin/collections/List<kotlin/String>| = R|kotlin/collections/listOf|<R|kotlin/String|>(vararg(String(Alpha), String(Beta)))
lval x: R|java/util/LinkedHashSet<kotlin/String>| = R|java/util/LinkedHashSet.LinkedHashSet|<R|kotlin/String|>().R|kotlin/apply|<R|java/util/LinkedHashSet<kotlin/String>|>(<L> = apply@fun R|java/util/LinkedHashSet<kotlin/String>|.<anonymous>(): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|FakeOverride<java/util/AbstractCollection.addAll: R|kotlin/Boolean|>|(R|<local>/y|)
^ this@R|special/anonymous|.R|FakeOverride<java/util/AbstractCollection.addAll: R|kotlin/Boolean|>|(R|<local>/y|)
}
)
lval z: R|java/util/ArrayList<kotlin/String>| = R|java/util/ArrayList.ArrayList|<R|kotlin/String|>()
@@ -15,7 +15,7 @@ FILE: anonymousInDelegate.kt
}
R|<local>/foo|.R|/anonymous.bar|()
^ R|<local>/foo|.R|/anonymous.bar|()
}
)
public get(): R|kotlin/Int| {
@@ -51,7 +51,7 @@ digraph callsInPlace_kt {
}
18 [label="Postponed exit from lambda"];
19 [label="Function call: R|kotlin/repeat|(Int(10), <L> = repeat@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_2)
^ String(test_2)
}
)"];
20 [label="Exit function test_2" style="filled" fillcolor=red];
@@ -81,7 +81,7 @@ digraph callsInPlace_kt {
26 [label="Postponed exit from lambda"];
27 [label="Const: Int(10)"];
28 [label="Function call: R|kotlin/repeat|(action = repeat@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_3)
^ String(test_3)
}
, times = Int(10))"];
29 [label="Exit function test_3" style="filled" fillcolor=red];
@@ -115,7 +115,7 @@ digraph callsInPlace_kt {
39 [label="Postponed exit from lambda"];
40 [label="Function call: Int(1).R|kotlin/takeUnless|<R|kotlin/Int|>(<L> = takeUnless@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| <kind=EXACTLY_ONCE> {
String(test_4)
>(R|<local>/it|, Int(0))
^ >(R|<local>/it|, Int(0))
}
)"];
41 [label="Exit function test_4" style="filled" fillcolor=red];
@@ -151,7 +151,7 @@ digraph callsInPlace_kt {
51 [label="Postponed exit from lambda"];
52 [label="Function call: Int(1).R|kotlin/takeUnless|<R|kotlin/Int|>(predicate = takeUnless@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| <kind=EXACTLY_ONCE> {
String(test_5)
>(R|<local>/it|, Int(0))
^ >(R|<local>/it|, Int(0))
}
)"];
53 [label="Exit function test_5" style="filled" fillcolor=red];
@@ -202,10 +202,10 @@ digraph callsInPlace_kt {
}
68 [label="Postponed exit from lambda"];
69 [label="Function call: R|/myRun|(myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_6_1)
^ String(test_6_1)
}
, <L> = myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_6_2)
^ String(test_6_2)
}
)"];
70 [label="Exit function test_6" style="filled" fillcolor=red];
@@ -248,10 +248,10 @@ digraph callsInPlace_kt {
}
81 [label="Postponed exit from lambda"];
82 [label="Function call: R|/myRun|(block2 = myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_7_2)
^ String(test_7_2)
}
, block1 = myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_7_1)
^ String(test_7_1)
}
)"];
83 [label="Exit function test_7" style="filled" fillcolor=red];
@@ -290,7 +290,7 @@ digraph callsInPlace_kt {
88 [label="Postponed enter to lambda"];
89 [label="Postponed exit from lambda"];
90 [label="Function call: R|/myDummyRun|(<L> = myDummyRun@fun <anonymous>(): R|kotlin/Unit| {
String(test_8)
^ String(test_8)
}
)"];
91 [label="Exit function test_8" style="filled" fillcolor=red];
@@ -9,27 +9,27 @@ FILE: callsInPlace.kt
}
public final fun test_2(): R|kotlin/Unit| {
R|kotlin/repeat|(Int(10), <L> = repeat@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_2)
^ String(test_2)
}
)
}
public final fun test_3(): R|kotlin/Unit| {
R|kotlin/repeat|(action = repeat@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_3)
^ String(test_3)
}
, times = Int(10))
}
public final fun test_4(): R|kotlin/Unit| {
Int(1).R|kotlin/takeUnless|<R|kotlin/Int|>(<L> = takeUnless@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| <kind=EXACTLY_ONCE> {
String(test_4)
>(R|<local>/it|, Int(0))
^ >(R|<local>/it|, Int(0))
}
)
}
public final fun test_5(): R|kotlin/Unit| {
Int(1).R|kotlin/takeUnless|<R|kotlin/Int|>(predicate = takeUnless@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Boolean| <kind=EXACTLY_ONCE> {
String(test_5)
>(R|<local>/it|, Int(0))
^ >(R|<local>/it|, Int(0))
}
)
}
@@ -39,19 +39,19 @@ FILE: callsInPlace.kt
}
public final fun test_6(): R|kotlin/Unit| {
R|/myRun|(myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_6_1)
^ String(test_6_1)
}
, <L> = myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_6_2)
^ String(test_6_2)
}
)
}
public final fun test_7(): R|kotlin/Unit| {
R|/myRun|(block2 = myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_7_2)
^ String(test_7_2)
}
, block1 = myRun@fun <anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
String(test_7_1)
^ String(test_7_1)
}
)
}
@@ -60,7 +60,7 @@ FILE: callsInPlace.kt
}
public final fun test_8(): R|kotlin/Unit| {
R|/myDummyRun|(<L> = myDummyRun@fun <anonymous>(): R|kotlin/Unit| {
String(test_8)
^ String(test_8)
}
)
}
+2 -2
View File
@@ -1,11 +1,11 @@
FILE: functionX.kt
public final val x: R|kotlin/jvm/functions/Function0<kotlin/Int>| = fun <anonymous>(): R|kotlin/Int| {
Int(42)
^ Int(42)
}
public get(): R|kotlin/jvm/functions/Function0<kotlin/Int>|
public final val y: R|(kotlin/String) -> kotlin/String| = fun <anonymous>(it: R|kotlin/String|): R|kotlin/String| {
R|<local>/it|
^ R|<local>/it|
}
public get(): R|(kotlin/String) -> kotlin/String|
@@ -15,7 +15,7 @@ FILE: hashTableWithForEach.kt
R|/DEBUG| -> {
^ Q|java/util/Collections|.R|java/util/Collections.unmodifiableSet|<R|kotlin/collections/MutableMap.MutableEntry<K, V>|>(R|kotlin/collections/mutableSetOf|<R|kotlin/collections/MutableMap.MutableEntry<K, V>|>().R|kotlin/apply|<R|kotlin/collections/MutableSet<kotlin/collections/MutableMap.MutableEntry<K, V>>|>(<L> = apply@fun R|kotlin/collections/MutableSet<kotlin/collections/MutableMap.MutableEntry<K, V>>|.<anonymous>(): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
this@R|/SomeHashTable|.R|FakeOverride</SomeHashTable.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|K|, value: R|V|): R|kotlin/Unit| {
this@R|special/anonymous|.R|FakeOverride<kotlin/collections/MutableSet.add: R|kotlin/Boolean|>|(R|/SomeHashTable.Entry.Entry|<R|K|, R|V|>(R|<local>/key|, R|<local>/value|))
^ this@R|special/anonymous|.R|FakeOverride<kotlin/collections/MutableSet.add: R|kotlin/Boolean|>|(R|/SomeHashTable.Entry.Entry|<R|K|, R|V|>(R|<local>/key|, R|<local>/value|))
}
)
}
@@ -29,17 +29,17 @@ FILE: implicitReceiverOrder.kt
}
public final fun test(a: R|A|, b: R|B|): R|kotlin/Unit| {
R|kotlin/with|<R|B|, R|kotlin/Int|>(R|<local>/b|, <L> = with@fun R|B|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
R|kotlin/with|<R|A|, R|kotlin/Int|>(R|<local>/a|, <L> = with@fun R|A|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
^ R|kotlin/with|<R|A|, R|kotlin/Int|>(R|<local>/a|, <L> = with@fun R|A|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|/A.foo|()
(this@R|special/anonymous|, this@R|special/anonymous|).R|/B.bar|()
^ (this@R|special/anonymous|, this@R|special/anonymous|).R|/B.bar|()
}
)
}
)
R|kotlin/with|<R|A|, R|kotlin/Int|>(R|<local>/a|, <L> = with@fun R|A|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
R|kotlin/with|<R|B|, R|kotlin/Int|>(R|<local>/b|, <L> = with@fun R|B|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
^ R|kotlin/with|<R|B|, R|kotlin/Int|>(R|<local>/b|, <L> = with@fun R|B|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|/B.foo|()
(this@R|special/anonymous|, this@R|special/anonymous|).R|/A.bar|()
^ (this@R|special/anonymous|, this@R|special/anonymous|).R|/A.bar|()
}
)
}
@@ -10,7 +10,7 @@ FILE: complexConstraintSystem.kt
}
public final fun test_0(list: R|kotlin/collections/List<kotlin/Int>|, b: R|kotlin/Boolean|): R|kotlin/Unit| {
lval x: R|kotlin/Int| = R|<local>/list|.R|kotlin/collections/mapNotNull|<R|kotlin/Int|, R|Inv<kotlin/Int>|>(<L> = mapNotNull@fun <anonymous>(it: R|kotlin/Int|): R|Inv<kotlin/Int>?| <kind=UNKNOWN> {
when () {
^ when () {
R|<local>/b| -> {
R|/Inv.Inv|<R|kotlin/Int|>(R|<local>/it|)
}
@@ -1,24 +1,24 @@
FILE: main.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.foo1|(<L> = foo1@fun <anonymous>(): R|ft<kotlin/Int, kotlin/Int?>!| {
Int(123)
^ Int(123)
}
)
Q|JavaClass|.R|/JavaClass.foo2|(<L> = foo2@fun <anonymous>(it: R|ft<kotlin/Int, kotlin/Int?>!|): R|ft<kotlin/String, kotlin/String?>!| {
R|<local>/it|.R|kotlin/Int.plus|(Int(2)).R|kotlin/Any.toString|()
^ R|<local>/it|.R|kotlin/Int.plus|(Int(2)).R|kotlin/Any.toString|()
}
)
Q|JavaClass|.R|/JavaClass.foo2|(foo2@fun <anonymous>(it: R|ft<kotlin/Int, kotlin/Int?>!|): R|ft<kotlin/String, kotlin/String?>!| {
R|<local>/it|.R|kotlin/Int.plus|(Int(3)).R|kotlin/Any.toString|()
^ R|<local>/it|.R|kotlin/Int.plus|(Int(3)).R|kotlin/Any.toString|()
}
)
lval y: R|(kotlin/Int) -> kotlin/String| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
R|<local>/x|.R|kotlin/Any.toString|()
^ R|<local>/x|.R|kotlin/Any.toString|()
}
Q|JavaClass|.R|/JavaClass.foo2|(R|<local>/y|)
Q|JavaClass|.R|/JavaClass.foo3|<R|kotlin/Int|>(foo3@fun <anonymous>(it: R|kotlin/Int|): R|ft<kotlin/String, kotlin/String?>!| {
R|<local>/it|.R|kotlin/Int.plus|(Int(4)).R|kotlin/Any.toString|()
^ R|<local>/it|.R|kotlin/Int.plus|(Int(4)).R|kotlin/Any.toString|()
}
, Int(5))
}
+6 -6
View File
@@ -1,7 +1,7 @@
FILE: test.kt
public final fun test(map: R|MyMap|): R|kotlin/Unit| {
lval result: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/map|.R|kotlin/collections/getOrPut|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>(String(key), <L> = getOrPut@fun <anonymous>(): R|kotlin/String| <kind=UNKNOWN> {
String(value)
^ String(value)
}
)
lval otherResult: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/map|.R|FakeOverride<kotlin/collections/Map.getOrDefault: R|ft<kotlin/String, kotlin/String?>!|>|(String(key), String(value))
@@ -9,7 +9,7 @@ FILE: test.kt
R|<local>/map|.R|FakeOverride<java/util/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| {
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
R|<local>/value|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
R|<local>/map|.R|kotlin/collections/forEach|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = forEach@fun <anonymous>(<destruct>: R|kotlin/collections/Map.Entry<ft<kotlin/String, kotlin/String?>!, ft<kotlin/String, kotlin/String?>!>|): R|kotlin/Unit| <kind=UNKNOWN> {
@@ -17,13 +17,13 @@ FILE: test.kt
lval value: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/<destruct>|.R|kotlin/collections/component2|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>()
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
R|<local>/value|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
}
public final fun test(map: R|kotlin/collections/MutableMap<kotlin/String, kotlin/String>|): R|kotlin/Unit| {
lval result: R|kotlin/String| = R|<local>/map|.R|kotlin/collections/getOrPut|<R|kotlin/String|, R|kotlin/String|>(String(key), <L> = getOrPut@fun <anonymous>(): R|kotlin/String| <kind=UNKNOWN> {
String(value)
^ String(value)
}
)
lval otherResult: R|kotlin/String| = R|<local>/map|.R|FakeOverride<kotlin/collections/Map.getOrDefault: R|kotlin/String|>|(String(key), String(value))
@@ -31,7 +31,7 @@ FILE: test.kt
R|<local>/map|.R|FakeOverride<java/util/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|kotlin/String|, value: R|kotlin/String|): R|kotlin/Unit| {
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
R|<local>/value|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
R|<local>/map|.R|kotlin/collections/forEach|<R|kotlin/String|, R|kotlin/String|>(<L> = forEach@fun <anonymous>(<destruct>: R|kotlin/collections/Map.Entry<kotlin/String, kotlin/String>|): R|kotlin/Unit| <kind=UNKNOWN> {
@@ -39,7 +39,7 @@ FILE: test.kt
lval value: R|kotlin/String| = R|<local>/<destruct>|.R|kotlin/collections/component2|<R|kotlin/String|, R|kotlin/String|>()
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
R|<local>/value|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
}
@@ -1,7 +1,7 @@
FILE: test.kt
public final fun foo(tag: R|XmlTag|, name: R|kotlin/String|): R|kotlin/collections/List<XmlTag>| {
lval result: R|kotlin/collections/List<XmlTag>| = R|<local>/tag|.R|/PsiElement.children|.R|kotlin/collections/filterIsInstance|<R|XmlTag|>().R|kotlin/collections/filter|<R|XmlTag|>(<L> = filter@fun <anonymous>(it: R|XmlTag|): R|kotlin/Boolean| <kind=UNKNOWN> {
==(R|<local>/it|.R|/XmlTag.localName|, R|<local>/name|)
^ ==(R|<local>/it|.R|/XmlTag.localName|, R|<local>/name|)
}
)
^foo R|<local>/result|
@@ -2,12 +2,12 @@ FILE: test.kt
public final fun <D : R|kotlin/Any|> R|Call<D>|.testForEach(): R|kotlin/Unit| {
this@R|/testForEach|.R|/Call.arguments|.R|FakeOverride<java/util/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| {
R|<local>/key|.R|kotlin/String.length|
R|<local>/value|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
this@R|/testForEach|.R|/Call.arguments|.R|kotlin/collections/forEach|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = forEach@fun <anonymous>(it: R|kotlin/collections/Map.Entry<ft<kotlin/String, kotlin/String?>!, ft<kotlin/String, kotlin/String?>!>|): R|kotlin/Unit| <kind=UNKNOWN> {
R|<local>/it|.R|FakeOverride<kotlin/collections/Map.Entry.key: R|ft<kotlin/String, kotlin/String?>!|>|.R|kotlin/String.length|
R|<local>/it|.R|FakeOverride<kotlin/collections/Map.Entry.value: R|ft<kotlin/String, kotlin/String?>!|>|.R|kotlin/String.length|
^ R|<local>/it|.R|FakeOverride<kotlin/collections/Map.Entry.value: R|ft<kotlin/String, kotlin/String?>!|>|.R|kotlin/String.length|
}
)
}
@@ -1,7 +1,7 @@
FILE: javaLangComparator.kt
public final fun test_2(list: R|kotlin/collections/List<kotlin/Int>|): R|kotlin/Unit| {
lval comp: R|java/util/Comparator<kotlin/Int>| = Q|java/util|.R|java/util/Comparator|<R|kotlin/Int|>(<L> = Comparator@fun <anonymous>(x: R|kotlin/Int|, y: R|kotlin/Int|): R|kotlin/Int| {
Int(1)
^ Int(1)
}
)
}
@@ -1,7 +1,7 @@
FILE: kotlinComparatorAlias.kt
public final fun test_1(): R|kotlin/Unit| {
lval comp: R|java/util/Comparator<kotlin/Int>| = R|java/util/Comparator|<R|kotlin/Int|>(<L> = Comparator@fun <anonymous>(x: R|kotlin/Int|, y: R|kotlin/Int|): R|kotlin/Int| {
Int(1)
^ Int(1)
}
)
}
+2 -2
View File
@@ -2,12 +2,12 @@ FILE: mapList.kt
public final fun main(): R|kotlin/Unit| {
lval x: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/collections/emptyList|<R|kotlin/Int|>()
lval u: R|kotlin/collections/List<kotlin/Int>| = R|<local>/x|.R|kotlin/collections/map|<R|kotlin/Int|, R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Int| <kind=UNKNOWN> {
R|<local>/it|.R|kotlin/Int.plus|(R|<local>/it|)
^ R|<local>/it|.R|kotlin/Int.plus|(R|<local>/it|)
}
)
R|<local>/u|.R|/applyX|<R|kotlin/collections/List<kotlin/Int>|>(<L> = applyX@fun R|kotlin/collections/List<kotlin/Int>|.<anonymous>(): R|kotlin/Unit| <kind=UNKNOWN> {
this@R|special/anonymous|.R|FakeOverride<kotlin/collections/List.contains: R|kotlin/Boolean|>|(Int(1))
this@R|special/anonymous|.R|FakeOverride<kotlin/collections/List.contains: R|kotlin/Boolean|>|(Int(1))
^ this@R|special/anonymous|.R|FakeOverride<kotlin/collections/List.contains: R|kotlin/Boolean|>|(Int(1))
}
)
}
@@ -26,10 +26,10 @@ FILE: multipleImplicitReceivers.kt
}
public final fun test(fooImpl: R|IFoo|, invokeImpl: R|IInvoke|): R|kotlin/Unit| {
R|kotlin/with|<R|A|, R|kotlin/Int|>(Q|A|, <L> = with@fun R|A|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
R|kotlin/with|<R|IFoo|, R|kotlin/Int|>(R|<local>/fooImpl|, <L> = with@fun R|IFoo|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
^ R|kotlin/with|<R|IFoo|, R|kotlin/Int|>(R|<local>/fooImpl|, <L> = with@fun R|IFoo|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
(this@R|special/anonymous|, this@R|special/anonymous|).R|/IFoo.foo|
R|kotlin/with|<R|IInvoke|, R|kotlin/Int|>(R|<local>/invokeImpl|, <L> = with@fun R|IInvoke|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
(this@R|special/anonymous|, (this@R|special/anonymous|, this@R|special/anonymous|).R|/IFoo.foo|).R|/IInvoke.invoke|()
^ R|kotlin/with|<R|IInvoke|, R|kotlin/Int|>(R|<local>/invokeImpl|, <L> = with@fun R|IInvoke|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
^ (this@R|special/anonymous|, (this@R|special/anonymous|, this@R|special/anonymous|).R|/IFoo.foo|).R|/IInvoke.invoke|()
}
)
}
@@ -7,13 +7,13 @@ FILE: noneWithForEach.kt
public final fun foo(conflicting: R|kotlin/collections/List<Diagnostic>|): R|kotlin/Unit| {
lval filtered: R|kotlin/collections/ArrayList<Diagnostic>| = R|kotlin/collections/arrayListOf|<R|Diagnostic|>()
R|<local>/conflicting|.R|kotlin/collections/groupBy|<R|Diagnostic|, R|kotlin/String|>(<L> = groupBy@fun <anonymous>(it: R|Diagnostic|): R|kotlin/String| <kind=UNKNOWN> {
R|<local>/it|.R|/Diagnostic.name|
^ R|<local>/it|.R|/Diagnostic.name|
}
).R|kotlin/collections/forEach|<R|kotlin/String|, R|kotlin/collections/List<Diagnostic>|>(<L> = forEach@fun <anonymous>(it: R|kotlin/collections/Map.Entry<kotlin/String, kotlin/collections/List<Diagnostic>>|): R|kotlin/Unit| <kind=UNKNOWN> {
lval diagnostics: R|kotlin/collections/List<Diagnostic>| = R|<local>/it|.R|FakeOverride<kotlin/collections/Map.Entry.value: R|kotlin/collections/List<Diagnostic>|>|
R|<local>/filtered|.R|FakeOverride<java/util/ArrayList.addAll: R|kotlin/Boolean|>|(R|<local>/diagnostics|.R|kotlin/collections/filter|<R|Diagnostic|>(<L> = filter@fun <anonymous>(me: R|Diagnostic|): R|kotlin/Boolean| <kind=UNKNOWN> {
R|<local>/diagnostics|.R|kotlin/collections/none|<R|Diagnostic|>(<L> = none@fun <anonymous>(other: R|Diagnostic|): R|kotlin/Boolean| <kind=UNKNOWN> {
!=(R|<local>/me|, R|<local>/other|)
^ R|<local>/filtered|.R|FakeOverride<java/util/ArrayList.addAll: R|kotlin/Boolean|>|(R|<local>/diagnostics|.R|kotlin/collections/filter|<R|Diagnostic|>(<L> = filter@fun <anonymous>(me: R|Diagnostic|): R|kotlin/Boolean| <kind=UNKNOWN> {
^ R|<local>/diagnostics|.R|kotlin/collections/none|<R|Diagnostic|>(<L> = none@fun <anonymous>(other: R|Diagnostic|): R|kotlin/Boolean| <kind=UNKNOWN> {
^ !=(R|<local>/me|, R|<local>/other|)
}
)
}
@@ -18,7 +18,7 @@ FILE: complexSmartCasts.kt
}
R|/runHigherOrder|<R|kotlin/Boolean|>(<L> = runHigherOrder@fun <anonymous>(): R|kotlin/Boolean| {
R|<local>/s|.R|kotlin/text/isNotEmpty|()
^ R|<local>/s|.R|kotlin/text/isNotEmpty|()
}
)
}
@@ -20,7 +20,7 @@ FILE: delegateTypeMismatch.kt
private final fun <T> property(initialValue: R|T|): R|kotlin/properties/ReadWriteProperty<A, T>| {
^property Q|kotlin/properties/Delegates|.R|kotlin/properties/Delegates.vetoable|<R|T|>(R|<local>/initialValue|, <L> = vetoable@fun <anonymous>(_: R|kotlin/reflect/KProperty<*>|, _: R|T|, _: R|T|): R|kotlin/Boolean| <kind=UNKNOWN> {
when () {
^ when () {
this@R|/A|.R|/A.isLocked| -> {
throw R|java/lang/IllegalStateException.IllegalStateException|(String(Cannot modify readonly DescriptorRendererOptions))
}
@@ -42,7 +42,7 @@ FILE: delegateTypeMismatch.kt
}
public final var typeNormalizer: <ERROR TYPE REF: Ambiguity: getValue, [kotlin/getValue, kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>by <Inapplicable(INAPPLICABLE): [/A.property]>#<R|(KotlinType) -> KotlinType|>(property@fun <anonymous>(): R|ERROR CLASS: Unresolved name: it| {
<Unresolved name: it>#
^ <Unresolved name: it>#
}
)
public get(): <ERROR TYPE REF: Ambiguity: getValue, [kotlin/getValue, kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]> {
@@ -1,7 +1,7 @@
FILE: inapplicableRemoveAll.kt
public final fun test(list: R|kotlin/collections/MutableList<kotlin/String>|): R|kotlin/Unit| {
R|<local>/list|.R|kotlin/collections/removeAll|<R|kotlin/String|>(<L> = removeAll@fun <anonymous>(it: R|kotlin/String|): R|kotlin/Boolean| {
R|<local>/it|.R|kotlin/text/isEmpty|()
^ R|<local>/it|.R|kotlin/text/isEmpty|()
}
)
}
@@ -5,7 +5,7 @@ FILE: recursiveBug.kt
}
public final val result: R|kotlin/String| = this@R|/Foo|.R|kotlin/run|<R|Foo|, R|kotlin/String|>(<L> = run@fun R|Foo|.<anonymous>(): R|kotlin/String| <kind=EXACTLY_ONCE> {
R|<local>/name|.R|FakeOverride<kotlin/Function0.invoke: R|kotlin/String|>|()
^ R|<local>/name|.R|FakeOverride<kotlin/Function0.invoke: R|kotlin/String|>|()
}
)
public get(): R|kotlin/String|
@@ -16,7 +16,7 @@ FILE: recursiveBug.kt
}
public final fun bar(name: R|() -> kotlin/String|): R|kotlin/Unit| {
lval result: R|kotlin/String| = R|kotlin/run|<R|kotlin/String|>(<L> = run@fun <anonymous>(): R|kotlin/String| <kind=EXACTLY_ONCE> {
R|<local>/name|.R|FakeOverride<kotlin/Function0.invoke: R|kotlin/String|>|()
^ R|<local>/name|.R|FakeOverride<kotlin/Function0.invoke: R|kotlin/String|>|()
}
)
lval name: R|kotlin/Int| = R|<local>/result|.R|kotlin/String.length|
@@ -1,6 +1,6 @@
FILE: simpleLazy.kt
public final val x: R|kotlin/String|by R|kotlin/lazy|<R|kotlin/String|>(<L> = lazy@fun <anonymous>(): R|kotlin/String| {
String(Hello)
^ String(Hello)
}
)
public get(): R|kotlin/String| {
@@ -9,7 +9,7 @@ FILE: simpleLazy.kt
public final fun foo(): R|kotlin/Unit| {
R|/x|.R|kotlin/String.length|
lval y: R|kotlin/String|by R|kotlin/lazy|<R|kotlin/String|>(<L> = lazy@fun <anonymous>(): R|kotlin/String| {
String(Bye)
^ String(Bye)
}
)
R|<local>/y|.R|kotlin/String.length|
@@ -20,7 +20,7 @@ FILE: simpleLazy.kt
}
public final val z: R|kotlin/String|by R|kotlin/lazy|<R|kotlin/String|>(<L> = lazy@fun <anonymous>(): R|kotlin/String| {
String(Some)
^ String(Some)
}
)
public get(): R|kotlin/String| {
@@ -48,7 +48,7 @@ digraph tryWithLambdaInside_kt {
}
16 [label="Postponed exit from lambda"];
17 [label="Function call: R|<local>/list|.R|kotlin/collections/filter|(<L> = filter@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| <kind=UNKNOWN> {
R|<local>/it|
^ R|<local>/it|
}
)"];
18 [label="Exit block"];
@@ -69,7 +69,7 @@ digraph tryWithLambdaInside_kt {
}
25 [label="Jump: ^testInPlace try {
R|<local>/list|.R|kotlin/collections/filter|<R|kotlin/Boolean|>(<L> = filter@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| <kind=UNKNOWN> {
R|<local>/it|
^ R|<local>/it|
}
)
}
@@ -120,7 +120,7 @@ finally {
33 [label="Postponed enter to lambda"];
34 [label="Postponed exit from lambda"];
35 [label="Function call: R|<local>/list|.R|/notInPlaceFilter|(<L> = notInPlaceFilter@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| {
R|<local>/it|
^ R|<local>/it|
}
)"];
36 [label="Exit block"];
@@ -141,7 +141,7 @@ finally {
}
43 [label="Jump: ^testNotInPlace try {
R|<local>/list|.R|/notInPlaceFilter|<R|kotlin/Boolean|>(<L> = notInPlaceFilter@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| {
R|<local>/it|
^ R|<local>/it|
}
)
}
@@ -7,7 +7,7 @@ FILE: tryWithLambdaInside.kt
public final fun testInPlace(list: R|kotlin/collections/List<kotlin/Boolean>|): R|kotlin/collections/List<kotlin/Boolean>| {
^testInPlace try {
R|<local>/list|.R|kotlin/collections/filter|<R|kotlin/Boolean|>(<L> = filter@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| <kind=UNKNOWN> {
R|<local>/it|
^ R|<local>/it|
}
)
}
@@ -18,7 +18,7 @@ FILE: tryWithLambdaInside.kt
public final fun testNotInPlace(list: R|kotlin/collections/List<kotlin/Boolean>|): R|kotlin/collections/List<kotlin/Boolean>| {
^testNotInPlace try {
R|<local>/list|.R|/notInPlaceFilter|<R|kotlin/Boolean|>(<L> = notInPlaceFilter@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| {
R|<local>/it|
^ R|<local>/it|
}
)
}
@@ -20,24 +20,24 @@ FILE: topLevelResolve.kt
}
public final fun testMap(): R|kotlin/Unit| {
lval first: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/collections/listOf|<R|kotlin/Int|>(vararg(Int(1), Int(2), Int(3))).R|kotlin/collections/map|<R|kotlin/Int|, R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Int| <kind=UNKNOWN> {
R|<local>/it|.R|kotlin/Int.times|(Int(2))
^ R|<local>/it|.R|kotlin/Int.times|(Int(2))
}
)
lval second: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/intArrayOf|(vararg(Int(4), Int(5), Int(6))).R|kotlin/collections/map|<R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Int| <kind=UNKNOWN> {
R|<local>/it|.R|kotlin/Int.times|(Int(2))
^ R|<local>/it|.R|kotlin/Int.times|(Int(2))
}
)
lval withId: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/collections/listOf|<R|kotlin/Int|>(vararg(Int(1), Int(2), Int(3))).R|kotlin/collections/map|<R|kotlin/Int|, R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Int| <kind=UNKNOWN> {
R|/id|<R|kotlin/Int|>(R|<local>/it|)
^ R|/id|<R|kotlin/Int|>(R|<local>/it|)
}
)
lval stringToInt: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/collections/listOf|<R|kotlin/String|>(vararg(String(alpha), String(omega))).R|kotlin/collections/map|<R|kotlin/String|, R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/String|): R|kotlin/Int| <kind=UNKNOWN> {
R|<local>/it|.R|kotlin/String.length|
^ R|<local>/it|.R|kotlin/String.length|
}
)
lval viaWith: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/with|<R|kotlin/collections/List<kotlin/Int>|, R|kotlin/collections/List<kotlin/Int>|>(R|kotlin/collections/listOf|<R|kotlin/Int|>(Int(42)), <L> = with@fun R|kotlin/collections/List<kotlin/Int>|.<anonymous>(): R|kotlin/collections/List<kotlin/Int>| <kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|kotlin/collections/map|<R|kotlin/Int|, R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Int| <kind=UNKNOWN> {
R|<local>/it|.R|kotlin/Int.times|(R|<local>/it|)
^ this@R|special/anonymous|.R|kotlin/collections/map|<R|kotlin/Int|, R|kotlin/Int|>(<L> = map@fun <anonymous>(it: R|kotlin/Int|): R|kotlin/Int| <kind=UNKNOWN> {
^ R|<local>/it|.R|kotlin/Int.times|(R|<local>/it|)
}
)
}
@@ -45,11 +45,11 @@ FILE: topLevelResolve.kt
}
public final fun testWith(): R|kotlin/Unit| {
lval length: R|kotlin/Int| = R|kotlin/with|<R|kotlin/String|, R|kotlin/Int|>(String(), <L> = with@fun R|kotlin/String|.<anonymous>(): R|kotlin/Int| <kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|kotlin/String.length|
^ this@R|special/anonymous|.R|kotlin/String.length|
}
)
lval indices: R|kotlin/ranges/IntRange| = R|kotlin/with|<R|kotlin/String|, R|kotlin/ranges/IntRange|>(String(), <L> = with@fun R|kotlin/String|.<anonymous>(): R|kotlin/ranges/IntRange| <kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|kotlin/text/indices|
^ this@R|special/anonymous|.R|kotlin/text/indices|
}
)
lval indicesNoWith: R|kotlin/ranges/IntRange| = String().R|kotlin/text/indices|
@@ -13,7 +13,7 @@ FILE: whenAsLambdaReturnStatement.kt
}
public final fun test_1(modules: R|kotlin/collections/Collection<Module>|, b: R|kotlin/Boolean|): R|kotlin/Unit| {
lval res: R|kotlin/collections/Map<Module, kotlin/collections/List<Module>>| = R|<local>/modules|.R|kotlin/collections/groupBy|<R|Module|, R|Module|>(<L> = groupBy@fun <anonymous>(module: R|Module|): R|Module| <kind=UNKNOWN> {
when () {
^ when () {
R|<local>/b| -> {
R|<local>/module|
}
@@ -27,7 +27,7 @@ FILE: whenAsLambdaReturnStatement.kt
}
public final fun test_2(): R|kotlin/Unit| {
lval x: R|kotlin/String| = R|kotlin/run|<R|kotlin/String|>(<L> = run@fun <anonymous>(): R|kotlin/String| <kind=EXACTLY_ONCE> {
try {
^ try {
String()
}
finally {
+1 -1
View File
@@ -12,7 +12,7 @@ FILE: whenAsReceiver.kt
}
}
?.R|/also|<R|kotlin/Int|, R|kotlin/Int|>(<L> = also@fun <anonymous>(): R|kotlin/Int| {
Int(1)
^ Int(1)
}
)
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS
// reason - no error from division by zero in JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
private fun <T> upcast(value: T): T = value
fun box(): String {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun foo(): String = "foo1"
fun foo(i: Int): String = "foo2"
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
val foo: () -> Unit = {}
fun box(): String {
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class MyClass(var fnc : () -> String) {
fun test(): String {
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class T(val f : () -> Any?) {
fun call() : Any? = f()
}
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class Foo(
var state : Int,
val f : (Int) -> Int){
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class Base(val fn: () -> String)
fun box(): String {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class Base(val fn1: () -> String, val fn2: () -> String)
fun box(): String {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box() : String {
return apply( "OK", {arg: String -> arg } )
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box() : String {
return if (apply( 5, {arg: Int -> arg + 13 } ) == 18) "OK" else "fail"
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box() : String {
val cl = 39
return if (sum(200, { val ff = {cl}; ff() }) == 239) "OK" else "FAIL"
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box() : String {
val cl = 39
return if (sum(200, { val m = { val r = { cl }; r() }; m() }) == 239) "OK" else "FAIL"
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class A(val s: Int) {
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box(): String {
val o = "O"
val ok_L = {o + "K"}
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box(): String {
val a = 1
val explicitlyReturned = run1 f@{
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box(): String {
val a = 1
val explicitlyReturned = run1 {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box() : String {
return invoker( {"OK"} )
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun box() : String {
return if (int_invoker( { 7 } ) == 7) "OK" else "fail"
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun foo(block: (String, String, String) -> String): String = block("O", "fail", "K")
fun box() = foo { x, _, y -> x + y }
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS
// reason - no error from division by zero in JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
private const val z = "OK";
fun box(): String {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun zap(s: String): String? = s
inline fun tryZap(s: String, fn: (String) -> String): String {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
inline fun catchAll(x: String, block: () -> Unit): String {
try {
block()

Some files were not shown because too many files have changed in this diff Show More