diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index e247a275ab5..ac6e065508d 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -2691,6 +2691,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/problems/doubleGenericDiamond.kt"); } + @TestMetadata("fakeTypeMismatchOnExtensionReference.kt") + public void testFakeTypeMismatchOnExtensionReference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.kt"); + } + @TestMetadata("falseIntersection.kt") public void testFalseIntersection() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/problems/falseIntersection.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.fir.txt new file mode 100644 index 00000000000..46225aa7ae4 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.fir.txt @@ -0,0 +1,20 @@ +FILE: fakeTypeMismatchOnExtensionReference.kt + public abstract interface IrElement : R|kotlin/Any| { + } + public final fun R|IrElement|.dumpKotlinLike(options: R|kotlin/String| = String()): R|kotlin/String| { + ^dumpKotlinLike String() + } + public final fun R|IrElement|.dump(normalizeNames: R|kotlin/Boolean| = Boolean(false)): R|kotlin/String| { + ^dump String() + } + public final fun foo(dumpStrategy: R|kotlin/String|): R|kotlin/Unit| { + lval dump: R|IrElement.() -> kotlin/String| = when () { + ==(R|/dumpStrategy|, String(KotlinLike)) -> { + Q|IrElement|::R|/dumpKotlinLike| + } + else -> { + Q|IrElement|::R|/dump| + } + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.kt b/compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.kt new file mode 100644 index 00000000000..275287246e7 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.kt @@ -0,0 +1,8 @@ +interface IrElement + +fun IrElement.dumpKotlinLike(options: String = ""): String = "" +fun IrElement.dump(normalizeNames: Boolean = false): String = "" + +fun foo(dumpStrategy: String) { + val dump: IrElement.() -> String = if (dumpStrategy == "KotlinLike") IrElement::dumpKotlinLike else IrElement::dump +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index c930247617f..b395e14d13d 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -3047,6 +3047,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/problems/doubleGenericDiamond.kt"); } + @Test + @TestMetadata("fakeTypeMismatchOnExtensionReference.kt") + public void testFakeTypeMismatchOnExtensionReference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.kt"); + } + @Test @TestMetadata("falseIntersection.kt") public void testFalseIntersection() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 0169f69bb4b..085d81a6e0a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -3081,6 +3081,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/problems/doubleGenericDiamond.kt"); } + @Test + @TestMetadata("fakeTypeMismatchOnExtensionReference.kt") + public void testFakeTypeMismatchOnExtensionReference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/problems/fakeTypeMismatchOnExtensionReference.kt"); + } + @Test @TestMetadata("falseIntersection.kt") public void testFalseIntersection() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt index 05afb5df850..c93603159cf 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt @@ -35,6 +35,9 @@ object FirInitializerTypeMismatchChecker : FirPropertyChecker() { // val p: Byte = 42 or similar situation return } + if (propertyType.isExtensionFunctionType || expressionType.isExtensionFunctionType) { + return + } val source = declaration.source ?: return reporter.report(INITIALIZER_TYPE_MISMATCH.on(source, propertyType, expressionType), context) } diff --git a/compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.fir.kt b/compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.fir.kt index ff0271efe37..63606691a1c 100644 --- a/compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.fir.kt @@ -24,6 +24,6 @@ class A : (@Ann Int)->Unit { @Target(AnnotationTarget.TYPE) annotation class TypeAnn -val onType: (@TypeAnn A).(@Ann a: @TypeAnn A, @TypeAnn A)->@TypeAnn A? = { null } +val onType: (@TypeAnn A).(@Ann a: @TypeAnn A, @TypeAnn A)->@TypeAnn A? = { null } fun (@TypeAnn A).extFun(@Ann a: @TypeAnn A): @TypeAnn A? = null \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/functionAsExpression/FunctionType.fir.kt b/compiler/testData/diagnostics/tests/functionAsExpression/FunctionType.fir.kt index d304a2cee60..01c65eada00 100644 --- a/compiler/testData/diagnostics/tests/functionAsExpression/FunctionType.fir.kt +++ b/compiler/testData/diagnostics/tests/functionAsExpression/FunctionType.fir.kt @@ -28,5 +28,5 @@ fun testReceiverType() { val bas: String.() -> Unit = fun String.() {} - val bag: Int.() -> Unit = fun String.() {} + val bag: Int.() -> Unit = fun String.() {} } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/functionLiterals/missedTypeMismatch.fir.kt b/compiler/testData/diagnostics/tests/functionLiterals/missedTypeMismatch.fir.kt index aa213a46407..2f707ce03a3 100644 --- a/compiler/testData/diagnostics/tests/functionLiterals/missedTypeMismatch.fir.kt +++ b/compiler/testData/diagnostics/tests/functionLiterals/missedTypeMismatch.fir.kt @@ -23,7 +23,7 @@ fun main() { foo(fun(): String = "1") foo(((fun(): String = "1"))) - val a10: Int.(String) -> Int = fun (x: String) = 10 + val a10: Int.(String) -> Int = fun (x: String) = 10 val a11: () -> () -> () -> Int = fun() = fun() = fun(): String = "1" val a12: Int = fun(): String = "1" diff --git a/compiler/testData/diagnostics/tests/inference/completion/postponedArgumentsAnalysis/basic.fir.kt b/compiler/testData/diagnostics/tests/inference/completion/postponedArgumentsAnalysis/basic.fir.kt index 1fa335e25d9..346a843d7ed 100644 --- a/compiler/testData/diagnostics/tests/inference/completion/postponedArgumentsAnalysis/basic.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/completion/postponedArgumentsAnalysis/basic.fir.kt @@ -153,7 +153,7 @@ fun main() { // Convert to extension lambda is impossible because the lambda parameter types aren't specified explicitly select(id(fun String.(x: String) {}), id(fun(x: String, y: String) { }), { x, y -> x }) select(id(id(fun(x: String, y: String) { }), fun String.(x: String) {}), { x, y -> x }) - val x26: Int.(String) -> Int = fun (x: String) = 10 // it must be error, see KT-38439 + val x26: Int.(String) -> Int = fun (x: String) = 10 // it must be error, see KT-38439 // Receiver must be specified in anonymous function declaration val x27: Int.(String) -> Int = id(fun (x: String) = 10) select(id Unit> {}, { x: Int, y: String -> x }) diff --git a/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt b/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt index 5a2ef9e81ce..909e3f41bed 100644 --- a/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/lambdaInValInitializerWithAnonymousFunctions.fir.kt @@ -5,5 +5,5 @@ val test2f: suspend Any.() -> Unit = fun Any.() {} // This is a bug in the old inference and should be fixed in new inference // see "Fix anonymous function literals handling in type checker" for more details -val test3f: suspend Any.(Int) -> Int = fun (k: Int) = k + 1 -val test4f: SuspendFn = fun Any.() {} +val test3f: suspend Any.(Int) -> Int = fun (k: Int) = k + 1 +val test4f: SuspendFn = fun Any.() {}