Properly handle AbbreviatedTypeBinding for error types. Get rid of code duplication.
This commit is contained in:
@@ -116,12 +116,9 @@ private class AbbreviatedTypeBinding(
|
|||||||
override val isInAbbreviation: Boolean get() = true
|
override val isInAbbreviation: Boolean get() = true
|
||||||
|
|
||||||
override val arguments: List<TypeArgumentBinding<KtTypeElement>?>
|
override val arguments: List<TypeArgumentBinding<KtTypeElement>?>
|
||||||
get() = type.arguments.mapIndexed { index, argument ->
|
get() = createTypeArgumentBindingsWithSinglePsiElement(type) {
|
||||||
TypeArgumentBindingImpl(
|
argumentType ->
|
||||||
argument,
|
AbbreviatedTypeBinding(argumentType, psiElement)
|
||||||
type.constructor.parameters[index],
|
|
||||||
AbbreviatedTypeBinding(argument.type, psiElement)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,16 +130,22 @@ private class NoTypeElementBinding<out P : PsiElement>(
|
|||||||
override val isInAbbreviation: Boolean get() = false
|
override val isInAbbreviation: Boolean get() = false
|
||||||
|
|
||||||
override val arguments: List<TypeArgumentBinding<P>?>
|
override val arguments: List<TypeArgumentBinding<P>?>
|
||||||
get() {
|
get() = createTypeArgumentBindingsWithSinglePsiElement(type) {
|
||||||
val isErrorBinding = type.isError || type.constructor.parameters.size != type.arguments.size
|
argumentType ->
|
||||||
return type.arguments.indices.map {
|
NoTypeElementBinding(trace, psiElement, argumentType)
|
||||||
val typeProjection = type.arguments[it]
|
|
||||||
TypeArgumentBindingImpl(
|
|
||||||
typeProjection,
|
|
||||||
if (isErrorBinding) null else type.constructor.parameters[it],
|
|
||||||
NoTypeElementBinding(trace, psiElement, typeProjection.type)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun <P : PsiElement> createTypeArgumentBindingsWithSinglePsiElement(
|
||||||
|
type: KotlinType,
|
||||||
|
createBinding: (KotlinType) -> TypeBinding<P>
|
||||||
|
) : List<TypeArgumentBinding<P>> {
|
||||||
|
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)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// https://ea.jetbrains.com/browser/ea_reports/1337846
|
||||||
|
|
||||||
|
//interface ComputablePoint<NumberType : Number>
|
||||||
|
//
|
||||||
|
//interface ComputableSegment<NumberType: Number, PointType>
|
||||||
|
//
|
||||||
|
//interface ComputableLineSegment<NumberType: Number, PointType> : ComputableSegment<NumberType, PointType>
|
||||||
|
|
||||||
|
//interface Path<NumberType, PointType, SegmentType>
|
||||||
|
|
||||||
|
typealias EachSegmentComparator<SegmentType> = (currentSegment: SegmentType, otherSegment: SegmentType, relationship: Int) -> Boolean
|
||||||
|
|
||||||
|
interface ComputablePath<NumberType, PointType, out SegmentType>
|
||||||
|
: <!UNRESOLVED_REFERENCE!>Path<!><NumberType, PointType, SegmentType>
|
||||||
|
where
|
||||||
|
NumberType: Number,
|
||||||
|
PointType: <!UNRESOLVED_REFERENCE!>ComputablePoint<!><NumberType>,
|
||||||
|
SegmentType: <!UNRESOLVED_REFERENCE!>ComputableLineSegment<!><NumberType, PointType>
|
||||||
|
{
|
||||||
|
fun anyTwoSegments(comparator: EachSegmentComparator<<!UNRESOLVED_REFERENCE!>ComputableSegment<!><NumberType, PointType>>): Boolean
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public interface ComputablePath</*0*/ NumberType : kotlin.Number, /*1*/ PointType, /*2*/ out SegmentType> {
|
||||||
|
public abstract fun anyTwoSegments(/*0*/ comparator: EachSegmentComparator<[ERROR : ComputableSegment<NumberType, PointType>]<NumberType, PointType>> /* = ([ERROR : ComputableSegment<NumberType, PointType>]<NumberType, PointType>, [ERROR : ComputableSegment<NumberType, PointType>]<NumberType, PointType>, 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</*0*/ SegmentType> = (currentSegment: SegmentType, otherSegment: SegmentType, relationship: kotlin.Int) -> kotlin.Boolean
|
||||||
@@ -22489,6 +22489,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("Function.kt")
|
||||||
public void testFunction() throws Exception {
|
public void testFunction() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/variance/Function.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/variance/Function.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user