diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JavaGenericVarianceViolationTypeChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JavaGenericVarianceViolationTypeChecker.kt index f022b836479..77bd262ddd2 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JavaGenericVarianceViolationTypeChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JavaGenericVarianceViolationTypeChecker.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.resolve.jvm.platform -import org.jetbrains.kotlin.load.java.lazy.types.RawTypeTag import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext @@ -52,7 +51,7 @@ object JavaGenericVarianceViolationTypeChecker : AdditionalTypeChecker { // Use site variance projection is always the same for flexible types if (lowerBound.constructor == upperBound.constructor) return // Anything is acceptable for raw types - if (expectedType.getCapability() != null) return + if (expectedType.getCapability() != null) return val correspondingSubType = TypeCheckingProcedure.findCorrespondingSupertype(expressionTypeWithSmartCast, lowerBound) ?: return diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt index b4fd3106107..c1c3174a4ad 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,10 +22,10 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.lazy.types.RawSubstitution -import org.jetbrains.kotlin.load.java.lazy.types.RawTypeTag import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition.Result import org.jetbrains.kotlin.resolve.OverridingUtil +import org.jetbrains.kotlin.types.RawTypeCapability import org.jetbrains.kotlin.types.getCapability import org.jetbrains.kotlin.utils.singletonOrEmptyList @@ -40,7 +40,7 @@ class ErasedOverridabilityCondition : ExternalOverridabilityCondition { subDescriptor.returnType!! + subDescriptor.extensionReceiverParameter?.type.singletonOrEmptyList() - if (signatureTypes.any { it.arguments.isNotEmpty() && it.getCapability() == null }) return Result.UNKNOWN + if (signatureTypes.any { it.arguments.isNotEmpty() && it.getCapability() == null }) return Result.UNKNOWN var erasedSuper = superDescriptor.substitute(RawSubstitution.buildSubstitutor()) ?: return Result.UNKNOWN diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt index b206349dd08..8db851e0a45 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt @@ -20,22 +20,18 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.load.java.components.TypeUsage -import org.jetbrains.kotlin.renderer.CustomFlexibleRendering import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.* -object RawTypeTag : TypeCapability - object RawTypeCapabilities : TypeCapabilities { - private object RawSubstitutionCapability : CustomSubstitutionCapability { + + private object Impl : RawTypeCapability { override val substitution: TypeSubstitution? get() = RawSubstitution override val substitutionToComposeWith: TypeSubstitution? get() = RawSubstitution - } - private object RawFlexibleRendering : CustomFlexibleRendering { private fun DescriptorRenderer.renderArguments(jetType: KotlinType) = jetType.arguments.map { renderTypeProjection(it) } private fun String.replaceArgs(newArgs: String): String { @@ -76,9 +72,7 @@ object RawTypeCapabilities : TypeCapabilities { override fun getCapability(capabilityClass: Class): T? { @Suppress("UNCHECKED_CAST") return when(capabilityClass) { - CustomSubstitutionCapability::class.java -> RawSubstitutionCapability as T - CustomFlexibleRendering::class.java -> RawFlexibleRendering as T - RawTypeTag::class.java -> RawTypeTag as T + RawTypeCapability::class.java -> Impl as T else -> null } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index 6c531738397..52ddeabe10c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -154,7 +154,7 @@ internal class DescriptorRendererImpl( private fun renderInflexibleType(type: KotlinType): String { assert(!type.isFlexible()) { "Flexible types not allowed here: " + renderNormalizedType(type) } - val customResult = type.getCapability()?.renderInflexible(type, this) + val customResult = type.getCapability()?.renderInflexible(type, this) if (customResult != null) return customResult if (type == CANT_INFER_FUNCTION_PARAM_TYPE || TypeUtils.isDontCarePlaceholder(type)) { @@ -183,7 +183,7 @@ internal class DescriptorRendererImpl( val lower = type.flexibility().lowerBound val upper = type.flexibility().upperBound - val (lowerRendered, upperRendered) = type.getCapability()?.renderBounds(type.flexibility(), this) + val (lowerRendered, upperRendered) = type.getCapability()?.renderBounds(type.flexibility(), this) ?: Pair(renderInflexibleType(lower), renderInflexibleType(upper)) if (differsOnlyInNullability(lowerRendered, upperRendered)) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt index c72284319b0..c021a9ea4f6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ abstract class AbstractLazyType(storageManager: StorageManager) : AbstractKotlin override fun getSubstitution() = computeCustomSubstitution() ?: TypeConstructorSubstitution.create(constructor, getArguments()) - protected open fun computeCustomSubstitution(): TypeSubstitution? = getCapability()?.substitution + protected open fun computeCustomSubstitution(): TypeSubstitution? = getCapability()?.substitution private val memberScope = storageManager.createLazyValue { computeMemberScope() } override fun getMemberScope() = memberScope() diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/CustomRendering.kt b/core/descriptors/src/org/jetbrains/kotlin/types/RawTypeCapability.kt similarity index 73% rename from core/descriptors/src/org/jetbrains/kotlin/renderer/CustomRendering.kt rename to core/descriptors/src/org/jetbrains/kotlin/types/RawTypeCapability.kt index a48b00d64a0..d783002b06b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/CustomRendering.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/RawTypeCapability.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,16 @@ * limitations under the License. */ -package org.jetbrains.kotlin.renderer +package org.jetbrains.kotlin.types -import org.jetbrains.kotlin.types.Flexibility -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.TypeCapability +import org.jetbrains.kotlin.renderer.DescriptorRenderer + +interface RawTypeCapability : TypeCapability { + + val substitution: TypeSubstitution? + val substitutionToComposeWith: TypeSubstitution? -interface CustomFlexibleRendering : TypeCapability { fun renderInflexible(type: KotlinType, renderer: DescriptorRenderer): String? fun renderBounds(flexibility: Flexibility, renderer: DescriptorRenderer): Pair? -} + +} \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt index 01c7e049acc..749fe50f683 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeCapabilities.kt @@ -84,8 +84,3 @@ fun sameTypeConstructors(first: KotlinType, second: KotlinType): Boolean { return first.getCapability(typeRangeCapability)?.sameTypeConstructor(second) ?: false || second.getCapability(typeRangeCapability)?.sameTypeConstructor(first) ?: false } - -interface CustomSubstitutionCapability : TypeCapability { - val substitution: TypeSubstitution? - val substitutionToComposeWith: TypeSubstitution? -} diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt index 93f30eea061..2d61186745e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitution.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -117,7 +117,7 @@ fun KotlinType.computeNewSubstitution( val newSubstitution = TypeConstructorSubstitution.create(typeConstructor, newArguments) // If previous substitution was trivial just replace it with indexed one - val substitutionToComposeWith = getCapability()?.substitutionToComposeWith ?: return newSubstitution + val substitutionToComposeWith = getCapability()?.substitutionToComposeWith ?: return newSubstitution val composedSubstitution = CompositeTypeSubstitution(newSubstitution, substitutionToComposeWith) return composedSubstitution