KT-13161 java static methods call not working for typealias

Introduce special qualifier for type aliases with member scope
containing static class members only.
This commit is contained in:
Dmitry Petrov
2016-07-27 16:42:16 +03:00
parent 5a5cd0e760
commit a08e70879f
8 changed files with 190 additions and 6 deletions
@@ -654,6 +654,10 @@ class QualifiedExpressionResolver(val classifierUsageCheckers: Iterable<Classifi
is PackageViewDescriptor -> PackageQualifier(referenceExpression, descriptor)
is ClassDescriptor -> ClassQualifier(referenceExpression, descriptor)
is TypeParameterDescriptor -> TypeParameterQualifier(referenceExpression, descriptor)
is TypeAliasDescriptor -> {
val classDescriptor = descriptor.classDescriptor ?: return null
TypeAliasQualifier(referenceExpression, descriptor, classDescriptor)
}
else -> return null
}
@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.resolve.scopes.receivers
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector
@@ -56,10 +53,12 @@ class TypeParameterQualifier(
override fun toString() = "TypeParameter{$descriptor}"
}
interface ClassifierQualifier : Qualifier
class ClassQualifier(
override val referenceExpression: KtSimpleNameExpression,
override val descriptor: ClassDescriptor
) : Qualifier {
) : ClassifierQualifier {
override val classValueReceiver: ClassValueReceiver? = descriptor.classValueType?.let {
ClassValueReceiver(this, it)
}
@@ -79,7 +78,21 @@ class ClassQualifier(
override fun toString() = "Class{$descriptor}"
}
class ClassValueReceiver(val classQualifier: ClassQualifier, private val type: KotlinType) : ExpressionReceiver {
class TypeAliasQualifier(
override val referenceExpression: KtSimpleNameExpression,
override val descriptor: TypeAliasDescriptor,
val classDescriptor: ClassDescriptor
) : ClassifierQualifier {
override val classValueReceiver: ClassValueReceiver?
get() = classDescriptor.classValueType?.let {
ClassValueReceiver(this, it)
}
override val staticScope: MemberScope
get() = classDescriptor.staticScope
}
class ClassValueReceiver(val classQualifier: ClassifierQualifier, private val type: KotlinType) : ExpressionReceiver {
override fun getType() = type
override val expression: KtExpression