From 7d880f10ec02c9ebc492038879f6cab2f8171ebe Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 25 Jan 2016 18:06:12 +0300 Subject: [PATCH] Optimize getFqName calls in KotlinBuiltIns Check the simple name first, and only then construct the full FqName, in all 'is*' methods --- .../kotlin/builtins/KotlinBuiltIns.java | 42 ++++++++----------- .../stubBuilder/ClassClsStubBuilder.kt | 2 +- .../stubBuilder/TypeClsStubBuilder.kt | 2 +- 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 0e8afaa0642..be1f725a524 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -678,6 +678,11 @@ public abstract class KotlinBuiltIns { return TypeUtils.makeNullable(getAnyType()); } + @NotNull + public KotlinType getDefaultBound() { + return getNullableAnyType(); + } + // Primitive @NotNull @@ -992,12 +997,14 @@ public abstract class KotlinBuiltIns { return parameterTypes; } - // Recognized & special - private static boolean isConstructedFromGivenClass(@NotNull KotlinType type, @NotNull FqNameUnsafe fqName) { ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor(); - return descriptor != null && - /* quick check to avoid creation of full FqName instance */ descriptor.getName().equals(fqName.shortName()) && + return descriptor instanceof ClassDescriptor && classFqNameEquals(descriptor, fqName); + } + + private static boolean classFqNameEquals(@NotNull ClassifierDescriptor descriptor, @NotNull FqNameUnsafe fqName) { + // Quick check to avoid creation of full FqName instance + return descriptor.getName().equals(fqName.shortName()) && fqName.equals(getFqName(descriptor)); } @@ -1006,12 +1013,11 @@ public abstract class KotlinBuiltIns { } public static boolean isSpecialClassWithNoSupertypes(@NotNull ClassDescriptor descriptor) { - FqNameUnsafe fqName = getFqName(descriptor); - return FQ_NAMES.any.equals(fqName) || FQ_NAMES.nothing.equals(fqName); + return classFqNameEquals(descriptor, FQ_NAMES.any) || classFqNameEquals(descriptor, FQ_NAMES.nothing); } public static boolean isAny(@NotNull ClassDescriptor descriptor) { - return isAny(getFqName(descriptor)); + return classFqNameEquals(descriptor, FQ_NAMES.any); } public static boolean isAny(@NotNull KotlinType type) { @@ -1019,7 +1025,6 @@ public abstract class KotlinBuiltIns { } public static boolean isBoolean(@NotNull KotlinType type) { - return isConstructedFromGivenClassAndNotNullable(type, FQ_NAMES._boolean); } @@ -1028,7 +1033,7 @@ public abstract class KotlinBuiltIns { } public static boolean isBoolean(@NotNull ClassDescriptor classDescriptor) { - return FQ_NAMES._boolean.equals(getFqName(classDescriptor)); + return classFqNameEquals(classDescriptor, FQ_NAMES._boolean); } public static boolean isChar(@NotNull KotlinType type) { @@ -1063,10 +1068,6 @@ public abstract class KotlinBuiltIns { return isConstructedFromGivenClass(type, fqName) && !type.isMarkedNullable(); } - public static boolean isAny(@NotNull FqNameUnsafe fqName) { - return FQ_NAMES.any.equals(fqName); - } - public static boolean isNothing(@NotNull KotlinType type) { return isNothingOrNullableNothing(type) && !type.isMarkedNullable(); @@ -1130,15 +1131,15 @@ public abstract class KotlinBuiltIns { } public static boolean isKClass(@NotNull ClassDescriptor descriptor) { - return FQ_NAMES.kClass.equals(getFqName(descriptor)); + return classFqNameEquals(descriptor, FQ_NAMES.kClass); } public static boolean isNonPrimitiveArray(@NotNull ClassDescriptor descriptor) { - return FQ_NAMES.array.equals(getFqName(descriptor)); + return classFqNameEquals(descriptor, FQ_NAMES.array); } public static boolean isCloneable(@NotNull ClassDescriptor descriptor) { - return FQ_NAMES.cloneable.equals(getFqName(descriptor)); + return classFqNameEquals(descriptor, FQ_NAMES.cloneable); } public static boolean isDeprecated(@NotNull DeclarationDescriptor declarationDescriptor) { @@ -1173,13 +1174,4 @@ public abstract class KotlinBuiltIns { return false; } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - @NotNull - public KotlinType getDefaultBound() { - return getNullableAnyType(); - } - - } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt index 3786352dceb..4488f8a6195 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt @@ -61,7 +61,7 @@ private class ClassClsStubBuilder( private val supertypeIds = run { val supertypeIds = classProto.supertypes(c.typeTable).map { c.nameResolver.getClassId(it.className) } //empty supertype list if single supertype is Any - if (supertypeIds.singleOrNull()?.let { KotlinBuiltIns.isAny(it.asSingleFqName().toUnsafe()) } ?: false) { + if (supertypeIds.singleOrNull()?.let { KotlinBuiltIns.FQ_NAMES.any == it.asSingleFqName().toUnsafe() } ?: false) { listOf() } else { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt index c1c102ef10e..1498e3b9495 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt @@ -253,7 +253,7 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { private fun Type.isDefaultUpperBound(): Boolean { return this.hasClassName() && - c.nameResolver.getClassId(className).let { KotlinBuiltIns.isAny(it.asSingleFqName().toUnsafe()) } && + c.nameResolver.getClassId(className).let { KotlinBuiltIns.FQ_NAMES.any == it.asSingleFqName().toUnsafe() } && this.nullable } }