From 3b892fe31ed2217be87d595c3a83d4e7ce2fa2fc Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Thu, 19 Mar 2020 14:55:46 +0300 Subject: [PATCH] NI: exclude reporting of an unsafe call diagnostic for implicit invoke after safe call in cases when `invoke` has type parameters (make NI and OI consistent) ^KT-37579 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 + .../calls/components/ResolutionParts.kt | 2 +- .../invoke/implicitInvokeAfterSafeCall.fir.kt | 140 +++++++++++ .../invoke/implicitInvokeAfterSafeCall.kt | 140 +++++++++++ .../invoke/implicitInvokeAfterSafeCall.txt | 229 ++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 + .../DiagnosticsUsingJavacTestGenerated.java | 5 + 7 files changed, 525 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.fir.kt create mode 100644 compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt create mode 100644 compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.txt diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index e8884bfce29..857d8acdf99 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -18790,6 +18790,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/resolve/invoke/implicitInvoke.kt"); } + @TestMetadata("implicitInvokeAfterSafeCall.kt") + public void testImplicitInvokeAfterSafeCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt"); + } + @TestMetadata("invokeAndSmartCast.kt") public void testInvokeAndSmartCast() throws Exception { runTest("compiler/testData/diagnostics/tests/resolve/invoke/invokeAndSmartCast.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index dc3a83a08aa..d5a94044b95 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -486,7 +486,7 @@ private fun KotlinResolutionCandidate.checkUnsafeImplicitInvokeAfterSafeCall(arg } } ?: error("Receiver kind does not match receiver argument") - if (receiverArgument.isSafeCall && receiverArgument.receiver.stableType.isNullable()) { + if (receiverArgument.isSafeCall && receiverArgument.receiver.stableType.isNullable() && resolvedCall.candidateDescriptor.typeParameters.isEmpty()) { addDiagnostic(UnsafeCallError(argument, isForImplicitInvoke = true)) return ImplicitInvokeCheckStatus.UNSAFE_INVOKE_REPORTED } diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.fir.kt b/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.fir.kt new file mode 100644 index 00000000000..cafa9a5dd7f --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.fir.kt @@ -0,0 +1,140 @@ +// !WITH_NEW_INFERENCE +// !DIAGNOSTICS: -UNUSED_PARAMETER + +// Test case 1: additional receiver, generic invoke + +class Foo1 +class Bar1(val value: Foo1) + +class Another1 { + operator fun Foo1.invoke(handler: () -> Unit) {} +} + +fun Another1.main(x: Bar1?) { + x?.value {} + x?.value.invoke({}) +} + +// Test case 2: additional receiver, non-generic invoke + +class Foo2 +class Bar2(val value: Foo2) + +class Another2 { + operator fun Foo2.invoke(x: Int) {} +} + +fun Another2.main(x: Bar2?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 3: additional generic receiver, generic invoke + +class Foo3 +class Bar3(val value: Foo3) + +class Another3 { + operator fun Foo3.invoke(x: Int) {} +} + +fun Another3.main(x: Bar3?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 4: additional receiver, generic invoke with nullable receiver + +class Foo4 +class Bar4(val value: Foo4) + +class Another4 { + operator fun Foo4?.invoke(x: Int) {} +} + +fun Another4.main(x: Bar4?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 5: additional receiver, generic invoke without using a type parameter inside a recevier + +class Foo5 +class Bar5(val value: Foo5) + +class Another5 { + operator fun Foo5.invoke(handler: T) {} +} + +fun Another5.main(x: Bar5?) { + x?.value {} + x?.value.invoke({}) +} + +// Test case 6: top-level generic invoke + +class Foo6 +class Bar6(val value: Foo6) + +operator fun Foo6.invoke(x: Int) {} + +fun main(x: Bar6?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 7: top-level generic invoke and invoke with compatible additional dispatch recevier + +class Foo7 +class Bar7(val value: Foo7) + +class Another7 { + operator fun Foo7.invoke(x: Int) {} +} + +operator fun Foo7.invoke(x: Int) {} + +fun Another7.main(x: Bar7?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 8: top-level non-generic invoke + +class Foo8 +class Bar8(val value: Foo8) + +operator fun Foo8.invoke(x: Int) {} + +fun main(x: Bar8?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 9: additional receiver, generic invoke with pure type perameter receiver + +class Foo9 +class Bar9(val value: Foo9) + +class Another9 { + operator fun T.invoke(handler: () -> Unit) {} +} + +fun Another9.main(x: Bar9?) { + x?.value {} + x?.value.invoke({}) +} + +// Test case 10: additional receiver, generic invoke with upper bound + +class Foo10 +class Bar10(val value: Foo10) + +class Another10 { + operator fun Foo10.invoke(handler: () -> Unit) {} +} + +fun Another10.main(x: Bar10?) { + x?.value {} + x?.value.invoke({}) +} diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt b/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt new file mode 100644 index 00000000000..f84dc1d32da --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt @@ -0,0 +1,140 @@ +// !WITH_NEW_INFERENCE +// !DIAGNOSTICS: -UNUSED_PARAMETER + +// Test case 1: additional receiver, generic invoke + +class Foo1 +class Bar1(val value: Foo1) + +class Another1 { + operator fun Foo1.invoke(handler: () -> Unit) {} +} + +fun Another1.main(x: Bar1?) { + x?.value {} + x?.value.invoke({}) +} + +// Test case 2: additional receiver, non-generic invoke + +class Foo2 +class Bar2(val value: Foo2) + +class Another2 { + operator fun Foo2.invoke(x: Int) {} +} + +fun Another2.main(x: Bar2?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 3: additional generic receiver, generic invoke + +class Foo3 +class Bar3(val value: Foo3) + +class Another3 { + operator fun Foo3.invoke(x: Int) {} +} + +fun Another3.main(x: Bar3?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 4: additional receiver, generic invoke with nullable receiver + +class Foo4 +class Bar4(val value: Foo4) + +class Another4 { + operator fun Foo4?.invoke(x: Int) {} +} + +fun Another4.main(x: Bar4?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 5: additional receiver, generic invoke without using a type parameter inside a recevier + +class Foo5 +class Bar5(val value: Foo5) + +class Another5 { + operator fun Foo5.invoke(handler: T) {} +} + +fun Another5.main(x: Bar5?) { + x?.value {} + x?.value.invoke({}) +} + +// Test case 6: top-level generic invoke + +class Foo6 +class Bar6(val value: Foo6) + +operator fun Foo6.invoke(x: Int) {} + +fun main(x: Bar6?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 7: top-level generic invoke and invoke with compatible additional dispatch recevier + +class Foo7 +class Bar7(val value: Foo7) + +class Another7 { + operator fun Foo7.invoke(x: Int) {} +} + +operator fun Foo7.invoke(x: Int) {} + +fun Another7.main(x: Bar7?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 8: top-level non-generic invoke + +class Foo8 +class Bar8(val value: Foo8) + +operator fun Foo8.invoke(x: Int) {} + +fun main(x: Bar8?) { + x?.value(1) + x?.value.invoke(1) +} + +// Test case 9: additional receiver, generic invoke with pure type perameter receiver + +class Foo9 +class Bar9(val value: Foo9) + +class Another9 { + operator fun T.invoke(handler: () -> Unit) {} +} + +fun Another9.main(x: Bar9?) { + x?.value {} + x?.value.invoke({}) +} + +// Test case 10: additional receiver, generic invoke with upper bound + +class Foo10 +class Bar10(val value: Foo10) + +class Another10 { + operator fun Foo10.invoke(handler: () -> Unit) {} +} + +fun Another10.main(x: Bar10?) { + x?.value {} + x?.value.invoke({}) +} diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.txt b/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.txt new file mode 100644 index 00000000000..03769d2a40a --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.txt @@ -0,0 +1,229 @@ +package + +public fun main(/*0*/ x: Bar6?): kotlin.Unit +public fun main(/*0*/ x: Bar8?): kotlin.Unit +public operator fun Foo6.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +public operator fun Foo7.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +public operator fun Foo8.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +public fun Another1.main(/*0*/ x: Bar1?): kotlin.Unit +public fun Another10.main(/*0*/ x: Bar10?): kotlin.Unit +public fun Another2.main(/*0*/ x: Bar2?): kotlin.Unit +public fun Another3.main(/*0*/ x: Bar3?): kotlin.Unit +public fun Another4.main(/*0*/ x: Bar4?): kotlin.Unit +public fun Another5.main(/*0*/ x: Bar5?): kotlin.Unit +public fun Another7.main(/*0*/ x: Bar7?): kotlin.Unit +public fun Another9.main(/*0*/ x: Bar9?): kotlin.Unit + +public final class Another1 { + public constructor Another1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo1.invoke(/*0*/ handler: () -> kotlin.Unit): kotlin.Unit +} + +public final class Another10 { + public constructor Another10() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo10.invoke(/*0*/ handler: () -> kotlin.Unit): kotlin.Unit +} + +public final class Another2 { + public constructor Another2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo2.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +} + +public final class Another3 { + public constructor Another3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo3.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +} + +public final class Another4 { + public constructor Another4() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo4?.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +} + +public final class Another5 { + public constructor Another5() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo5.invoke(/*0*/ handler: T): kotlin.Unit +} + +public final class Another7 { + public constructor Another7() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun Foo7.invoke(/*0*/ x: kotlin.Int): kotlin.Unit +} + +public final class Another9 { + public constructor Another9() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final operator fun T.invoke(/*0*/ handler: () -> kotlin.Unit): kotlin.Unit +} + +public final class Bar1 { + public constructor Bar1(/*0*/ value: Foo1) + public final val value: Foo1 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar10 { + public constructor Bar10(/*0*/ value: Foo10) + public final val value: Foo10 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar2 { + public constructor Bar2(/*0*/ value: Foo2) + public final val value: Foo2 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar3 { + public constructor Bar3(/*0*/ value: Foo3) + public final val value: Foo3 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar4 { + public constructor Bar4(/*0*/ value: Foo4) + public final val value: Foo4 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar5 { + public constructor Bar5(/*0*/ value: Foo5) + public final val value: Foo5 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar6 { + public constructor Bar6(/*0*/ value: Foo6) + public final val value: Foo6 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar7 { + public constructor Bar7(/*0*/ value: Foo7) + public final val value: Foo7 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar8 { + public constructor Bar8(/*0*/ value: Foo8) + public final val value: Foo8 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Bar9 { + public constructor Bar9(/*0*/ value: Foo9) + public final val value: Foo9 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo1 { + public constructor Foo1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo10 { + public constructor Foo10() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo2 { + public constructor Foo2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo3 { + public constructor Foo3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo4 { + public constructor Foo4() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo5 { + public constructor Foo5() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo6 { + public constructor Foo6() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo7 { + public constructor Foo7() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo8 { + public constructor Foo8() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo9 { + public constructor Foo9() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 25e77c8bc9c..41067439744 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -18802,6 +18802,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/resolve/invoke/implicitInvoke.kt"); } + @TestMetadata("implicitInvokeAfterSafeCall.kt") + public void testImplicitInvokeAfterSafeCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt"); + } + @TestMetadata("invokeAndSmartCast.kt") public void testInvokeAndSmartCast() throws Exception { runTest("compiler/testData/diagnostics/tests/resolve/invoke/invokeAndSmartCast.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 10ed4fedbf0..209d7a8e77f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -18792,6 +18792,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/resolve/invoke/implicitInvoke.kt"); } + @TestMetadata("implicitInvokeAfterSafeCall.kt") + public void testImplicitInvokeAfterSafeCall() throws Exception { + runTest("compiler/testData/diagnostics/tests/resolve/invoke/implicitInvokeAfterSafeCall.kt"); + } + @TestMetadata("invokeAndSmartCast.kt") public void testInvokeAndSmartCast() throws Exception { runTest("compiler/testData/diagnostics/tests/resolve/invoke/invokeAndSmartCast.kt");