Optimize getFqName calls in KotlinBuiltIns
Check the simple name first, and only then construct the full FqName, in all 'is*' methods
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user