From a4f9e46c085c8c3abaf0b97c15140df807b1dd43 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 8 Feb 2017 16:30:15 +0300 Subject: [PATCH] Fix https://ea.jetbrains.com/browser/ea_reports/1337846: Properly handle AbbreviatedTypeBinding for error types. Get rid of code duplication. --- .../jetbrains/kotlin/resolve/TypeBinding.kt | 35 ++++++++++--------- .../diagnostics/tests/variance/ea1337846.kt | 21 +++++++++++ .../diagnostics/tests/variance/ea1337846.txt | 9 +++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++ 4 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/variance/ea1337846.kt create mode 100644 compiler/testData/diagnostics/tests/variance/ea1337846.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeBinding.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeBinding.kt index fa7bb60c037..cf1c638d2ee 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeBinding.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeBinding.kt @@ -116,12 +116,9 @@ private class AbbreviatedTypeBinding( override val isInAbbreviation: Boolean get() = true override val arguments: List?> - get() = type.arguments.mapIndexed { index, argument -> - TypeArgumentBindingImpl( - argument, - type.constructor.parameters[index], - AbbreviatedTypeBinding(argument.type, psiElement) - ) + get() = createTypeArgumentBindingsWithSinglePsiElement(type) { + argumentType -> + AbbreviatedTypeBinding(argumentType, psiElement) } } @@ -133,16 +130,22 @@ private class NoTypeElementBinding( override val isInAbbreviation: Boolean get() = false override val arguments: List?> - get() { - val isErrorBinding = type.isError || type.constructor.parameters.size != type.arguments.size - return type.arguments.indices.map { - val typeProjection = type.arguments[it] - TypeArgumentBindingImpl( - typeProjection, - if (isErrorBinding) null else type.constructor.parameters[it], - NoTypeElementBinding(trace, psiElement, typeProjection.type) - ) - } + get() = createTypeArgumentBindingsWithSinglePsiElement(type) { + argumentType -> + NoTypeElementBinding(trace, psiElement, argumentType) } } +internal fun

createTypeArgumentBindingsWithSinglePsiElement( + type: KotlinType, + createBinding: (KotlinType) -> TypeBinding

+) : List> { + val isErrorBinding = type.isError || type.constructor.parameters.size != type.arguments.size + return type.arguments.mapIndexed { index, typeProjection -> + TypeArgumentBindingImpl( + typeProjection, + if (isErrorBinding) null else type.constructor.parameters[index], + createBinding(typeProjection.type) + ) + } +} diff --git a/compiler/testData/diagnostics/tests/variance/ea1337846.kt b/compiler/testData/diagnostics/tests/variance/ea1337846.kt new file mode 100644 index 00000000000..35739c8272d --- /dev/null +++ b/compiler/testData/diagnostics/tests/variance/ea1337846.kt @@ -0,0 +1,21 @@ +// https://ea.jetbrains.com/browser/ea_reports/1337846 + +//interface ComputablePoint +// +//interface ComputableSegment +// +//interface ComputableLineSegment : ComputableSegment + +//interface Path + +typealias EachSegmentComparator = (currentSegment: SegmentType, otherSegment: SegmentType, relationship: Int) -> Boolean + +interface ComputablePath + : Path +where + NumberType: Number, + PointType: ComputablePoint, + SegmentType: ComputableLineSegment +{ + fun anyTwoSegments(comparator: EachSegmentComparator<ComputableSegment>): Boolean +} diff --git a/compiler/testData/diagnostics/tests/variance/ea1337846.txt b/compiler/testData/diagnostics/tests/variance/ea1337846.txt new file mode 100644 index 00000000000..d9955784989 --- /dev/null +++ b/compiler/testData/diagnostics/tests/variance/ea1337846.txt @@ -0,0 +1,9 @@ +package + +public interface ComputablePath { + public abstract fun anyTwoSegments(/*0*/ comparator: EachSegmentComparator<[ERROR : ComputableSegment]> /* = ([ERROR : ComputableSegment], [ERROR : ComputableSegment], relationship: kotlin.Int) -> kotlin.Boolean */): kotlin.Boolean + 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 typealias EachSegmentComparator = (currentSegment: SegmentType, otherSegment: SegmentType, relationship: kotlin.Int) -> kotlin.Boolean diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 7ca2232aa64..744cd22598f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -22489,6 +22489,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("ea1337846.kt") + public void testEa1337846() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/variance/ea1337846.kt"); + doTest(fileName); + } + @TestMetadata("Function.kt") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/variance/Function.kt");