From 706ccb2cf9bfe19fa21d2b8c66d0a5349a6e76a6 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 16 Apr 2020 15:17:32 +0300 Subject: [PATCH] FIR: Adjust testData for spec tests: invoke on nullable receiver It's a design problem, see related issue ^KT-30415 --- .../resolve/problems/safeCallInvoke.kt | 13 +++ .../resolve/problems/safeCallInvoke.txt | 29 ++++++ .../fir/FirDiagnosticsTestGenerated.java | 5 + ...DiagnosticsWithLightTreeTestGenerated.java | 5 + .../p-1/pos/2.1.fir.kt | 95 +++++++++++++++++++ .../p-1/pos/2.1.fir.kt | 95 +++++++++++++++++++ 6 files changed, 242 insertions(+) create mode 100644 compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.kt create mode 100644 compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.txt create mode 100644 compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-named-parameters/p-1/pos/2.1.fir.kt create mode 100644 compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-trailing-lambda-expressions/p-1/pos/2.1.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.kt b/compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.kt new file mode 100644 index 00000000000..41859cb39b9 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.kt @@ -0,0 +1,13 @@ +class A { + operator fun invoke() {} +} + +class B { + val bar: () -> Unit = {} + val foo: A = A() +} + +fun main(b: B?) { + b?.bar() // allowed in FIR, prohibited in old FE + b?.foo() // allowed in FIR, prohibited in old FE +} diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.txt b/compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.txt new file mode 100644 index 00000000000..1da15fd89b4 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.txt @@ -0,0 +1,29 @@ +FILE: safeCallInvoke.kt + public final class A : R|kotlin/Any| { + public constructor(): R|A| { + super() + } + + public final operator fun invoke(): R|kotlin/Unit| { + } + + } + public final class B : R|kotlin/Any| { + public constructor(): R|B| { + super() + } + + public final val bar: R|() -> kotlin/Unit| = fun (): R|kotlin/Unit| { + ^ Unit + } + + public get(): R|() -> kotlin/Unit| + + public final val foo: R|A| = R|/A.A|() + public get(): R|A| + + } + public final fun main(b: R|B?|): R|kotlin/Unit| { + R|/b|?.R|/B.bar|?.R|FakeOverride|() + R|/b|?.R|/B.foo|?.R|/A.invoke|() + } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index e486b0fae4b..740632e5376 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -1643,6 +1643,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { public void testMultipleJavaClassesInOneFile() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.kt"); } + + @TestMetadata("safeCallInvoke.kt") + public void testSafeCallInvoke() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.kt"); + } } @TestMetadata("compiler/fir/analysis-tests/testData/resolve/properties") diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index d1a1cd55012..37149901e97 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -1643,6 +1643,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos public void testMultipleJavaClassesInOneFile() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.kt"); } + + @TestMetadata("safeCallInvoke.kt") + public void testSafeCallInvoke() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/problems/safeCallInvoke.kt"); + } } @TestMetadata("compiler/fir/analysis-tests/testData/resolve/properties") diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-named-parameters/p-1/pos/2.1.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-named-parameters/p-1/pos/2.1.fir.kt new file mode 100644 index 00000000000..942f6e93786 --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-named-parameters/p-1/pos/2.1.fir.kt @@ -0,0 +1,95 @@ +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNREACHABLE_CODE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION -IMPLICIT_NOTHING_RETURN_TYPE -DEBUG_INFO_LEAKING_THIS -EXTENSION_SHADOWED_BY_MEMBER +// SKIP_TXT + +/* + * KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE) + * + * SPEC VERSION: 0.1-280 + * PLACE: overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 1 -> sentence 2 + * RELEVANT PLACES: overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 3 -> sentence 1 + * overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 2 -> sentence 1 + * overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 4 -> sentence 1 + * NUMBER: 1 + * DESCRIPTION: Implicit receiver: sets of non-extension member callables, local, explicitly imported, declared in the package scope and star-imported extension callables + */ + +// TESTCASE NUMBER: 1, 2, 3, 4, 5 + +// FILE: Marker.kt +package libPackage + +class Marker { + fun foo(y: Int) = TODO() + val foo: Marker = this + operator fun invoke(x: Int) = TODO() +} + +// FILE: Tests.kt +package tests +import libPackage.Marker + +// TESTCASE NUMBER: 1 + +class Case1() { + fun Marker.foo(y: Int) = TODO() + + fun test() { + Marker().foo(y=1) + Marker().foo(x=1) + } +} + +fun case1() { + Marker().foo(y=1) + Marker().foo(x=1) +} + +// TESTCASE NUMBER: 2 +class Case2() { + fun test() { + fun Marker.foo(x:Int) = TODO() + Marker().foo(y=1) + Marker().foo(x=1) + } +} + +fun Marker.foo(x:Int) = TODO() + +fun case2() { + Marker().foo(y=1) + Marker().foo(x=1) +} + +// TESTCASE NUMBER: 3 +fun case3() { + fun Marker.foo(y:Int) = TODO() + Marker().foo(y=1) + Marker().foo(x=1) +} + +/* + * TESTCASE NUMBER: 4 + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-37391 + */ +fun case4(marker : Marker?) { + marker?.foo(y=1) + marker?.foo(x=1)> +} + + +/* + * TESTCASE NUMBER: 5 + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-37391 + */ +fun case5(marker : Marker?) { + fun bar(){ + fun Marker.foo(y:Int) = TODO() + marker?.foo(y=1) + marker?.foo(x=1) + } + marker?.foo(y=1) + marker?.foo(x=1) +} diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-trailing-lambda-expressions/p-1/pos/2.1.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-trailing-lambda-expressions/p-1/pos/2.1.fir.kt new file mode 100644 index 00000000000..9c0fba9f1ad --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/call-with-trailing-lambda-expressions/p-1/pos/2.1.fir.kt @@ -0,0 +1,95 @@ +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNREACHABLE_CODE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION -IMPLICIT_NOTHING_RETURN_TYPE -DEBUG_INFO_LEAKING_THIS -EXTENSION_SHADOWED_BY_MEMBER +// SKIP_TXT + +/* + * KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE) + * + * SPEC VERSION: 0.1-300 + * PLACE: overload-resolution, building-the-overload-candidate-set-ocs, call-with-trailing-lambda-expressions -> paragraph 1 -> sentence 2 + * RELEVANT PLACES: overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 3 -> sentence 1 + * overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 2 -> sentence 1 + * overload-resolution, building-the-overload-candidate-set-ocs, call-with-named-parameters -> paragraph 4 -> sentence 1 + * NUMBER: 1 + * DESCRIPTION: call-with-trailing-lambda-expressions,Implicit receiver: sets of non-extension member callables, local, explicitly imported, declared in the package scope and star-imported extension callables + */ + +// TESTCASE NUMBER: 1, 2, 3, 4, 5 + +// FILE: Marker.kt +package libPackage + +class Marker { + fun foo(y: () -> Int) = TODO() + val foo: Marker = this + operator fun invoke(x: () -> Int) = TODO() +} + +// FILE: Tests.kt +package tests +import libPackage.Marker + +// TESTCASE NUMBER: 1 + +class Case1() { + fun Marker.foo(y: ()->Int) = TODO() + + fun test() { + Marker().foo(y = { 1 }) + Marker().foo(x = { 1 }) + } +} + +fun case1() { + Marker().foo(y = { 1 }) + Marker().foo(x = { 1 }) +} + +// TESTCASE NUMBER: 2 +class Case2() { + fun test() { + fun Marker.foo(x: ()->Int) = TODO() + Marker().foo(y = { 1 }) + Marker().foo(x = { 1 }) + } +} + +fun Marker.foo(x: ()->Int) = TODO() + +fun case2() { + Marker().foo(y = { 1 }) + Marker().foo(x = { 1 }) +} + +// TESTCASE NUMBER: 3 +fun case3() { + fun Marker.foo(y: ()->Int) = TODO() + Marker().foo(y = { 1 }) + Marker().foo(x = { 1 }) +} + +/* + * TESTCASE NUMBER: 4 + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-37391 + */ +fun case4(marker: Marker?) { + marker?.foo(y = { 1 }) + marker?.foo(x = { 1 })> +} + + +/* + * TESTCASE NUMBER: 5 + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-37391 + */ +fun case5(marker: Marker?) { + fun bar() { + fun Marker.foo(y: ()->Int) = TODO() + marker?.foo(y = { 1 }) + marker?.foo(x = { 1 }) + } + marker?.foo(y = { 1 }) + marker?.foo(x = { 1 }) +}