From 5394abc83e49ea387813f6d5454c484ab2b2d0b8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 5 Jun 2015 19:07:24 +0300 Subject: [PATCH] Don't use reflection in JetType.getCapability --- .../java/lazy/types/LazyJavaTypeResolver.kt | 9 ++++--- .../inference/CapturedTypeConstructor.kt | 13 +++++++--- .../kotlin/types/AbstractJetType.java | 4 --- .../kotlin/types/DelegatingType.java | 4 --- .../jetbrains/kotlin/types/dynamicTypes.kt | 19 ++++++++------ .../jetbrains/kotlin/types/flexibleTypes.kt | 25 ++++++++++++++----- 6 files changed, 46 insertions(+), 28 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index 765dea34e8c..4d46b4913be 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -300,10 +300,11 @@ class LazyJavaTypeResolver( override val id: String get() = "kotlin.jvm.PlatformType" override fun getCapability(capabilityClass: Class, jetType: JetType, flexibility: Flexibility): T? { - if (capabilityClass.isAssignableFrom(javaClass())) - [suppress("UNCHECKED_CAST")] - return Impl(flexibility) as T - else return null + @suppress("UNCHECKED_CAST") + return when (capabilityClass) { + javaClass(), javaClass() -> Impl(flexibility) as T + else -> null + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt index 5c90ad0e594..bd13f56f4ea 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor.kt @@ -16,11 +16,12 @@ package org.jetbrains.kotlin.resolve.calls.inference -import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.types.Variance.* -import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.Variance.IN_VARIANCE +import org.jetbrains.kotlin.types.Variance.OUT_VARIANCE public class CapturedTypeConstructor( public val typeProjection: TypeProjection @@ -64,6 +65,12 @@ public class CapturedType( override fun getDelegate(): JetType = delegateType + override fun getCapability(capabilityClass: Class): T? { + @suppress("UNCHECKED_CAST") + return if (capabilityClass == javaClass()) this as T + else super.getCapability(capabilityClass) + } + override val subTypeRepresentative: JetType get() = representative(OUT_VARIANCE, KotlinBuiltIns.getInstance().getNullableAnyType()) diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java index 0c756aeef85..a1afd0e23b9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java @@ -29,10 +29,6 @@ public abstract class AbstractJetType implements JetType { @Nullable @Override public T getCapability(@NotNull Class capabilityClass) { - if (capabilityClass.isInstance(this)) { - //noinspection unchecked - return (T) this; - } return null; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java b/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java index 03d8474637e..6a0bfb27747 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java @@ -64,10 +64,6 @@ public abstract class DelegatingType implements JetType { @Override @Nullable public T getCapability(@NotNull Class capabilityClass) { - if (capabilityClass.isInstance(this)) { - //noinspection unchecked - return (T) this; - } return getDelegate().getCapability(capabilityClass); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/dynamicTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/types/dynamicTypes.kt index ef4f373b070..ac74e3173b8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/dynamicTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/dynamicTypes.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.types import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import kotlin.platform.platformStatic open class DynamicTypesSettings { open val dynamicTypesAllowed: Boolean @@ -29,7 +28,7 @@ class DynamicTypesAllowed: DynamicTypesSettings() { get() = true } -trait Dynamicity : TypeCapability +interface Dynamicity : TypeCapability // Object is created only for convenience here. Dynamic types may occur in the form of DelegatingFlexibleTypes, // which are produced by substitutions @@ -45,14 +44,20 @@ public object DynamicTypeCapabilities : FlexibleTypeCapabilities { override val id: String get() = "kotlin.DynamicType" override fun getCapability(capabilityClass: Class, jetType: JetType, flexibility: Flexibility): T? { - if (capabilityClass.isAssignableFrom(javaClass())) - [suppress("UNCHECKED_CAST")] - return Impl(flexibility) as T - else return null + @suppress("UNCHECKED_CAST") + return if (capabilityClass in Impl.capabilityClasses) Impl(flexibility) as T else null } - private class Impl(flexibility: Flexibility) : Dynamicity, Specificity, NullAwareness, FlexibleTypeDelegation { + companion object { + internal val capabilityClasses = hashSetOf( + javaClass(), + javaClass(), + javaClass(), + javaClass() + ) + } + override val delegateType: JetType = flexibility.upperBound override fun getSpecificityRelationTo(otherType: JetType): Specificity.Relation { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt index dd44594873e..779346885a8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/flexibleTypes.kt @@ -16,11 +16,10 @@ package org.jetbrains.kotlin.types -import org.jetbrains.kotlin.types.checker.JetTypeChecker -import org.jetbrains.kotlin.types.Approximation.DataFlowExtras -import org.jetbrains.kotlin.name.FqName -import kotlin.platform.platformStatic import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.types.checker.JetTypeChecker +import kotlin.platform.platformStatic public trait FlexibleTypeCapabilities { fun getCapability(capabilityClass: Class, jetType: JetType, flexibility: Flexibility): T? @@ -142,12 +141,20 @@ trait FlexibleTypeDelegation : TypeCapability { public val delegateType: JetType } -public open class DelegatingFlexibleType protected ( +public open class DelegatingFlexibleType protected constructor( override val lowerBound: JetType, override val upperBound: JetType, override val extraCapabilities: FlexibleTypeCapabilities ) : DelegatingType(), NullAwareness, Flexibility, FlexibleTypeDelegation, Approximation { companion object { + internal val capabilityClasses = hashSetOf( + javaClass(), + javaClass(), + javaClass(), + javaClass(), + javaClass() + ) + platformStatic fun create(lowerBound: JetType, upperBound: JetType, extraCapabilities: FlexibleTypeCapabilities): JetType { if (lowerBound == upperBound) return lowerBound return DelegatingFlexibleType(lowerBound, upperBound, extraCapabilities) @@ -166,7 +173,13 @@ public open class DelegatingFlexibleType protected ( } override fun getCapability(capabilityClass: Class): T? { - return extraCapabilities.getCapability(capabilityClass, this, this) ?: super.getCapability(capabilityClass) + val extra = extraCapabilities.getCapability(capabilityClass, this, this) + if (extra != null) return extra + + @suppress("UNCHECKED_CAST") + if (capabilityClass in capabilityClasses) return this as T + + return super.getCapability(capabilityClass) } override fun makeNullableAsSpecified(nullable: Boolean): JetType {