From c486fa6189470216878294880f5fb1536bdfa0d5 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 18 Dec 2019 15:26:00 +0300 Subject: [PATCH] NI: Report incompatible receiver of callable reference ^KT-35535 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 +++++ .../DiagnosticReporterByTrackingStrategy.kt | 9 +++++++-- .../components/PostponeArgumentsChecks.kt | 10 +++++++--- .../model/ConstraintPositionAndErrors.kt | 7 +++++-- ...intFromLHSWithCorrectDirectionError.fir.kt | 19 +++++++++++++++++++ ...straintFromLHSWithCorrectDirectionError.kt | 19 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 +++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++++ 8 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.fir.kt create mode 100644 compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 5fa496e087c..d0c038561e7 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -1789,6 +1789,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirection.kt"); } + @TestMetadata("constraintFromLHSWithCorrectDirectionError.kt") + public void testConstraintFromLHSWithCorrectDirectionError() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt"); + } + @TestMetadata("correctInfoAfterArrayLikeCall.kt") public void testCorrectInfoAfterArrayLikeCall() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/correctInfoAfterArrayLikeCall.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index 99b20bd515c..f94ff58b111 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -265,8 +265,13 @@ class DiagnosticReporterByTrackingStrategy( NewConstraintError::class.java -> { val constraintError = diagnostic as NewConstraintError val position = constraintError.position.from - val argument = (position as? ArgumentConstraintPosition)?.argument - ?: (position as? ReceiverConstraintPosition)?.argument + val argument = + when (position) { + is ArgumentConstraintPosition -> position.argument + is ReceiverConstraintPosition -> position.argument + is LHSArgumentConstraintPosition -> position.argument + else -> null + } argument?.let { it.safeAs()?.let lambda@{ lambda -> val parameterTypes = lambda.parametersTypes?.toList() ?: return@lambda diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt index 89bf0f48891..98122ad6cdf 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecks.kt @@ -162,7 +162,7 @@ private fun preprocessCallableReference( val lhsResult = argument.lhsResult if (lhsResult is LHSResult.Type) { - csBuilder.addConstraintFromLHS(lhsResult, expectedType) + csBuilder.addConstraintFromLHS(argument, lhsResult, expectedType) } val notCallableTypeConstructor = @@ -181,13 +181,17 @@ private fun preprocessCallableReference( return result } -private fun ConstraintSystemBuilder.addConstraintFromLHS(lhsResult: LHSResult.Type, expectedType: UnwrappedType) { +private fun ConstraintSystemBuilder.addConstraintFromLHS( + argument: CallableReferenceKotlinCallArgument, + lhsResult: LHSResult.Type, + expectedType: UnwrappedType +) { if (!ReflectionTypes.isNumberedTypeWithOneOrMoreNumber(expectedType)) return val lhsType = lhsResult.unboundDetailedReceiver.stableType val expectedTypeProjectionForLHS = expectedType.arguments.first() val expectedTypeForLHS = expectedTypeProjectionForLHS.type - val constraintPosition = LHSArgumentConstraintPosition(lhsResult.qualifier ?: lhsResult.unboundDetailedReceiver) + val constraintPosition = LHSArgumentConstraintPosition(argument, lhsResult.qualifier ?: lhsResult.unboundDetailedReceiver) when (expectedTypeProjectionForLHS.projectionKind) { Variance.INVARIANT -> addEqualityConstraint(lhsType, expectedTypeForLHS, constraintPosition) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt index 39b7ed72519..1654e4b0f0a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPositionAndErrors.kt @@ -63,7 +63,10 @@ class KnownTypeParameterConstraintPosition(val typeArgument: KotlinType) : Const override fun toString() = "TypeArgument $typeArgument" } -class LHSArgumentConstraintPosition(val receiver: DetailedReceiver) : ConstraintPosition() { +class LHSArgumentConstraintPosition( + val argument: CallableReferenceKotlinCallArgument, + val receiver: DetailedReceiver +) : ConstraintPosition() { override fun toString(): String { return "LHS receiver $receiver" } @@ -121,4 +124,4 @@ class ConstrainingTypeIsError( val typeVariable: TypeVariableMarker, val constraintType: KotlinTypeMarker, val position: IncorporationConstraintPosition -) : ConstraintSystemCallDiagnostic(INAPPLICABLE) \ No newline at end of file +) : ConstraintSystemCallDiagnostic(INAPPLICABLE) diff --git a/compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.fir.kt b/compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.fir.kt new file mode 100644 index 00000000000..467dba5dbff --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.fir.kt @@ -0,0 +1,19 @@ +// SKIP_TXT +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_PARAMETER + +package test +import kotlin.reflect.KProperty1 + +interface A { + val bla: CharSequence get() = "" +} + +class B(val x: T) +fun B.foo(p: KProperty1) {} + +class C : A + +fun B.test(){ + foo(C::bla) +} diff --git a/compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt b/compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt new file mode 100644 index 00000000000..9d3affdae3b --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt @@ -0,0 +1,19 @@ +// SKIP_TXT +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_PARAMETER + +package test +import kotlin.reflect.KProperty1 + +interface A { + val bla: CharSequence get() = "" +} + +class B(val x: T) +fun B.foo(p: KProperty1) {} + +class C : A + +fun B.test(){ + foo(C::bla) +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 20b085fad8f..1e8b20bb9de 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -1796,6 +1796,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirection.kt"); } + @TestMetadata("constraintFromLHSWithCorrectDirectionError.kt") + public void testConstraintFromLHSWithCorrectDirectionError() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt"); + } + @TestMetadata("correctInfoAfterArrayLikeCall.kt") public void testCorrectInfoAfterArrayLikeCall() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/correctInfoAfterArrayLikeCall.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 8112c44c33a..cf1d02a83f2 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -1791,6 +1791,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirection.kt"); } + @TestMetadata("constraintFromLHSWithCorrectDirectionError.kt") + public void testConstraintFromLHSWithCorrectDirectionError() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/constraintFromLHSWithCorrectDirectionError.kt"); + } + @TestMetadata("correctInfoAfterArrayLikeCall.kt") public void testCorrectInfoAfterArrayLikeCall() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/correctInfoAfterArrayLikeCall.kt");