Skip check variance for irrelevant classes

This commit is contained in:
Stanislav Erokhin
2014-12-05 16:00:19 +03:00
parent fced4756bb
commit d59031fdcc
6 changed files with 143 additions and 7 deletions
@@ -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)
@@ -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);
}
}