Properly handle AbbreviatedTypeBinding for error types.
Get rid of code duplication.
This commit is contained in:
Dmitry Petrov
2017-02-08 16:30:15 +03:00
parent b1e2db21d3
commit a4f9e46c08
4 changed files with 55 additions and 16 deletions
@@ -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");