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 arguments: List<TypeArgumentBinding<KtTypeElement>?>
|
||||
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<out P : PsiElement>(
|
||||
override val isInAbbreviation: Boolean get() = false
|
||||
|
||||
override val arguments: List<TypeArgumentBinding<P>?>
|
||||
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 <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);
|
||||
}
|
||||
|
||||
@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");
|
||||
|
||||
Reference in New Issue
Block a user