From abd1c3df26a5d6547f719333cbc67672e93c35b5 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 22 Apr 2019 14:43:22 +0300 Subject: [PATCH] [NI] Fix diagnostic reporting and unveil problem wrt captured types --- .../kotlin/fir/FirDiagnosticsSmokeTestGenerated.java | 5 +++++ .../calls/DiagnosticReporterByTrackingStrategy.kt | 9 +++++++-- .../testData/diagnostics/tests/generics/kt9203.kt | 2 +- .../capturedTypes/captureTypeOnlyOnTopLevel.kt | 4 ++-- .../noCaptureTypeErrorForNonTopLevel.kt | 4 ++-- .../topLevelCapturingInsideReturnType.kt | 12 ++++++++++++ .../topLevelCapturingInsideReturnType.txt | 12 ++++++++++++ .../tests/inference/dependantOnVariance.kt | 4 ++-- .../diagnostics/tests/j+k/collectorInference.kt | 4 ++-- .../diagnostics/tests/targetedBuiltIns/stream.kt | 2 +- .../kotlin/checkers/DiagnosticsTestGenerated.java | 5 +++++ .../javac/DiagnosticsUsingJavacTestGenerated.java | 5 +++++ 12 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt create mode 100644 compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.txt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index 15410aaa7f1..dfc8a8f4acb 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -9834,6 +9834,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok public void testStarProjectionRegression() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/starProjectionRegression.kt"); } + + @TestMetadata("topLevelCapturingInsideReturnType.kt") + public void testTopLevelCapturingInsideReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/inference/coercionToUnit") 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 2f52bace062..13617bc4857 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -230,9 +230,14 @@ class DiagnosticReporterByTrackingStrategy( } CapturedTypeFromSubtyping::class.java -> { val capturedError = diagnostic as CapturedTypeFromSubtyping - (capturedError.position as? ArgumentConstraintPosition)?.let { + val position = capturedError.position + val argumentPosition = + position.safeAs() + ?: position.safeAs()?.from.safeAs() + + argumentPosition?.let { val expression = it.argument.psiExpression ?: return - trace.report( + trace.reportDiagnosticOnce( NEW_INFERENCE_ERROR.on( expression, "Capture type from subtyping ${capturedError.constraintType} for variable ${capturedError.typeVariable}" diff --git a/compiler/testData/diagnostics/tests/generics/kt9203.kt b/compiler/testData/diagnostics/tests/generics/kt9203.kt index 83f420d2152..59e7036beaf 100644 --- a/compiler/testData/diagnostics/tests/generics/kt9203.kt +++ b/compiler/testData/diagnostics/tests/generics/kt9203.kt @@ -6,6 +6,6 @@ import java.util.stream.IntStream fun main() { val xs = IntStream.range(0, 10).mapToObj { it.toString() } - .collect(Collectors.toList()) + .collect(Collectors.toList()) xs[0] } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt index 5851510be95..bc5136a9527 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt @@ -4,7 +4,7 @@ fun foo(array: Array>): Array> = array fun test(array: Array>) { - foo(array) + foo(array) - val f: Array> = foo(array) + val f: Array> = foo(array) } diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt index 07713c2abc0..f0675fd5d5c 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/noCaptureTypeErrorForNonTopLevel.kt @@ -11,8 +11,8 @@ fun bar(b: B>, bOut: B>, bOut2: B(b) - baz(bOut) - baz(bOut) + baz(bOut) + baz(bOut) baz(bOut2) baz(bOut2) diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt new file mode 100644 index 00000000000..9253751e31a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_PARAMETER + +class Inv + +fun createInv(): Inv<*, K> = TODO() + +fun foo(i: Inv) {} + +fun foo() { + foo(createInv()) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.txt b/compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.txt new file mode 100644 index 00000000000..a730b906a3c --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.txt @@ -0,0 +1,12 @@ +package + +public fun createInv(): Inv<*, K> +public fun foo(): kotlin.Unit +public fun foo(/*0*/ i: Inv): kotlin.Unit + +public final class Inv { + public constructor Inv() + 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/testData/diagnostics/tests/inference/dependantOnVariance.kt b/compiler/testData/diagnostics/tests/inference/dependantOnVariance.kt index c8fd293dcb9..d5ecf15c639 100644 --- a/compiler/testData/diagnostics/tests/inference/dependantOnVariance.kt +++ b/compiler/testData/diagnostics/tests/inference/dependantOnVariance.kt @@ -59,9 +59,9 @@ fun test1(int: Int, any: Any) { writeToMyList(getMyListToWriteTo(any), int) writeToMyList(getMyListToWriteTo(int), any) - readFromMyList(getMyListToWriteTo(any), any) + readFromMyList(getMyListToWriteTo(any), any) - writeToMyList(getMyListToReadFrom(any), any) + writeToMyList(getMyListToReadFrom(any), any) use(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) } diff --git a/compiler/testData/diagnostics/tests/j+k/collectorInference.kt b/compiler/testData/diagnostics/tests/j+k/collectorInference.kt index 75e51dc97ec..4a1f9d84032 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectorInference.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectorInference.kt @@ -7,8 +7,8 @@ import java.util.stream.Collectors import java.util.stream.Stream fun test(a: Stream) { - a.collect(Collectors.toList()) checkType { _>() } + a.collect(Collectors.toList()) checkType { _>() } // actually the inferred type is platform - a.collect(Collectors.toList()) checkType { _>() } + a.collect(Collectors.toList()) checkType { _>() } } diff --git a/compiler/testData/diagnostics/tests/targetedBuiltIns/stream.kt b/compiler/testData/diagnostics/tests/targetedBuiltIns/stream.kt index 678abf38109..54fec7231f7 100644 --- a/compiler/testData/diagnostics/tests/targetedBuiltIns/stream.kt +++ b/compiler/testData/diagnostics/tests/targetedBuiltIns/stream.kt @@ -8,6 +8,6 @@ interface A : Collection { } fun foo(x: List, y: A) { - x.stream().filter { it.length > 0 }.collect(Collectors.toList()) + x.stream().filter { it.length > 0 }.collect(Collectors.toList()) y.stream().filter { it.length > 0 } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 5c1bf4d2821..474daf8ae0f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -9841,6 +9841,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { public void testStarProjectionRegression() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/starProjectionRegression.kt"); } + + @TestMetadata("topLevelCapturingInsideReturnType.kt") + public void testTopLevelCapturingInsideReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/inference/coercionToUnit") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index ce4550438a2..cf2b8542350 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -9836,6 +9836,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing public void testStarProjectionRegression() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/starProjectionRegression.kt"); } + + @TestMetadata("topLevelCapturingInsideReturnType.kt") + public void testTopLevelCapturingInsideReturnType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/topLevelCapturingInsideReturnType.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/inference/coercionToUnit")