From 5a25ba199aa2dbb61ec8670f458695d3641a7af1 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 20 Jun 2017 19:33:22 +0300 Subject: [PATCH] Micro optimization to avoid computing class FQ name when not necessary KotlinBuiltIns.isConstructedFromGivenClass checks the simple name of the class first, and only computes the full FQ name if it matches the last segment of the expected FQ name --- .../src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java | 4 ++++ .../src/org/jetbrains/kotlin/types/TypeUtils.kt | 7 +------ .../ConvertTwoComparisonsToRangeCheckIntention.kt | 4 +--- .../kotlin/js/translate/context/StaticContext.java | 2 +- .../translate/initializer/ClassInitializerTranslator.java | 3 +-- .../factories/ExceptionPropertyIntrinsicFactory.kt | 4 ++-- .../factories/ThrowableConstructorIntrinsicFactory.kt | 5 ++--- .../kotlin/js/translate/utils/JsDescriptorUtils.java | 2 +- 8 files changed, 13 insertions(+), 18 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index a0529d2458a..21f4f64629b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -1082,6 +1082,10 @@ public abstract class KotlinBuiltIns { return isConstructedFromGivenClass(type, FQ_NAMES.iterable); } + public static boolean isThrowableOrNullableThrowable(@NotNull KotlinType type) { + return isConstructedFromGivenClass(type, FQ_NAMES.throwable); + } + public static boolean isKClass(@NotNull ClassDescriptor descriptor) { return classFqNameEquals(descriptor, FQ_NAMES.kClass); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt index 87a88878199..1fd42cb646e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt @@ -19,10 +19,8 @@ package org.jetbrains.kotlin.types.typeUtil import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.inference.isCaptured -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import java.util.* @@ -58,10 +56,7 @@ fun KotlinType.isNullableAny(): Boolean = KotlinBuiltIns.isNullableAny(this) fun KotlinType.isBoolean(): Boolean = KotlinBuiltIns.isBoolean(this) fun KotlinType.isPrimitiveNumberType(): Boolean = KotlinBuiltIns.isPrimitiveType(this) && !isBoolean() fun KotlinType.isBooleanOrNullableBoolean(): Boolean = KotlinBuiltIns.isBooleanOrNullableBoolean(this) -fun KotlinType.isThrowable(): Boolean = isConstructedFromClassWithGivenFqName(KotlinBuiltIns.FQ_NAMES.throwable) && !isMarkedNullable - -fun KotlinType.isConstructedFromClassWithGivenFqName(fqName: FqName) = - (constructor.declarationDescriptor as? ClassDescriptor)?.fqNameUnsafe == fqName.toUnsafe() +fun KotlinType.isNotNullThrowable(): Boolean = KotlinBuiltIns.isThrowableOrNullableThrowable(this) && !isMarkedNullable fun KotlinType.isTypeParameter(): Boolean = TypeUtils.isTypeParameter(this) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTwoComparisonsToRangeCheckIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTwoComparisonsToRangeCheckIntention.kt index 128e697e2f7..2115ea1bae5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTwoComparisonsToRangeCheckIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTwoComparisonsToRangeCheckIntention.kt @@ -30,8 +30,6 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.builtIns -import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes -import org.jetbrains.kotlin.types.typeUtil.isConstructedFromClassWithGivenFqName import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberType class ConvertTwoComparisonsToRangeCheckInspection : IntentionBasedInspection( @@ -189,4 +187,4 @@ class ConvertTwoComparisonsToRangeCheckIntention : SelfTargetingOffsetIndependen this ?: return false return this.isInteger()|| KotlinBuiltIns.isChar(this) } -} \ No newline at end of file +} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index efc923cf32f..75105bc57f5 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -270,7 +270,7 @@ public final class StaticContext { else if (FunctionTypesKt.isBuiltinFunctionalType(type)) { return pureFqn("Function", null); } - else if (TypeUtilsKt.isThrowable(classDescriptor.getDefaultType())) { + else if (TypeUtilsKt.isNotNullThrowable(classDescriptor.getDefaultType())) { return pureFqn("Error", null); } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index 7e2b4616324..48f45696563 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -49,7 +49,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; -import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt; import java.util.ArrayList; import java.util.Arrays; @@ -288,7 +287,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { if (KotlinBuiltIns.isStringOrNullableString(param.getType())) { messageArgument = context.cacheExpressionIfNeeded(jsValue); } - else if (TypeUtilsKt.isConstructedFromClassWithGivenFqName(param.getType(), KotlinBuiltIns.FQ_NAMES.throwable)) { + else if (KotlinBuiltIns.isThrowableOrNullableThrowable(param.getType())) { causeArgument = context.cacheExpressionIfNeeded(jsValue); } else { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ExceptionPropertyIntrinsicFactory.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ExceptionPropertyIntrinsicFactory.kt index 11a65eec9a9..cde479bb080 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ExceptionPropertyIntrinsicFactory.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ExceptionPropertyIntrinsicFactory.kt @@ -28,13 +28,13 @@ import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntri import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.receivers.SuperCallReceiverValue -import org.jetbrains.kotlin.types.typeUtil.isThrowable +import org.jetbrains.kotlin.types.typeUtil.isNotNullThrowable object ExceptionPropertyIntrinsicFactory : FunctionIntrinsicFactory { override fun getIntrinsic(descriptor: FunctionDescriptor): FunctionIntrinsic? { if (descriptor !is PropertyGetterDescriptor) return null val classDescriptor = descriptor.correspondingProperty.containingDeclaration as? ClassDescriptor ?: return null - if (!classDescriptor.defaultType.isThrowable()) return null + if (!classDescriptor.defaultType.isNotNullThrowable()) return null return Intrinsic } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ThrowableConstructorIntrinsicFactory.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ThrowableConstructorIntrinsicFactory.kt index 9ee2d680b76..aca1828e208 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ThrowableConstructorIntrinsicFactory.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/ThrowableConstructorIntrinsicFactory.kt @@ -21,19 +21,18 @@ import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.js.backend.ast.JsExpression import org.jetbrains.kotlin.js.backend.ast.JsInvocation -import org.jetbrains.kotlin.js.backend.ast.JsLiteral import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.types.typeUtil.isThrowable +import org.jetbrains.kotlin.types.typeUtil.isNotNullThrowable object ThrowableConstructorIntrinsicFactory : FunctionIntrinsicFactory { override fun getIntrinsic(descriptor: FunctionDescriptor): FunctionIntrinsic? { if (descriptor !is ConstructorDescriptor) return null - if (!descriptor.constructedClass.defaultType.isThrowable()) return null + if (!descriptor.constructedClass.defaultType.isNotNullThrowable()) return null return Intrinsic } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java index 9ba2c1c98d8..ad1e2966050 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java @@ -185,7 +185,7 @@ public final class JsDescriptorUtils { public static boolean isImmediateSubtypeOfError(@NotNull ClassDescriptor descriptor) { if (!isExceptionClass(descriptor)) return false; ClassDescriptor superClass = DescriptorUtilsKt.getSuperClassOrAny(descriptor); - return TypeUtilsKt.isThrowable(superClass.getDefaultType()) || AnnotationsUtils.isNativeObject(superClass); + return TypeUtilsKt.isNotNullThrowable(superClass.getDefaultType()) || AnnotationsUtils.isNativeObject(superClass); } public static boolean isExceptionClass(@NotNull ClassDescriptor descriptor) {