~ WIP
diff --git a/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt b/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt
index c428a52..1e39d4d 100644
--- a/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt
@@ -18,7 +18,7 @@
}
public get(): R|(kotlin/String) -> kotlin/Boolean|
- public final val hError: R|(ERROR CLASS: Cannot infer type for parameter <unused var>) -> ERROR CLASS: Cannot infer type variable TypeVariable(_L)| = fun <anonymous>(<unused var>: <ERROR TYPE REF: Cannot infer type for parameter <unused var>>): <ERROR TYPE REF: Cannot infer type variable TypeVariable(_L)> <inline=NoInline> {
+ public final val hError: R|(ERROR CLASS: Cannot infer type for parameter <unused var>) -> ERROR CLASS: Cannot infer type variable TypeVariable(_L)| = ERROR_EXPR(CS errors: _synthetic/ACCEPT_SPECIFIC_TYPE_CALL)fun <anonymous>(<unused var>: <ERROR TYPE REF: Cannot infer type for parameter <unused var>>): <ERROR TYPE REF: Cannot infer type variable TypeVariable(_L)> <inline=NoInline> {
^ Boolean(true)
}
diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot
index 55eddee..40c2e10 100644
--- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot
+++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot
@@ -150,35 +150,43 @@
subgraph cluster_17 {
color=blue
51 [label="Enter block"];
- 52 [label="Exit anonymous function expression"];
- 53 [label="Variable declaration: lval lambda: R|() -> kotlin/Int|"];
- 54 [label="Exit block"];
+ subgraph cluster_18 {
+ color=blue
+ 52 [label="Function call arguments enter"];
+ 53 [label="Anonymous function capture"];
+ 54 [label="Postponed enter to lambda"];
+ subgraph cluster_19 {
+ color=blue
+ 55 [label="Enter function <anonymous>" style="filled" fillcolor=red];
+ subgraph cluster_20 {
+ color=blue
+ 56 [label="Enter block"];
+ subgraph cluster_21 {
+ color=blue
+ 57 [label="Function call arguments enter"];
+ 58 [label="Access variable R|<local>/x|"];
+ 59 [label="Smart cast: R|<local>/x|"];
+ 60 [label="Function call arguments exit"];
+ }
+ 61 [label="Function call enter: R|<local>/x|.R|kotlin/Int.inc|()"];
+ 62 [label="Function call exit: R|<local>/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow];
+ 63 [label="Exit block"];
+ }
+ 64 [label="Exit function <anonymous>" style="filled" fillcolor=red];
+ }
+ 65 [label="Function call arguments exit"];
+ }
+ 66 [label="Postponed exit from lambda"];
+ 67 [label="Function call exit: R|_synthetic/ACCEPT_SPECIFIC_TYPE_CALL|(...)" style="filled" fillcolor=yellow];
+ 68 [label="Variable declaration: lval lambda: R|() -> kotlin/Int|"];
+ 69 [label="Exit block"];
}
- 55 [label="Exit when branch result"];
- 56 [label="Exit when"];
+ 70 [label="Exit when branch result"];
+ 71 [label="Exit when"];
}
- 57 [label="Exit block"];
+ 72 [label="Exit block"];
}
- 58 [label="Exit function test_2" style="filled" fillcolor=red];
- }
- subgraph cluster_18 {
- color=blue
- 59 [label="Enter function <anonymous>" style="filled" fillcolor=red];
- subgraph cluster_19 {
- color=blue
- 60 [label="Enter block"];
- subgraph cluster_20 {
- color=blue
- 61 [label="Function call arguments enter"];
- 62 [label="Access variable R|<local>/x|"];
- 63 [label="Smart cast: R|<local>/x|"];
- 64 [label="Function call arguments exit"];
- }
- 65 [label="Function call enter: R|<local>/x|.R|kotlin/Int.inc|()"];
- 66 [label="Function call exit: R|<local>/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow];
- 67 [label="Exit block"];
- }
- 68 [label="Exit function <anonymous>" style="filled" fillcolor=red];
+ 73 [label="Exit function test_2" style="filled" fillcolor=red];
}
42 -> {43};
43 -> {44};
@@ -187,182 +195,188 @@
46 -> {47};
47 -> {48};
48 -> {49 50};
- 49 -> {56};
+ 49 -> {71};
50 -> {51};
51 -> {52};
- 52 -> {53 59};
- 52 -> {59} [style=dashed];
+ 52 -> {53};
53 -> {54};
- 54 -> {55};
+ 53 -> {55} [color=green label="CapturedByValue"];
+ 54 -> {55 65 66};
+ 54 -> {55} [style=dashed];
55 -> {56};
56 -> {57};
57 -> {58};
+ 58 -> {59};
59 -> {60};
60 -> {61};
61 -> {62};
62 -> {63};
63 -> {64};
- 64 -> {65};
- 65 -> {66};
- 66 -> {67};
+ 65 -> {67};
+ 66 -> {67} [label="Postponed"];
67 -> {68};
-
- subgraph cluster_21 {
- color=red
- 69 [label="Enter function getInt" style="filled" fillcolor=red];
- subgraph cluster_22 {
- color=blue
- 70 [label="Enter block"];
- subgraph cluster_23 {
- color=blue
- 71 [label="Function call arguments enter"];
- 72 [label="Function call arguments exit"];
- }
- 73 [label="Function call enter: R?C|kotlin/Function0.invoke|()"];
- 74 [label="Function call exit: R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()" style="filled" fillcolor=yellow];
- 75 [label="Const: Int(1)"];
- 76 [label="Jump: ^getInt Int(1)"];
- 77 [label="Stub" style="filled" fillcolor=gray];
- 78 [label="Exit block" style="filled" fillcolor=gray];
- }
- 79 [label="Exit function getInt" style="filled" fillcolor=red];
- }
+ 68 -> {69};
69 -> {70};
70 -> {71};
71 -> {72};
72 -> {73};
- 73 -> {74};
+
+ subgraph cluster_22 {
+ color=red
+ 74 [label="Enter function getInt" style="filled" fillcolor=red];
+ subgraph cluster_23 {
+ color=blue
+ 75 [label="Enter block"];
+ subgraph cluster_24 {
+ color=blue
+ 76 [label="Function call arguments enter"];
+ 77 [label="Function call arguments exit"];
+ }
+ 78 [label="Function call enter: R?C|kotlin/Function0.invoke|()"];
+ 79 [label="Function call exit: R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()" style="filled" fillcolor=yellow];
+ 80 [label="Const: Int(1)"];
+ 81 [label="Jump: ^getInt Int(1)"];
+ 82 [label="Stub" style="filled" fillcolor=gray];
+ 83 [label="Exit block" style="filled" fillcolor=gray];
+ }
+ 84 [label="Exit function getInt" style="filled" fillcolor=red];
+ }
74 -> {75};
75 -> {76};
- 76 -> {79};
- 76 -> {77} [style=dotted];
- 77 -> {78} [style=dotted];
- 78 -> {79} [style=dotted];
+ 76 -> {77};
+ 77 -> {78};
+ 78 -> {79};
+ 79 -> {80};
+ 80 -> {81};
+ 81 -> {84};
+ 81 -> {82} [style=dotted];
+ 82 -> {83} [style=dotted];
+ 83 -> {84} [style=dotted];
- subgraph cluster_24 {
+ subgraph cluster_25 {
color=red
- 80 [label="Enter function test_3" style="filled" fillcolor=red];
- subgraph cluster_25 {
+ 85 [label="Enter function test_3" style="filled" fillcolor=red];
+ subgraph cluster_26 {
color=blue
- 81 [label="Enter block"];
- subgraph cluster_26 {
+ 86 [label="Enter block"];
+ subgraph cluster_27 {
color=blue
- 82 [label="Function call arguments enter"];
- 83 [label="Anonymous function capture"];
- 84 [label="Postponed enter to lambda"];
- subgraph cluster_27 {
+ 87 [label="Function call arguments enter"];
+ 88 [label="Anonymous function capture"];
+ 89 [label="Postponed enter to lambda"];
+ subgraph cluster_28 {
color=blue
- 85 [label="Enter function <anonymous>" style="filled" fillcolor=red];
- subgraph cluster_28 {
+ 90 [label="Enter function <anonymous>" style="filled" fillcolor=red];
+ subgraph cluster_29 {
color=blue
- 86 [label="Enter block"];
- 87 [label="Const: Int(1)"];
- 88 [label="Jump: ^test_3 Int(1)"];
- 89 [label="Stub" style="filled" fillcolor=gray];
- 90 [label="Exit block" style="filled" fillcolor=gray];
+ 91 [label="Enter block"];
+ 92 [label="Const: Int(1)"];
+ 93 [label="Jump: ^test_3 Int(1)"];
+ 94 [label="Stub" style="filled" fillcolor=gray];
+ 95 [label="Exit block" style="filled" fillcolor=gray];
}
- 91 [label="Exit function <anonymous>" style="filled" fillcolor=gray];
+ 96 [label="Exit function <anonymous>" style="filled" fillcolor=gray];
}
- 92 [label="Function call arguments exit"];
+ 97 [label="Function call arguments exit"];
}
- 93 [label="Function call enter: R|/getInt|(...)"];
- 94 [label="Postponed exit from lambda"];
- 95 [label="Function call exit: R|/getInt|(...)" style="filled" fillcolor=yellow];
- 96 [label="Jump: ^test_3 R|/getInt|(<L> = getInt@fun <anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
+ 98 [label="Function call enter: R|/getInt|(...)"];
+ 99 [label="Postponed exit from lambda"];
+ 100 [label="Function call exit: R|/getInt|(...)" style="filled" fillcolor=yellow];
+ 101 [label="Jump: ^test_3 R|/getInt|(<L> = getInt@fun <anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
^test_3 Int(1)
}
)"];
- 97 [label="Stub" style="filled" fillcolor=gray];
- 98 [label="Exit block" style="filled" fillcolor=gray];
+ 102 [label="Stub" style="filled" fillcolor=gray];
+ 103 [label="Exit block" style="filled" fillcolor=gray];
}
- 99 [label="Exit function test_3" style="filled" fillcolor=red];
+ 104 [label="Exit function test_3" style="filled" fillcolor=red];
}
- 80 -> {81};
- 81 -> {82};
- 82 -> {83};
- 83 -> {84};
- 83 -> {85} [color=green style=dotted label="CapturedByValue"];
- 84 -> {85 92 94};
- 84 -> {85} [style=dashed];
85 -> {86};
86 -> {87};
87 -> {88};
- 88 -> {99};
- 88 -> {89} [style=dotted];
- 89 -> {90} [style=dotted];
- 90 -> {91} [style=dotted];
- 91 -> {94} [style=dotted];
+ 88 -> {89};
+ 88 -> {90} [color=green style=dotted label="CapturedByValue"];
+ 89 -> {90 97 99};
+ 89 -> {90} [style=dashed];
+ 90 -> {91};
+ 91 -> {92};
92 -> {93};
- 93 -> {95};
- 94 -> {84} [color=green style=dashed];
- 94 -> {95} [label="Postponed"];
- 95 -> {96};
- 96 -> {99};
- 96 -> {97} [style=dotted];
- 97 -> {98} [style=dotted];
- 98 -> {99} [style=dotted];
+ 93 -> {104};
+ 93 -> {94} [style=dotted];
+ 94 -> {95} [style=dotted];
+ 95 -> {96} [style=dotted];
+ 96 -> {99} [style=dotted];
+ 97 -> {98};
+ 98 -> {100};
+ 99 -> {89} [color=green style=dashed];
+ 99 -> {100} [label="Postponed"];
+ 100 -> {101};
+ 101 -> {104};
+ 101 -> {102} [style=dotted];
+ 102 -> {103} [style=dotted];
+ 103 -> {104} [style=dotted];
- subgraph cluster_29 {
+ subgraph cluster_30 {
color=red
- 100 [label="Enter function test_4" style="filled" fillcolor=red];
- subgraph cluster_30 {
+ 105 [label="Enter function test_4" style="filled" fillcolor=red];
+ subgraph cluster_31 {
color=blue
- 101 [label="Enter block"];
- subgraph cluster_31 {
+ 106 [label="Enter block"];
+ subgraph cluster_32 {
color=blue
- 102 [label="Function call arguments enter"];
- 103 [label="Anonymous function capture"];
- 104 [label="Postponed enter to lambda"];
- subgraph cluster_32 {
+ 107 [label="Function call arguments enter"];
+ 108 [label="Anonymous function capture"];
+ 109 [label="Postponed enter to lambda"];
+ subgraph cluster_33 {
color=blue
- 105 [label="Enter function <anonymous>" style="filled" fillcolor=red];
- subgraph cluster_33 {
+ 110 [label="Enter function <anonymous>" style="filled" fillcolor=red];
+ subgraph cluster_34 {
color=blue
- 106 [label="Enter block"];
- 107 [label="Const: Int(1)"];
- 108 [label="Jump: ^test_4 Int(1)"];
- 109 [label="Stub" style="filled" fillcolor=gray];
- 110 [label="Exit block" style="filled" fillcolor=gray];
+ 111 [label="Enter block"];
+ 112 [label="Const: Int(1)"];
+ 113 [label="Jump: ^test_4 Int(1)"];
+ 114 [label="Stub" style="filled" fillcolor=gray];
+ 115 [label="Exit block" style="filled" fillcolor=gray];
}
- 111 [label="Exit function <anonymous>" style="filled" fillcolor=gray];
+ 116 [label="Exit function <anonymous>" style="filled" fillcolor=gray];
}
- 112 [label="Function call arguments exit"];
+ 117 [label="Function call arguments exit"];
}
- 113 [label="Function call enter: R|/getInt|(...)"];
- 114 [label="Postponed exit from lambda"];
- 115 [label="Function call exit: R|/getInt|(...)" style="filled" fillcolor=yellow];
- 116 [label="Jump: ^test_4 R|/getInt|(getInt@fun <anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
+ 118 [label="Function call enter: R|/getInt|(...)"];
+ 119 [label="Postponed exit from lambda"];
+ 120 [label="Function call exit: R|/getInt|(...)" style="filled" fillcolor=yellow];
+ 121 [label="Jump: ^test_4 R|/getInt|(getInt@fun <anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
^test_4 Int(1)
}
)"];
- 117 [label="Stub" style="filled" fillcolor=gray];
- 118 [label="Exit block" style="filled" fillcolor=gray];
+ 122 [label="Stub" style="filled" fillcolor=gray];
+ 123 [label="Exit block" style="filled" fillcolor=gray];
}
- 119 [label="Exit function test_4" style="filled" fillcolor=red];
+ 124 [label="Exit function test_4" style="filled" fillcolor=red];
}
- 100 -> {101};
- 101 -> {102};
- 102 -> {103};
- 103 -> {104};
- 103 -> {105} [color=green style=dotted label="CapturedByValue"];
- 104 -> {105 112 114};
- 104 -> {105} [style=dashed];
105 -> {106};
106 -> {107};
107 -> {108};
- 108 -> {119};
- 108 -> {109} [style=dotted];
- 109 -> {110} [style=dotted];
- 110 -> {111} [style=dotted];
- 111 -> {114} [style=dotted];
+ 108 -> {109};
+ 108 -> {110} [color=green style=dotted label="CapturedByValue"];
+ 109 -> {110 117 119};
+ 109 -> {110} [style=dashed];
+ 110 -> {111};
+ 111 -> {112};
112 -> {113};
- 113 -> {115};
- 114 -> {104} [color=green style=dashed];
- 114 -> {115} [label="Postponed"];
- 115 -> {116};
- 116 -> {119};
- 116 -> {117} [style=dotted];
- 117 -> {118} [style=dotted];
- 118 -> {119} [style=dotted];
+ 113 -> {124};
+ 113 -> {114} [style=dotted];
+ 114 -> {115} [style=dotted];
+ 115 -> {116} [style=dotted];
+ 116 -> {119} [style=dotted];
+ 117 -> {118};
+ 118 -> {120};
+ 119 -> {109} [color=green style=dashed];
+ 119 -> {120} [label="Postponed"];
+ 120 -> {121};
+ 121 -> {124};
+ 121 -> {122} [style=dotted];
+ 122 -> {123} [style=dotted];
+ 123 -> {124} [style=dotted];
}
diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.fir.txt
index ae2acee..4baa070 100644
--- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/recursiveProblemWithSyntaxError.fir.txt
@@ -1,8 +1,8 @@
FILE: recursiveProblemWithSyntaxError.kt
- public final val foo: <ERROR TYPE REF: Unresolved name: bar> = bar@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: bar> <inline=NoInline> {
+ public final val foo: <ERROR TYPE REF: Unresolved name: bar> = ERROR_EXPR(Inapplicable(INAPPLICABLE): _synthetic/ACCEPT_SPECIFIC_TYPE_CALL)bar@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: bar> <inline=NoInline> {
^ <Unresolved name: bar>#
}
- .R|SubstitutionOverride<kotlin/Function0.invoke: <ERROR TYPE REF: Unresolved name: bar>><Inapplicable(INAPPLICABLE_ARGUMENTS_MAPPING_ERROR): kotlin/Function0.invoke>#|(ERROR_EXPR(Argument is absent)).<Unresolved name: bar>#(<Call has no callee>#(<L> = <Call has no callee>@fun <anonymous>(): <ERROR TYPE REF: cycle> <inline=NoInline> {
+ .R|SubstitutionOverride<kotlin/Function0.invoke: <ERROR TYPE REF: Unresolved name: bar>><Inapplicable(INAPPLICABLE_ARGUMENTS_MAPPING_ERROR): kotlin/Function0.invoke>#|(ERROR_EXPR(Argument is absent)).<Unresolved name: bar>#(<Call has no callee>#(ERROR_EXPR(Inapplicable(INAPPLICABLE): _synthetic/ACCEPT_SPECIFIC_TYPE_CALL)<L> = <Call has no callee>@fun <anonymous>(): <ERROR TYPE REF: cycle> <inline=NoInline> {
^ R|/foo|
}
))
diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt
index d47f770..7959a7b 100644
--- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt
@@ -13,7 +13,7 @@
public final fun act(): R|kotlin/Unit| {
<Super cannot be a callee>#()
<Unresolved name: invoke>#()
- <Super cannot be a callee>#(<L> = <Super cannot be a callee>@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: println> <inline=NoInline> {
+ <Super cannot be a callee>#(ERROR_EXPR(Inapplicable(INAPPLICABLE): _synthetic/ACCEPT_SPECIFIC_TYPE_CALL)<L> = <Super cannot be a callee>@fun <anonymous>(): <ERROR TYPE REF: Unresolved name: println> <inline=NoInline> {
^ <Unresolved name: println>#(ERROR_EXPR(Incorrect character: 'weird'))
}
)
diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/incorrectGenericLambdaProperty.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/incorrectGenericLambdaProperty.fir.txt
index 24064ad..dddf688 100644
--- a/compiler/fir/analysis-tests/testData/resolve/problems/incorrectGenericLambdaProperty.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/problems/incorrectGenericLambdaProperty.fir.txt
@@ -1,6 +1,6 @@
FILE: incorrectGenericLambdaProperty.kt
public final fun main(args: R|kotlin/Array<kotlin/String>|): R|kotlin/Unit| {
- lval <T> passIt: R|(ERROR CLASS: Cannot infer type for parameter <destruct>) -> ERROR CLASS: Symbol not found for T| = fun <anonymous>(<destruct>: <ERROR TYPE REF: Cannot infer type for parameter <destruct>>): <ERROR TYPE REF: Symbol not found for T> <inline=NoInline> {
+ lval <T> passIt: R|(ERROR CLASS: Cannot infer type for parameter <destruct>) -> ERROR CLASS: Symbol not found for T| = ERROR_EXPR(CS errors: _synthetic/ACCEPT_SPECIFIC_TYPE_CALL)fun <anonymous>(<destruct>: <ERROR TYPE REF: Cannot infer type for parameter <destruct>>): <ERROR TYPE REF: Symbol not found for T> <inline=NoInline> {
lval t: <ERROR TYPE REF: Symbol not found for T> = R|<local>/<destruct>|.<Unresolved name: component1>#()
^ {
R|<local>/t|
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt
index 7d3de7f..0cbc21c 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt
@@ -170,7 +170,10 @@
is ConeDestructuringDeclarationsOnTopLevel -> null // TODO Currently a parsing error. Would be better to report here instead KT-58563
is ConeCannotInferTypeParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source)
- is ConeCannotInferValueParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source)
+ is ConeCannotInferValueParameterType -> when {
+ isTopLevelLambda -> FirErrors.VALUE_PARAMETER_WITHOUT_EXPLICIT_TYPE.createOn(source)
+ else -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source)
+ }
is ConeCannotInferReceiverParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source)
is ConeTypeVariableTypeIsNotInferred -> FirErrors.INFERENCE_ERROR.createOn(callOrAssignmentSource ?: source)
is ConeInstanceAccessBeforeSuperCall -> FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL.createOn(source, this.target)
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeResolutionAtoms.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeResolutionAtoms.kt
index e6b7f85..688f124 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeResolutionAtoms.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeResolutionAtoms.kt
@@ -79,7 +79,10 @@
private fun createRawAtom(expression: FirExpression?, allowUnresolvedExpression: Boolean): ConeResolutionAtom? {
return when (expression) {
null -> null
- is FirAnonymousFunctionExpression -> ConeResolutionAtomWithPostponedChild(expression)
+ is FirAnonymousFunctionExpression -> when {
+ expression.isResolved -> ConeSimpleLeafResolutionAtom(expression, allowUnresolvedExpression)
+ else -> ConeResolutionAtomWithPostponedChild(expression)
+ }
is FirCallableReferenceAccess -> when {
expression.isResolved -> ConeSimpleLeafResolutionAtom(expression, allowUnresolvedExpression)
else -> ConeResolutionAtomWithPostponedChild(expression)
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
index f45f07f..fb525b6 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt
@@ -44,9 +44,12 @@
import org.jetbrains.kotlin.resolve.calls.inference.addEqualityConstraintIfCompatible
import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible
import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor
+import org.jetbrains.kotlin.resolve.calls.inference.buildCurrentSubstitutor
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
+import org.jetbrains.kotlin.types.model.KotlinTypeMarker
+import org.jetbrains.kotlin.types.model.TypeConstructorMarker
import org.jetbrains.kotlin.types.model.safeSubstitute
import org.jetbrains.kotlin.utils.addToStdlib.runIf
@@ -126,13 +129,35 @@
inferenceSession.processPartiallyResolvedCall(call, resolutionMode, completionMode)
- call
+ if (candidate.isSyntheticCallForTopLevelLambda()) {
+ val storage = candidate.system.currentStorage()
+
+ val fixingNotInferredVariables: Map<TypeConstructorMarker, KotlinTypeMarker> = buildMap {
+ if (storage.notFixedTypeVariables.isEmpty()) return@buildMap
+
+ for (typeConstructor in storage.allTypeVariables.keys.toList().drop(storage.outerSystemVariablesPrefixSize)) {
+ if (typeConstructor !in storage.notFixedTypeVariables) continue
+ put(typeConstructor, session.typeContext.createUninferredType(typeConstructor))
+ }
+ }
+
+ val finalSubstitutor = storage
+ .buildCurrentSubstitutor(session.typeContext, emptyMap()) as ConeSubstitutor
+ call.transformSingle(
+ createCompletionResultsWriter(finalSubstitutor),
+ null
+ )
+ } else {
+ call
+ }
}
ConstraintSystemCompletionMode.UNTIL_FIRST_LAMBDA -> throw IllegalStateException()
}
}
+ private fun Candidate.isSyntheticCallForTopLevelLambda(): Boolean = callInfo.callSite is FirAnonymousFunctionExpression
+
private fun checkStorageConstraintsAfterFullCompletion(storage: ConstraintStorage) {
// Fast path for sake of optimization
if (storage.notFixedTypeVariables.isEmpty()) return
@@ -351,7 +376,7 @@
this.name = name
symbol = FirValueParameterSymbol(name)
returnTypeRef =
- itType.approximateLambdaInputType(symbol, withPCLASession).toFirResolvedTypeRef(
+ itType.approximateLambdaInputType(symbol, withPCLASession, candidate).toFirResolvedTypeRef(
lambdaAtom.anonymousFunction.source?.fakeElement(KtFakeSourceElementKind.ItLambdaParameter)
)
defaultValue = null
@@ -371,7 +396,7 @@
receiverType == null -> lambda.replaceReceiverParameter(null)
!lambdaAtom.coerceFirstParameterToExtensionReceiver -> {
lambda.receiverParameter?.apply {
- val type = receiverType.approximateLambdaInputType(valueParameter = null, withPCLASession)
+ val type = receiverType.approximateLambdaInputType(valueParameter = null, withPCLASession, candidate)
val source =
source?.fakeElement(KtFakeSourceElementKind.LambdaReceiver)
?: lambda.source?.fakeElement(KtFakeSourceElementKind.LambdaReceiver)
@@ -393,7 +418,7 @@
name = SpecialNames.UNDERSCORE_FOR_UNUSED_VAR
symbol = FirValueParameterSymbol(name)
returnTypeRef = contextParameterType
- .approximateLambdaInputType(symbol, withPCLASession)
+ .approximateLambdaInputType(symbol, withPCLASession, candidate)
.toFirResolvedTypeRef(lambdaAtom.anonymousFunction.source?.fakeElement(KtFakeSourceElementKind.LambdaContextParameter))
valueParameterKind = if (session.languageVersionSettings.supportsFeature(LanguageFeature.ContextParameters)) {
FirValueParameterKind.ContextParameter
@@ -428,7 +453,7 @@
)
return@forEachIndexed
}
- val newReturnType = theParameters[index].approximateLambdaInputType(parameter.symbol, withPCLASession)
+ val newReturnType = theParameters[index].approximateLambdaInputType(parameter.symbol, withPCLASession, candidate)
val newReturnTypeRef = if (parameter.returnTypeRef is FirImplicitTypeRef) {
newReturnType.toFirResolvedTypeRef(parameter.source?.fakeElement(KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter))
} else parameter.returnTypeRef.resolvedTypeFromPrototype(newReturnType)
@@ -515,12 +540,15 @@
private fun ConeKotlinType.approximateLambdaInputType(
valueParameter: FirValueParameterSymbol?,
isRootLambdaForPCLASession: Boolean,
+ containingCandidate: Candidate,
): ConeKotlinType {
// We only run lambda completion from ConstraintSystemCompletionContext.analyzeRemainingNotAnalyzedPostponedArgument when they are
// left uninferred.
// Currently, we use stub types for builder inference, so CANNOT_INFER_PARAMETER_TYPE is the only possible result here.
if (useErrorTypeInsteadOfTypeVariableForParameterType(isReceiver = valueParameter == null, isRootLambdaForPCLASession)) {
- val diagnostic = valueParameter?.let(::ConeCannotInferValueParameterType) ?: ConeCannotInferReceiverParameterType()
+ val diagnostic = valueParameter?.let {
+ ConeCannotInferValueParameterType(it, isTopLevelLambda = containingCandidate.isSyntheticCallForTopLevelLambda())
+ } ?: ConeCannotInferReceiverParameterType()
return ConeErrorType(diagnostic)
}
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt
index 6c688d8b..8903fd2 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSyntheticCallGenerator.kt
@@ -22,19 +22,18 @@
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.utils.addDefaultBoundIfNecessary
+import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildArgumentList
import org.jetbrains.kotlin.fir.expressions.builder.buildFunctionCall
import org.jetbrains.kotlin.fir.moduleData
-import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
-import org.jetbrains.kotlin.fir.references.FirReference
-import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
+import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
import org.jetbrains.kotlin.fir.references.builder.buildResolvedErrorReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.references.impl.FirStubReference
-import org.jetbrains.kotlin.fir.references.isError
import org.jetbrains.kotlin.fir.resolve.*
+import org.jetbrains.kotlin.fir.resolve.calls.ArgumentTypeMismatch
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
import org.jetbrains.kotlin.fir.resolve.calls.candidate.*
@@ -56,9 +55,11 @@
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.ArrayFqNames
+import org.jetbrains.kotlin.resolve.calls.inference.buildCurrentSubstitutor
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
import org.jetbrains.kotlin.types.Variance
+import org.jetbrains.kotlin.types.model.safeSubstitute
class FirSyntheticCallGenerator(
private val components: BodyResolveComponents
@@ -245,6 +246,70 @@
.firstOrNull() // TODO: it should be single() after KTIJ-26465 is fixed
}
+ fun resolveAnonymousFunctionExpressionWithSyntheticOuterCall(
+ anonymousFunctionExpression: FirAnonymousFunctionExpression,
+ expectedTypeData: ResolutionMode.WithExpectedType?,
+ context: ResolutionContext,
+ ): FirExpression {
+ val argumentList = buildUnaryArgumentList(anonymousFunctionExpression)
+
+ val reference = generateCalleeReferenceToFunctionWithExpectedTypeForArgument(
+ anonymousFunctionExpression,
+ argumentList,
+ expectedTypeData?.expectedType,
+ context,
+ )
+
+ val fakeCall = buildFunctionCall {
+ calleeReference = reference
+ this.argumentList = argumentList
+ }
+
+ components.dataFlowAnalyzer.enterCallArguments(fakeCall, argumentList.arguments)
+ components.dataFlowAnalyzer.enterAnonymousFunctionExpression(anonymousFunctionExpression)
+ components.dataFlowAnalyzer.exitCallArguments()
+
+ val resultingCall = components.callCompleter.completeCall(fakeCall, ResolutionMode.ContextIndependent)
+
+ components.dataFlowAnalyzer.exitFunctionCall(fakeCall, callCompleted = true)
+
+ val resolvedArgument = resultingCall.arguments[0]
+
+ (resultingCall.calleeReference as? FirResolvedErrorReference)?.let {
+ if (expectedTypeData?.expectedTypeMismatchIsReportedInChecker != true || it.diagnostic.actualTypeIfMismatch(anonymousFunctionExpression) == null) {
+ return buildErrorExpression(
+ anonymousFunctionExpression.source?.fakeElement(KtFakeSourceElementKind.ErrorExpressionForTopLevelLambda),
+ it.diagnostic,
+ resolvedArgument
+ )
+ }
+ }
+
+ return resolvedArgument
+ }
+
+ private fun ConeDiagnostic.actualTypeIfMismatch(
+ anonymousFunctionExpression: FirAnonymousFunctionExpression
+ ): ConeKotlinType? {
+ if (this !is ConeInapplicableCandidateError) return null
+ val argumentTypeMismatch = candidate.diagnostics.singleOrNull() as? ArgumentTypeMismatch ?: return null
+
+ if (argumentTypeMismatch.argument == anonymousFunctionExpression) {
+ val candidate = candidate as Candidate
+ val storage = if (candidate.usedOuterCs) candidate.system.currentStorage() else candidate.system.asReadOnlyStorage()
+ val substitutor = storage.buildCurrentSubstitutor(components.session.typeContext, emptyMap())
+
+ anonymousFunctionExpression.anonymousFunction.replaceTypeRef(
+ anonymousFunctionExpression.anonymousFunction.typeRef.withReplacedConeType(
+ substitutor.safeSubstitute(components.session.typeContext, argumentTypeMismatch.actualType) as ConeKotlinType
+ )
+ )
+
+ return argumentTypeMismatch.actualType
+ }
+ return null
+ }
+
fun resolveCallableReferenceWithSyntheticOuterCall(
callableReferenceAccess: FirCallableReferenceAccess,
expectedType: ConeKotlinType?,
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt
index 8cb6697..256dca8 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt
@@ -169,7 +169,7 @@
context.forPropertyInitializer {
if (!initializerIsAlreadyResolved) {
- val resolutionMode = withExpectedType(returnTypeRefBeforeResolve)
+ val resolutionMode = withExpectedType(returnTypeRefBeforeResolve, expectedTypeMismatchIsReportedInChecker = true)
property.transformReturnTypeRef(transformer, resolutionMode)
.transformInitializer(transformer, resolutionMode)
.replaceBodyResolveState(FirPropertyBodyResolveState.INITIALIZER_RESOLVED)
@@ -1129,7 +1129,7 @@
anonymousFunctionExpression // return the same instance
}
is ResolutionMode.WithExpectedType -> {
- transformTopLevelAnonymousFunctionExpression(anonymousFunctionExpression, data.expectedType)
+ transformTopLevelAnonymousFunctionExpression(anonymousFunctionExpression, data)
}
@@ -1155,11 +1155,24 @@
*/
private fun transformTopLevelAnonymousFunctionExpression(
anonymousFunctionExpression: FirAnonymousFunctionExpression,
- expectedType: ConeKotlinType?,
- ): FirStatement = anonymousFunctionExpression.also {
- it.replaceAnonymousFunction(transformTopLevelAnonymousFunctionInObsoleteWay(anonymousFunctionExpression, expectedType))
+ expectedTypeData: ResolutionMode.WithExpectedType?,
+ ): FirStatement = when {
+ session.languageVersionSettings.supportsFeature(LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument) ->
+ components.syntheticCallGenerator.resolveAnonymousFunctionExpressionWithSyntheticOuterCall(
+ anonymousFunctionExpression, expectedTypeData, resolutionContext
+ )
+ else -> {
+ @OptIn(OnlyForDefaultLanguageFeatureDisabled::class) // ResolveTopLevelLambdasAsSyntheticCallArgument
+ val updatedAnonymousFunction = transformTopLevelAnonymousFunctionInObsoleteWay(
+ anonymousFunctionExpression, expectedTypeData?.expectedType
+ )
+ anonymousFunctionExpression.replaceAnonymousFunction(updatedAnonymousFunction)
+
+ anonymousFunctionExpression
+ }
}
+ @OnlyForDefaultLanguageFeatureDisabled(LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument)
private fun transformTopLevelAnonymousFunctionInObsoleteWay(
anonymousFunctionExpression: FirAnonymousFunctionExpression,
expectedType: ConeKotlinType?
@@ -1253,6 +1266,37 @@
)
}
+ @OnlyForDefaultLanguageFeatureDisabled(LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument)
+ private object ImplicitToErrorTypeTransformer : FirTransformer<Any?>() {
+ override fun <E : FirElement> transformElement(element: E, data: Any?): E {
+ return element
+ }
+
+ override fun transformValueParameter(
+ valueParameter: FirValueParameter,
+ data: Any?
+ ): FirStatement =
+ whileAnalysing(valueParameter.moduleData.session, valueParameter) {
+ if (valueParameter.returnTypeRef is FirImplicitTypeRef) {
+ valueParameter.replaceReturnTypeRef(
+ valueParameter.returnTypeRef.resolvedTypeFromPrototype(
+ ConeErrorType(
+ ConeSimpleDiagnostic(
+ "No type for parameter",
+ DiagnosticKind.ValueParameterWithNoTypeAnnotation
+ )
+ ),
+ fallbackSource = valueParameter.source?.fakeElement(
+ KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter,
+ ),
+ )
+ )
+ }
+ return valueParameter
+ }
+ }
+
+ @OnlyForDefaultLanguageFeatureDisabled(LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument)
private fun obtainValueParametersFromResolvedLambdaAtom(
resolvedLambdaAtom: ConeResolvedLambdaAtom,
lambda: FirAnonymousFunction,
@@ -1290,6 +1334,7 @@
}
}
+ @OnlyForDefaultLanguageFeatureDisabled(LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument)
private fun obtainValueParametersFromExpectedType(
expectedType: ConeKotlinType?,
lambda: FirAnonymousFunction
@@ -1305,6 +1350,7 @@
return obtainValueParametersFromExpectedParameterTypes(parameterTypes, lambda)
}
+ @OnlyForDefaultLanguageFeatureDisabled(LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument)
private fun obtainValueParametersFromExpectedParameterTypes(
expectedTypeParameterTypes: List<ConeKotlinType>,
lambda: FirAnonymousFunction
@@ -1476,34 +1522,6 @@
}
}
- private object ImplicitToErrorTypeTransformer : FirTransformer<Any?>() {
- override fun <E : FirElement> transformElement(element: E, data: Any?): E {
- return element
- }
-
- override fun transformValueParameter(
- valueParameter: FirValueParameter,
- data: Any?
- ): FirStatement =
- whileAnalysing(valueParameter.moduleData.session, valueParameter) {
- if (valueParameter.returnTypeRef is FirImplicitTypeRef) {
- valueParameter.replaceReturnTypeRef(
- valueParameter.returnTypeRef.resolvedTypeFromPrototype(
- ConeErrorType(
- ConeSimpleDiagnostic(
- "No type for parameter",
- DiagnosticKind.ValueParameterWithNoTypeAnnotation
- )
- ),
- fallbackSource = valueParameter.source?.fakeElement(
- KtFakeSourceElementKind.ImplicitReturnTypeOfLambdaValueParameter,
- ),
- )
- )
- }
- return valueParameter
- }
- }
private val FirVariable.initializerResolved: Boolean
get() {
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/annotations.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/annotations.kt
index 812cbee..6de4e20 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/annotations.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/annotations.kt
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.fir
+import org.jetbrains.kotlin.config.LanguageFeature
+
/**
* [NoMutableState] annotation means that annotated class has no mutable state
* and it's safe to use it concurrent environment (e.g. as session component)
@@ -36,3 +38,11 @@
@RequiresOptIn
annotation class SessionConfiguration
+/**
+ * Declarations that are only being used in case some default language features are disabled: mostly likely due to using not the latest
+ * language version.
+ *
+ * Let's try to have a convention to use a relevant language feature name as a side comment.
+ */
+@RequiresOptIn
+annotation class OnlyForDefaultLanguageFeatureDisabled(val languageFeature: LanguageFeature)
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt
index ab99bae..b12352a 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt
@@ -40,7 +40,8 @@
class ConeCannotInferValueParameterType(
val valueParameter: FirValueParameterSymbol,
- override val reason: String = "Cannot infer type for parameter ${valueParameter.name}"
+ override val reason: String = "Cannot infer type for parameter ${valueParameter.name}",
+ val isTopLevelLambda: Boolean = false,
) : ConeCannotInferType()
class ConeCannotInferReceiverParameterType(
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt
index fea41be..ed65a2f 100644
--- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt
+++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.renderer
+import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
abstract class FirErrorExpressionRenderer {
@@ -17,6 +18,11 @@
class FirErrorExpressionOnlyErrorRenderer : FirErrorExpressionRenderer() {
override fun renderErrorExpression(errorExpression: FirErrorExpression) {
printer.print("ERROR_EXPR(${errorExpression.diagnostic.reason})")
+ errorExpression.expression?.let {
+ if (errorExpression.source?.kind == KtFakeSourceElementKind.ErrorExpressionForTopLevelLambda) {
+ it.accept(components.visitor)
+ }
+ }
}
}
diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt
index fd09373..1fc0e32 100644
--- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt
+++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt
@@ -504,6 +504,12 @@
* For plugin-generated things
*/
object PluginGenerated : KtFakeSourceElementKind()
+
+ /**
+ * To store some diagnostic for erroneously resolved top-level lambda
+ * See [org.jetbrains.kotlin.config.LanguageFeature.ResolveTopLevelLambdasAsSyntheticCallArgument] and its usages
+ */
+ object ErrorExpressionForTopLevelLambda : KtFakeSourceElementKind()
}
sealed class AbstractKtSourceElement {
diff --git a/compiler/testData/diagnostics/tests/FunctionReturnTypes.fir.kt b/compiler/testData/diagnostics/tests/FunctionReturnTypes.fir.kt
index 50fcf7c..9ebae20 100644
--- a/compiler/testData/diagnostics/tests/FunctionReturnTypes.fir.kt
+++ b/compiler/testData/diagnostics/tests/FunctionReturnTypes.fir.kt
@@ -173,31 +173,31 @@
}
fun testFunctionLiterals() {
- val endsWithVarDeclaration : () -> Boolean = <!INITIALIZER_TYPE_MISMATCH!>{
- val x = 2
- }<!>
+ val endsWithVarDeclaration : () -> Boolean = {
+ <!RETURN_TYPE_MISMATCH!>val x = 2<!>
+ }
- val endsWithAssignment: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>{
+ val endsWithAssignment: () -> Int = {
+ var x = 1
+ <!RETURN_TYPE_MISMATCH!>x = 333<!>
+ }
+
+ val endsWithReAssignment: () -> Int = {
+ var x = 1
+ <!RETURN_TYPE_MISMATCH!>x += 333<!>
+ }
+
+ val endsWithFunDeclaration : () -> String = {
var x = 1
x = 333
- }<!>
+ <!RETURN_TYPE_MISMATCH!>fun meow() : Unit {}<!>
+ }
- val endsWithReAssignment: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>{
- var x = 1
- x += 333
- }<!>
-
- val endsWithFunDeclaration : () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
+ val endsWithObjectDeclaration : () -> Int = {
var x = 1
x = 333
- fun meow() : Unit {}
- }<!>
-
- val endsWithObjectDeclaration : () -> Int = <!INITIALIZER_TYPE_MISMATCH!>{
- var x = 1
- x = 333
- <!LOCAL_OBJECT_NOT_ALLOWED!>object A<!> {}
- }<!>
+ <!RETURN_TYPE_MISMATCH!><!LOCAL_OBJECT_NOT_ALLOWED!>object A<!> {}<!>
+ }
val expectedUnitReturnType1: () -> Unit = {
val x = 1
diff --git a/compiler/testData/diagnostics/tests/declarationChecks/ScalaLikeNamedFun.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/ScalaLikeNamedFun.fir.kt
index 05a6a14..53e2957 100644
--- a/compiler/testData/diagnostics/tests/declarationChecks/ScalaLikeNamedFun.fir.kt
+++ b/compiler/testData/diagnostics/tests/declarationChecks/ScalaLikeNamedFun.fir.kt
@@ -4,16 +4,16 @@
fun test1(): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
fun test2(): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
-val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
-val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
+val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
+val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ 1 }<!>
fun test5(): Int { return <!RETURN_TYPE_MISMATCH!>{ 1 }<!> }
fun test6(): Int = <!RETURN_TYPE_MISMATCH!>fun (): Int = 1<!>
fun outer() {
fun test1(): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
fun test2(): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
- val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
- val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
+ val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
+ val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ 1 }<!>
fun test5(): Int { return <!RETURN_TYPE_MISMATCH!>{ 1 }<!> }
fun test6(): Int = <!RETURN_TYPE_MISMATCH!>fun (): Int = 1<!>
}
@@ -21,16 +21,16 @@
class Outer {
fun test1(): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
fun test2(): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
- val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
- val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
+ val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
+ val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ 1 }<!>
fun test5(): Int { return <!RETURN_TYPE_MISMATCH!>{ 1 }<!> }
fun test6(): Int = <!RETURN_TYPE_MISMATCH!>fun (): Int = 1<!>
class Nested {
fun test1(): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
fun test2(): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
- val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
- val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH!>{ 1 }<!>
+ val test3: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ <!RETURN_NOT_ALLOWED!>return<!> 1 }<!>
+ val test4: () -> Int = fun (): Int = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>{ 1 }<!>
fun test5(): Int { return <!RETURN_TYPE_MISMATCH!>{ 1 }<!> }
fun test6(): Int = <!RETURN_TYPE_MISMATCH!>fun (): Int = 1<!>
}
diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/deprecated.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/deprecated.fir.kt
index 60e8bbf..b8510b1 100644
--- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/deprecated.fir.kt
+++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/deprecated.fir.kt
@@ -45,7 +45,7 @@
val x: <!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(A) () -> Unit = body
val y = body
val z: suspend <!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(A) B.() -> Unit = {}
- val w: (<!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(Int) () -> Unit, <!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(Int) () -> Unit) -> (<!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(Int) () -> Unit) = <!CONTEXT_RECEIVERS_DEPRECATED!>{ a, b -> { } }<!>
+ val w: (<!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(Int) () -> Unit, <!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(Int) () -> Unit) -> (<!CONTEXT_RECEIVERS_DEPRECATED!>context<!>(Int) () -> Unit) = { a, b -> { } }
return {}
}
diff --git a/compiler/testData/diagnostics/tests/functionAsExpression/ReturnTypeCheck.fir.kt b/compiler/testData/diagnostics/tests/functionAsExpression/ReturnTypeCheck.fir.kt
index 1b7149e..a50ac5d 100644
--- a/compiler/testData/diagnostics/tests/functionAsExpression/ReturnTypeCheck.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionAsExpression/ReturnTypeCheck.fir.kt
@@ -3,8 +3,8 @@
if (a == 1) return "4"
when (a) {
5 -> return "2"
- 3 -> return <!NULL_FOR_NONNULL_TYPE!>null<!>
- 2 -> return <!RETURN_TYPE_MISMATCH!>2<!>
+ 3 -> return <!NULL_FOR_NONNULL_TYPE, NULL_FOR_NONNULL_TYPE!>null<!>
+ 2 -> return <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>2<!>
}
return ""
}
@@ -13,7 +13,7 @@
if (a == 1) return@l "4"
when (a) {
5 -> return@l "2"
- 3 -> return@l <!RETURN_TYPE_MISMATCH!>null<!>
+ 3 -> return@l <!NULL_FOR_NONNULL_TYPE!>null<!>
2 -> return@l <!RETURN_TYPE_MISMATCH!>2<!>
}
return@l ""
diff --git a/compiler/testData/diagnostics/tests/functionLiterals/assignmentOperationInLambdaWithExpectedType.fir.kt b/compiler/testData/diagnostics/tests/functionLiterals/assignmentOperationInLambdaWithExpectedType.fir.kt
index 222c025..47504ce 100644
--- a/compiler/testData/diagnostics/tests/functionLiterals/assignmentOperationInLambdaWithExpectedType.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionLiterals/assignmentOperationInLambdaWithExpectedType.fir.kt
@@ -4,11 +4,11 @@
val a: () -> Unit = { bar += 4 }
- val b: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>{ bar = 4 }<!>
+ val b: () -> Int = { <!RETURN_TYPE_MISMATCH!>bar = 4<!> }
- val c: () -> <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>UNRESOLVED<!> = { bal[2] = 3 }
+ val c: () -> <!UNRESOLVED_REFERENCE!>UNRESOLVED<!> = { bal[2] = 3 }
- val d: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>{ bar += 4 }<!>
+ val d: () -> Int = { <!RETURN_TYPE_MISMATCH!>bar += 4<!> }
val e: Unit = run { bar += 4 }
diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/IfWithoutElseWithExplicitType.fir.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/IfWithoutElseWithExplicitType.fir.kt
index cd0abe9..905868a 100644
--- a/compiler/testData/diagnostics/tests/functionLiterals/return/IfWithoutElseWithExplicitType.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionLiterals/return/IfWithoutElseWithExplicitType.fir.kt
@@ -6,7 +6,7 @@
}
val b: () -> Unit = l@ {
- if (flag) return@l <!RETURN_TYPE_MISMATCH!>4<!>
+ if (flag) return@l <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>4<!>
}
val c: () -> Any = l@ {
@@ -18,6 +18,6 @@
5
}
-val e: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>l@ {
- if (flag) 4
-}<!>
+val e: () -> Int = l@ {
+ <!RETURN_TYPE_MISMATCH!>if (flag) 4<!>
+}
diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/kt66512.fir.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/kt66512.fir.kt
index 10ba818..bd1cc47 100644
--- a/compiler/testData/diagnostics/tests/functionLiterals/return/kt66512.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionLiterals/return/kt66512.fir.kt
@@ -9,7 +9,7 @@
// ================= Lambdas assigned to a variable =================
val expectedMyUnitExplicitReturnString: () -> MyUnit = l@ {
- return@l <!RETURN_TYPE_MISMATCH!>""<!>
+ return@l <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>""<!>
}
// ============== Lambdas passed as function argument ===============
diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/kt66534.fir.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/kt66534.fir.kt
index 79bf1ac..2cf8bbb 100644
--- a/compiler/testData/diagnostics/tests/functionLiterals/return/kt66534.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionLiterals/return/kt66534.fir.kt
@@ -67,7 +67,7 @@
fun expectedFlexibleUnitExplicitReturnString() {
A.foo = l@ {
- return@l <!RETURN_TYPE_MISMATCH!>""<!>
+ return@l <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>""<!>
}
}
diff --git a/compiler/testData/diagnostics/tests/functionLiterals/return/unresolvedReferenceInReturnBlock.fir.kt b/compiler/testData/diagnostics/tests/functionLiterals/return/unresolvedReferenceInReturnBlock.fir.kt
index 5b81054..a419cc7 100644
--- a/compiler/testData/diagnostics/tests/functionLiterals/return/unresolvedReferenceInReturnBlock.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionLiterals/return/unresolvedReferenceInReturnBlock.fir.kt
@@ -1,10 +1,10 @@
// RUN_PIPELINE_TILL: FRONTEND
-val a = l@ <!UNRESOLVED_REFERENCE!>{
+val a = l@ {
return@l <!UNRESOLVED_REFERENCE!>r<!>
-}<!>
+}
val b = l@ {
if ("" == "OK") return@l
return@l <!UNRESOLVED_REFERENCE!>r<!>
-}
\ No newline at end of file
+}
diff --git a/compiler/testData/diagnostics/tests/functionTypeInitializerTypeMismatch.fir.kt b/compiler/testData/diagnostics/tests/functionTypeInitializerTypeMismatch.fir.kt
index 831fd3a..9f64536 100644
--- a/compiler/testData/diagnostics/tests/functionTypeInitializerTypeMismatch.fir.kt
+++ b/compiler/testData/diagnostics/tests/functionTypeInitializerTypeMismatch.fir.kt
@@ -1,14 +1,6 @@
// RUN_PIPELINE_TILL: FRONTEND
// RENDER_DIAGNOSTICS_MESSAGES
-val f1: () -> Int = { <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
-val f2: () -> Int = l@ {
- return@l <!RETURN_TYPE_MISMATCH("Int; String")!>""<!>
-}
-val f3: () -> Int = l@ {
- if (true) return@l 4
- return@l <!RETURN_TYPE_MISMATCH("Int; String")!>""<!>
-}
val f5: () -> Int = <!INITIALIZER_TYPE_MISMATCH("Function0<Int>; Function1<ERROR CLASS: Cannot infer type for parameter it, String>")!>{ <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> "" }<!>
val f6: () -> Int = <!INITIALIZER_TYPE_MISMATCH("Function0<Int>; Function1<Any, String>")!>{ it: Any -> "" }<!>
val f7: () -> Int = { -> <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
@@ -16,7 +8,7 @@
val f9: String = <!INITIALIZER_TYPE_MISMATCH("String; Function0<String>")!>{ -> "" }<!>
val f10: Function0<Int> = { -> <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
val f11: Function0<<!REDUNDANT_PROJECTION("Function0<out Int>")!>out<!> Int> = { -> <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
-val f12: Function0<<!CONFLICTING_PROJECTION("Function0<in Int>")!>in<!> Int> = { -> "" }
+val f12: Function0<<!CONFLICTING_PROJECTION("Function0<in Int>")!>in<!> Int> = { -> <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
val f13: Function0<*> = { -> "" }
val f14: Function<Int> = { -> <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
val f15: Function<Int> = { <!RETURN_TYPE_MISMATCH("Int; String")!>""<!> }
diff --git a/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.fir.kt b/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.fir.kt
index 2c57d19..4fd739b 100644
--- a/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithExpectedType.fir.kt
@@ -13,7 +13,7 @@
val b: () -> Unit = l@{
// Error, coercion can't be applied at this position!
- if (true) return@l <!RETURN_TYPE_MISMATCH!>"hello"<!>
+ if (true) return@l <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>"hello"<!>
// However, this is OK, because here coercion is applied
"hello"
diff --git a/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithoutExpectedType.fir.kt b/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithoutExpectedType.fir.kt
index 98c2713..838d55e 100644
--- a/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithoutExpectedType.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/coercionToUnit/coercionWithoutExpectedType.fir.kt
@@ -11,8 +11,8 @@
return@l
}
- val c = l@<!CANNOT_INFER_PARAMETER_TYPE!>{
+ val c = l@{
// Error: block doesn't have an expected type, so call can't be inferred!
return@l <!CANNOT_INFER_PARAMETER_TYPE, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>materialize<!>()
- }<!>
+ }
}
diff --git a/compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.fir.kt b/compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.fir.kt
index 8f88d85..2414791 100644
--- a/compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/coercionToUnit/noCoercion.fir.kt
@@ -10,9 +10,9 @@
}
fun noCoercionBlockHasExplicitType() {
- val b: () -> Int = <!INITIALIZER_TYPE_MISMATCH!>{
- if (true) 42
- }<!>
+ val b: () -> Int = {
+ <!RETURN_TYPE_MISMATCH!>if (true) 42<!>
+ }
}
fun noCoercionBlockHasExplicitReturn() {
diff --git a/compiler/testData/diagnostics/tests/inference/constraints/wrongExpectedTypeForWhen.fir.kt b/compiler/testData/diagnostics/tests/inference/constraints/wrongExpectedTypeForWhen.fir.kt
index 4c8fb5e..9f7dbeb 100644
--- a/compiler/testData/diagnostics/tests/inference/constraints/wrongExpectedTypeForWhen.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/constraints/wrongExpectedTypeForWhen.fir.kt
@@ -1,6 +1,6 @@
// RUN_PIPELINE_TILL: FRONTEND
fun foo() {
- var f: Int = <!INITIALIZER_TYPE_MISMATCH!>if (true) <!ARGUMENT_TYPE_MISMATCH!>{ x: Long -> }<!> else { x: Long -> }<!>
+ var f: Int = <!INITIALIZER_TYPE_MISMATCH!>if (true) <!ARGUMENT_TYPE_MISMATCH!>{ x: Long -> }<!> else <!ARGUMENT_TYPE_MISMATCH!>{ x: Long -> }<!><!>
}
class A {
diff --git a/compiler/testData/diagnostics/tests/inference/pcla/forceLambdaCompletionFromReturnStatement/earlyReturn.fir.kt b/compiler/testData/diagnostics/tests/inference/pcla/forceLambdaCompletionFromReturnStatement/earlyReturn.fir.kt
index a744731..856c0e4 100644
--- a/compiler/testData/diagnostics/tests/inference/pcla/forceLambdaCompletionFromReturnStatement/earlyReturn.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/pcla/forceLambdaCompletionFromReturnStatement/earlyReturn.fir.kt
@@ -8,9 +8,9 @@
fun main(b: Boolean) {
build { container ->
if (b) {
- return@build <!UNRESOLVED_REFERENCE!>{ <!VALUE_PARAMETER_WITHOUT_EXPLICIT_TYPE!>arg<!> ->
- arg.<!UNRESOLVED_REFERENCE!>length<!>
- }<!>
+ return@build { arg ->
+ arg.length
+ }
}
container.consume({ arg: String -> })
}
diff --git a/compiler/testData/diagnostics/tests/inference/pcla/specialCallsWithLambdas.fir.kt b/compiler/testData/diagnostics/tests/inference/pcla/specialCallsWithLambdas.fir.kt
index 1dd79da..744791a3e 100644
--- a/compiler/testData/diagnostics/tests/inference/pcla/specialCallsWithLambdas.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/pcla/specialCallsWithLambdas.fir.kt
@@ -176,7 +176,7 @@
fun poll84(): Flow<String> {
return flow {
- val inv = {<!RETURN_TYPE_MISMATCH!>{1}<!>} in setOf({{1f}})
+ val inv = {{<!RETURN_TYPE_MISMATCH!>1<!>}} in setOf({{1f}})
<!UNRESOLVED_REFERENCE!>inv<!>()
}
}
diff --git a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt
index 5054697..4ac450f 100644
--- a/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/recursiveLocalFuns/recursiveLambda.fir.kt
@@ -1,6 +1,6 @@
// RUN_PIPELINE_TILL: FRONTEND
fun foo() {
- fun bar() = <!RECURSION_IN_IMPLICIT_TYPES!>{
+ fun bar() = {
<!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>bar()<!>
- }<!>
+ }
}
diff --git a/compiler/testData/diagnostics/tests/inference/reportingImprovements/ErrorTypeAsGenericParameter.fir.kt b/compiler/testData/diagnostics/tests/inference/reportingImprovements/ErrorTypeAsGenericParameter.fir.kt
index 1e0fec5..382a41b 100644
--- a/compiler/testData/diagnostics/tests/inference/reportingImprovements/ErrorTypeAsGenericParameter.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/reportingImprovements/ErrorTypeAsGenericParameter.fir.kt
@@ -4,6 +4,6 @@
fun <T, R, S> foo(block: (T)-> R, second: (T)-> S) = block
fun main() {
- val fff = <!UNRESOLVED_REFERENCE!>{ x: Int -> <!UNRESOLVED_REFERENCE!>aaa<!> }<!>
+ val fff = { x: Int -> <!UNRESOLVED_REFERENCE!>aaa<!> }
<!CANNOT_INFER_PARAMETER_TYPE, CANNOT_INFER_PARAMETER_TYPE, CANNOT_INFER_PARAMETER_TYPE!>foo<!>(<!ARGUMENT_TYPE_MISMATCH!>fff<!>, { <!CANNOT_INFER_PARAMETER_TYPE!>x<!> -> x + 1 })
}
diff --git a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt
index d5154ad..ff9f53a 100644
--- a/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/underscoredTypeInForbiddenPositions.fir.kt
@@ -47,7 +47,7 @@
val x1cp = foo<Int, context(<!UNRESOLVED_REFERENCE!>_<!>) () -> Unit> { <!CANNOT_INFER_PARAMETER_TYPE!>{ "" }<!> }
val x2 = foo<Int, (Int) -> <!UNRESOLVED_REFERENCE!>_<!>> { <!UNRESOLVED_REFERENCE!>{ it }<!> }
val x3 = foo<Int, ((<!UNRESOLVED_REFERENCE!>_<!>)) -> <!UNRESOLVED_REFERENCE!>_<!>> { <!CANNOT_INFER_PARAMETER_TYPE!>{ it }<!> }
- val x4 = <!CANNOT_INFER_PARAMETER_TYPE, CANNOT_INFER_PARAMETER_TYPE, FUNCTION_CALL_EXPECTED!>foo<!><!UNRESOLVED_REFERENCE!><<!>Int<!SYNTAX!>, _ -> Float><!> { <!UNRESOLVED_REFERENCE!>{ <!UNRESOLVED_REFERENCE!>it<!> }<!> }
+ val x4 = <!CANNOT_INFER_PARAMETER_TYPE, CANNOT_INFER_PARAMETER_TYPE, FUNCTION_CALL_EXPECTED!>foo<!><!UNRESOLVED_REFERENCE!><<!>Int<!SYNTAX!>, _ -> Float><!> <!CANNOT_INFER_PARAMETER_TYPE!>{ { <!UNRESOLVED_REFERENCE!>it<!> } }<!>
val x5 = foo<Int, Foo<(<!UNRESOLVED_REFERENCE!>_<!>) -> Float>> { <!ARGUMENT_TYPE_MISMATCH!>{ it }<!> }
val x6 = foo<Int, Foo<(<!UNRESOLVED_REFERENCE!>_<!>) -> <!UNRESOLVED_REFERENCE!>_<!>>> { <!ARGUMENT_TYPE_MISMATCH!>{ it }<!> }
val x7 = foo<Int, Foo<(Int) -> <!UNRESOLVED_REFERENCE!>_<!>>> { <!ARGUMENT_TYPE_MISMATCH!>{ it }<!> }
diff --git a/compiler/testData/diagnostics/tests/regressions/kt235.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt235.fir.kt
index 73c85fa..a390148 100644
--- a/compiler/testData/diagnostics/tests/regressions/kt235.fir.kt
+++ b/compiler/testData/diagnostics/tests/regressions/kt235.fir.kt
@@ -5,29 +5,29 @@
fun main() {
val array = MyArray()
- val f: () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
- array[2] = 23 //error: Type mismatch: inferred type is Int (!!!) but String was expected
- }<!>
- val g: () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
+ val f: () -> String = {
+ <!RETURN_TYPE_MISMATCH!>array[2] = 23<!> //error: Type mismatch: inferred type is Int (!!!) but String was expected
+ }
+ val g: () -> String = {
var x = 1
- x += 2 //no error, but it should be here
- }<!>
- val h: () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
+ <!RETURN_TYPE_MISMATCH!>x += 2<!> //no error, but it should be here
+ }
+ val h: () -> String = {
var x = 1
- x = 2 //the same
- }<!>
+ <!RETURN_TYPE_MISMATCH!>x = 2<!> //the same
+ }
val array1 = MyArray1()
- val i: () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
- array1[2] = 23
- }<!>
+ val i: () -> String = {
+ <!RETURN_TYPE_MISMATCH!>array1[2] = 23<!>
+ }
- val fi: () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
- array[2] = 23
- }<!>
- val gi: () -> String = <!INITIALIZER_TYPE_MISMATCH!>{
+ val fi: () -> String = {
+ <!RETURN_TYPE_MISMATCH!>array[2] = 23<!>
+ }
+ val gi: () -> String = {
var x = 1
- x += 21
- }<!>
+ <!RETURN_TYPE_MISMATCH!>x += 21<!>
+ }
var m: MyNumber = MyNumber()
val a: () -> MyNumber = {
diff --git a/compiler/testData/diagnostics/tests/resolve/newLineLambda.fir.kt b/compiler/testData/diagnostics/tests/resolve/newLineLambda.fir.kt
index 5773198..058beec 100644
--- a/compiler/testData/diagnostics/tests/resolve/newLineLambda.fir.kt
+++ b/compiler/testData/diagnostics/tests/resolve/newLineLambda.fir.kt
@@ -112,7 +112,7 @@
fun f1(): (() -> Unit) -> (() -> Unit) -> Unit {
return <!RETURN_TYPE_MISMATCH!>{ l1 ->
- l1()
- <!TOO_MANY_ARGUMENTS!>{ <!CANNOT_INFER_PARAMETER_TYPE!>l2<!> -> <!UNRESOLVED_REFERENCE!>l2<!>() }<!>
+ <!RETURN_TYPE_MISMATCH!>l1()
+ <!TOO_MANY_ARGUMENTS!>{ <!CANNOT_INFER_PARAMETER_TYPE!>l2<!> -> <!UNRESOLVED_REFERENCE!>l2<!>() }<!><!>
}<!>
}
diff --git a/compiler/testData/diagnostics/tests/when/kt47922.fir.kt b/compiler/testData/diagnostics/tests/when/kt47922.fir.kt
index ca9f054..42a2f54 100644
--- a/compiler/testData/diagnostics/tests/when/kt47922.fir.kt
+++ b/compiler/testData/diagnostics/tests/when/kt47922.fir.kt
@@ -13,10 +13,10 @@
sealed class ToState
-val sealedTest: SealedBase.() -> ToState? = <!INITIALIZER_TYPE_MISMATCH!>{
- <!NO_ELSE_IN_WHEN!>when<!>(this) {}
-}<!>
+val sealedTest: SealedBase.() -> ToState? = {
+ <!RETURN_TYPE_MISMATCH!><!NO_ELSE_IN_WHEN!>when<!>(this) {}<!>
+}
-val nonSealedTest: NonSealedBase.() -> ToState? = <!INITIALIZER_TYPE_MISMATCH!>{
- when(this) {}
-}<!>
+val nonSealedTest: NonSealedBase.() -> ToState? = {
+ <!RETURN_TYPE_MISMATCH!>when(this) {}<!>
+}
diff --git a/compiler/testData/diagnostics/testsWithStdLib/functionLiterals/nullableUnitLiteral.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/functionLiterals/nullableUnitLiteral.fir.kt
index 1047927..f65a443 100644
--- a/compiler/testData/diagnostics/testsWithStdLib/functionLiterals/nullableUnitLiteral.fir.kt
+++ b/compiler/testData/diagnostics/testsWithStdLib/functionLiterals/nullableUnitLiteral.fir.kt
@@ -4,8 +4,8 @@
fun test() {
val closeable: java.io.Closeable? = null
val closeF = fun() { closeable?.close() }
- val closeFB = fun(): Unit = <!RETURN_TYPE_MISMATCH!>closeable?.close()<!>
- val closeFR = fun() { return <!RETURN_TYPE_MISMATCH!>closeable?.close()<!> }
+ val closeFB = fun(): Unit = <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>closeable?.close()<!>
+ val closeFR = fun() { return <!RETURN_TYPE_MISMATCH, RETURN_TYPE_MISMATCH!>closeable?.close()<!> }
val closeL = { closeable?.close() }
val closeLR = label@ { return@label closeable?.close() }
}
diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
index c92a921..f117096 100644
--- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
+++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
@@ -378,6 +378,8 @@
AnnotationDefaultTargetMigrationWarning(KOTLIN_2_2, kind = BUG_FIX), // KT-73255, KT-73494
AllowDnnTypeOverridingFlexibleType(KOTLIN_2_2, kind = OTHER), // KT-74049
+ ResolveTopLevelLambdasAsSyntheticCallArgument(KOTLIN_2_1), // KT-67869
+
// 2.3
ForbidCompanionInLocalInnerClass(KOTLIN_2_3, kind = BUG_FIX),
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt
index ec540af..d9dadc0 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt
@@ -229,7 +229,7 @@
fun TypeConstructorMarker.isFinalClassConstructor(): Boolean
- fun TypeVariableMarker.freshTypeConstructor(): TypeConstructorMarker
+ fun TypeVariableMarker./**/freshTypeConstructor(): TypeConstructorMarker
fun CapturedTypeMarker.typeConstructorProjection(): TypeArgumentMarker
fun CapturedTypeMarker.typeParameter(): TypeParameterMarker?