Don't expand types that don't contain type aliases or type parameters.

This commit is contained in:
Dmitry Petrov
2016-06-07 15:10:22 +03:00
parent cf8cbad11c
commit ef4c3bdae8
3 changed files with 21 additions and 6 deletions
@@ -112,6 +112,11 @@ class TypeAliasExpander(
recursionDepth: Int recursionDepth: Int
): TypeProjection { ): TypeProjection {
val type = originalProjection.type val type = originalProjection.type
if (!type.requiresTypeAliasExpansion()) {
return originalProjection
}
val typeConstructor = type.constructor val typeConstructor = type.constructor
val typeDescriptor = typeConstructor.declarationDescriptor val typeDescriptor = typeConstructor.declarationDescriptor
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.resolve package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
@@ -57,7 +58,16 @@ class TypeAliasExpansion private constructor(
} }
fun KotlinType.dependsOnTypeAliasParameters(): Boolean = fun KotlinType.dependsOnTypeAliasParameters(): Boolean =
TypeUtils.contains(this) { type -> TypeUtils.contains(this) {
val constructorDeclaration = type.constructor.declarationDescriptor it.constructor.declarationDescriptor?.isTypeAliasParameter() ?: false
constructorDeclaration is TypeParameterDescriptor && constructorDeclaration.containingDeclaration is TypeAliasDescriptor }
fun ClassifierDescriptor.isTypeAliasParameter(): Boolean =
this is TypeParameterDescriptor && containingDeclaration is TypeAliasDescriptor
fun KotlinType.requiresTypeAliasExpansion(): Boolean =
TypeUtils.contains(this) {
it.constructor.declarationDescriptor?.let {
it is TypeAliasDescriptor || it is TypeParameterDescriptor
}
} }
@@ -5,8 +5,8 @@ class TColl<T, C : Collection<T>>
typealias TCErr = TColl<String, <!UPPER_BOUND_VIOLATED!>Any<!>> typealias TCErr = TColl<String, <!UPPER_BOUND_VIOLATED!>Any<!>>
typealias TCErr2 = TCErr typealias TCErr2 = TCErr
fun testType1(x: <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>TCErr<!>) {} fun testType1(x: TCErr) {}
val testCtor1 = <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>TCErr()<!> val testCtor1 = <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>TCErr()<!>
fun testType2(x: <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>TCErr2<!>) {} fun testType2(x: TCErr2) {}
val testCtor2 = <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>TCErr2()<!> val testCtor2 = <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>TCErr2()<!>