Skip check variance for irrelevant classes
This commit is contained in:
@@ -89,7 +89,7 @@ class VarianceChecker(private val trace: BindingTrace) {
|
||||
|
||||
class object {
|
||||
platformStatic fun recordPrivateToThisIfNeeded(trace: BindingTrace, descriptor: CallableMemberDescriptor) {
|
||||
if (descriptor.getVisibility() != Visibilities.PRIVATE) return
|
||||
if (isIrrelevant(descriptor) || descriptor.getVisibility() != Visibilities.PRIVATE) return
|
||||
|
||||
val psiElement = descriptor.getSource().getPsi()
|
||||
if (psiElement !is JetCallableDeclaration) return
|
||||
@@ -99,7 +99,14 @@ class VarianceChecker(private val trace: BindingTrace) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun recordPrivateToThis(descriptor: CallableDescriptor) {
|
||||
private fun isIrrelevant(descriptor: CallableDescriptor): Boolean {
|
||||
val containingClass = descriptor.getContainingDeclaration()
|
||||
if (containingClass !is ClassDescriptor) return true
|
||||
|
||||
return containingClass.getTypeConstructor().getParameters().all { it.getVariance() == INVARIANT }
|
||||
}
|
||||
|
||||
private fun recordPrivateToThis(descriptor: CallableMemberDescriptor) {
|
||||
if (descriptor is FunctionDescriptorImpl) {
|
||||
descriptor.setVisibility(Visibilities.PRIVATE_TO_THIS);
|
||||
}
|
||||
@@ -120,7 +127,7 @@ class VarianceChecker(private val trace: BindingTrace) {
|
||||
descriptor: CallableDescriptor,
|
||||
diagnosticSink: DiagnosticSink
|
||||
): Boolean {
|
||||
if (descriptor.getContainingDeclaration() !is ClassDescriptor) return true
|
||||
if (isIrrelevant(descriptor)) return true
|
||||
var noError = true
|
||||
|
||||
noError = noError and declaration.checkTypeParameters(trace, IN_VARIANCE, diagnosticSink)
|
||||
|
||||
+1
-1
@@ -185,7 +185,7 @@ public open class LazyClassMemberScope(resolveSession: ResolveSession,
|
||||
if (descriptor.getKind() != FAKE_OVERRIDE && descriptor.getKind() != DELEGATION) {
|
||||
OverridingUtil.resolveUnknownVisibilityForMember(descriptor, OverrideResolver.createCannotInferVisibilityReporter(trace))
|
||||
}
|
||||
// VarianceChecker.recordPrivateToThisIfNeeded(trace, descriptor); todo make visibility lazy and enable
|
||||
VarianceChecker.recordPrivateToThisIfNeeded(trace, descriptor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,4 +11,65 @@ class Test(foo: Any?, bar: Any?) {
|
||||
fun bar(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
private fun bar2() = bar2(1)
|
||||
private fun bar2(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
}
|
||||
|
||||
// KT-6413 Typechecker recursive problem when class have non-invariant generic parameters
|
||||
class Test2<A, B, C>(foo: Any?, bar: Any?) {
|
||||
val foo = foo ?: this
|
||||
private val bar = bar ?: this
|
||||
private val bas = bas()
|
||||
val bas2 = bas2()
|
||||
|
||||
private fun bas(): Int = null!!
|
||||
private fun bas2(): Int = null!!
|
||||
|
||||
fun bar() = bar(1)
|
||||
fun bar(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
private fun bar2() = bar2(1)
|
||||
private fun bar2(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
}
|
||||
|
||||
class Test3<in A, B, C>(foo: Any?, bar: Any?) {
|
||||
val foo = foo ?: this
|
||||
private val bar = bar ?: this
|
||||
private val bas = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!><!DEBUG_INFO_MISSING_UNRESOLVED!>bas<!>()<!>
|
||||
val bas2 = bas2()
|
||||
|
||||
private fun bas(): Int = null!!
|
||||
private fun bas2(): Int = null!!
|
||||
|
||||
fun bar() = bar(1)
|
||||
fun bar(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
private fun bar2() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!><!DEBUG_INFO_MISSING_UNRESOLVED!>bar2<!>(1)<!>
|
||||
private fun bar2(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
}
|
||||
|
||||
class Test4<A, out B, C>(foo: Any?, bar: Any?) {
|
||||
val foo = foo ?: this
|
||||
private val bar = bar ?: this
|
||||
private val bas = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!><!DEBUG_INFO_MISSING_UNRESOLVED!>bas<!>()<!>
|
||||
val bas2 = bas2()
|
||||
|
||||
private fun bas(): Int = null!!
|
||||
private fun bas2(): Int = null!!
|
||||
|
||||
fun bar() = bar(1)
|
||||
fun bar(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
private fun bar2() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!><!DEBUG_INFO_MISSING_UNRESOLVED!>bar2<!>(1)<!>
|
||||
private fun bar2(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
}
|
||||
|
||||
class Test5<A, out B, C>(foo: Any?, bar: Any?) {
|
||||
val foo = foo ?: this
|
||||
private val bar = bar ?: this
|
||||
private val bas: Int = bas()
|
||||
val bas2 = bas2()
|
||||
|
||||
private fun bas(): Int = null!!
|
||||
private fun bas2(): Int = null!!
|
||||
|
||||
fun bar() = bar(1)
|
||||
fun bar(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
private fun bar2(): Int = bar2(1)
|
||||
private fun bar2(<!UNUSED_PARAMETER!>i<!>: Int) = 2
|
||||
}
|
||||
@@ -16,3 +16,71 @@ internal final class Test {
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class Test2</*0*/ A, /*1*/ B, /*2*/ C> {
|
||||
public constructor Test2</*0*/ A, /*1*/ B, /*2*/ C>(/*0*/ foo: kotlin.Any?, /*1*/ bar: kotlin.Any?)
|
||||
private final val bar: kotlin.Any
|
||||
private final val bas: kotlin.Int
|
||||
internal final val bas2: kotlin.Int
|
||||
internal final val foo: kotlin.Any
|
||||
internal final fun bar(): kotlin.Int
|
||||
internal final fun bar(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bar2(): kotlin.Int
|
||||
private final fun bar2(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bas(): kotlin.Int
|
||||
private final fun bas2(): kotlin.Int
|
||||
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
|
||||
}
|
||||
|
||||
internal final class Test3</*0*/ in A, /*1*/ B, /*2*/ C> {
|
||||
public constructor Test3</*0*/ in A, /*1*/ B, /*2*/ C>(/*0*/ foo: kotlin.Any?, /*1*/ bar: kotlin.Any?)
|
||||
private final val bar: kotlin.Any
|
||||
private final val bas: [ERROR : Type for bas()]
|
||||
internal final val bas2: kotlin.Int
|
||||
internal final val foo: kotlin.Any
|
||||
internal final fun bar(): kotlin.Int
|
||||
internal final fun bar(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bar2(): [ERROR : Error function type]
|
||||
private final fun bar2(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bas(): kotlin.Int
|
||||
private final fun bas2(): kotlin.Int
|
||||
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
|
||||
}
|
||||
|
||||
internal final class Test4</*0*/ A, /*1*/ out B, /*2*/ C> {
|
||||
public constructor Test4</*0*/ A, /*1*/ out B, /*2*/ C>(/*0*/ foo: kotlin.Any?, /*1*/ bar: kotlin.Any?)
|
||||
private final val bar: kotlin.Any
|
||||
private final val bas: [ERROR : Type for bas()]
|
||||
internal final val bas2: kotlin.Int
|
||||
internal final val foo: kotlin.Any
|
||||
internal final fun bar(): kotlin.Int
|
||||
internal final fun bar(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bar2(): [ERROR : Error function type]
|
||||
private final fun bar2(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bas(): kotlin.Int
|
||||
private final fun bas2(): kotlin.Int
|
||||
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
|
||||
}
|
||||
|
||||
internal final class Test5</*0*/ A, /*1*/ out B, /*2*/ C> {
|
||||
public constructor Test5</*0*/ A, /*1*/ out B, /*2*/ C>(/*0*/ foo: kotlin.Any?, /*1*/ bar: kotlin.Any?)
|
||||
private final val bar: kotlin.Any
|
||||
private final val bas: kotlin.Int
|
||||
internal final val bas2: kotlin.Int
|
||||
internal final val foo: kotlin.Any
|
||||
internal final fun bar(): kotlin.Int
|
||||
internal final fun bar(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bar2(): kotlin.Int
|
||||
private final fun bar2(/*0*/ i: kotlin.Int): kotlin.Int
|
||||
private final fun bas(): kotlin.Int
|
||||
private final fun bas2(): kotlin.Int
|
||||
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
|
||||
}
|
||||
|
||||
@@ -18,10 +18,10 @@ class Test2 {
|
||||
{
|
||||
<!UNINITIALIZED_VARIABLE, DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> 1
|
||||
}
|
||||
val x = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, UNINITIALIZED_VARIABLE!>b<!>
|
||||
val x = <!UNINITIALIZED_VARIABLE, DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>
|
||||
val y = 1
|
||||
}
|
||||
|
||||
val b = a.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>x<!>
|
||||
val b = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>x<!>
|
||||
val c = a.y
|
||||
}
|
||||
@@ -28,7 +28,7 @@ internal final class Test {
|
||||
internal final class Test2 {
|
||||
public constructor Test2()
|
||||
private final val a: Test2.<init>.<no name provided>
|
||||
internal final val b: [ERROR : Type for b]
|
||||
internal final val b: [ERROR : <ERROR PROPERTY TYPE>]
|
||||
internal final val c: kotlin.Int = 1
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
|
||||
Reference in New Issue
Block a user