Refactor and simplify functionTypes.kt and related code
Remove unused declarations, inline one-liners, optimize by using KotlinBuiltIns.isUnderKotlinPackage
This commit is contained in:
@@ -17,10 +17,10 @@
|
|||||||
package org.jetbrains.kotlin.builtins
|
package org.jetbrains.kotlin.builtins
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
|
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
|
||||||
@@ -80,6 +80,8 @@ val KotlinType.isBuiltinFunctionalType: Boolean
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun isBuiltinFunctionClass(classId: ClassId): Boolean {
|
fun isBuiltinFunctionClass(classId: ClassId): Boolean {
|
||||||
|
if (!classId.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME)) return false
|
||||||
|
|
||||||
val kind = classId.asSingleFqName().toUnsafe().getFunctionalClassKind()
|
val kind = classId.asSingleFqName().toUnsafe().getFunctionalClassKind()
|
||||||
return kind == FunctionClassDescriptor.Kind.Function ||
|
return kind == FunctionClassDescriptor.Kind.Function ||
|
||||||
kind == FunctionClassDescriptor.Kind.SuspendFunction
|
kind == FunctionClassDescriptor.Kind.SuspendFunction
|
||||||
@@ -102,27 +104,21 @@ private val KotlinType.isTypeAnnotatedWithExtensionFunctionType: Boolean
|
|||||||
* e.g. kotlin.Function1 (but NOT kotlin.reflect.KFunction1)
|
* e.g. kotlin.Function1 (but NOT kotlin.reflect.KFunction1)
|
||||||
*/
|
*/
|
||||||
fun isNumberedFunctionClassFqName(fqName: FqNameUnsafe): Boolean {
|
fun isNumberedFunctionClassFqName(fqName: FqNameUnsafe): Boolean {
|
||||||
if (!fqName.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME)) return false
|
return fqName.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME) &&
|
||||||
|
fqName.getFunctionalClassKind() == FunctionClassDescriptor.Kind.Function
|
||||||
val segments = fqName.pathSegments()
|
|
||||||
if (segments.size != 2) return false
|
|
||||||
|
|
||||||
val shortName = segments.last().asString()
|
|
||||||
return BuiltInFictitiousFunctionClassFactory.isFunctionClassName(shortName, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun DeclarationDescriptor.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
|
fun DeclarationDescriptor.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
|
||||||
if (this !is ClassDescriptor) return null
|
if (this !is ClassDescriptor) return null
|
||||||
|
if (!KotlinBuiltIns.isUnderKotlinPackage(this)) return null
|
||||||
|
|
||||||
val fqNameUnsafe = this.fqNameUnsafe
|
|
||||||
return fqNameUnsafe.getFunctionalClassKind()
|
return fqNameUnsafe.getFunctionalClassKind()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
|
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
|
||||||
if (!isSafe || isRoot) return null
|
if (!isSafe || isRoot) return null
|
||||||
val fqName = toSafe()
|
|
||||||
|
|
||||||
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(fqName.shortName().asString(), fqName.parent())
|
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(shortName().asString(), toSafe().parent())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-10
@@ -48,18 +48,10 @@ class BuiltInFictitiousFunctionClassFactory(
|
|||||||
return KindWithArity(kind, arity)
|
return KindWithArity(kind, arity)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic fun getFunctionalClassKind(className: String, packageFqName: FqName) =
|
@JvmStatic
|
||||||
|
fun getFunctionalClassKind(className: String, packageFqName: FqName) =
|
||||||
parseClassName(className, packageFqName)?.kind
|
parseClassName(className, packageFqName)?.kind
|
||||||
|
|
||||||
@JvmStatic fun getFunctionalClassArity(className: String, packageFqName: FqName) =
|
|
||||||
parseClassName(className, packageFqName)?.arity
|
|
||||||
|
|
||||||
@JvmStatic fun isFunctionClassName(className: String, packageFqName: FqName) =
|
|
||||||
getFunctionalClassKind(className, packageFqName) == Kind.Function
|
|
||||||
|
|
||||||
@JvmStatic fun isSuspendFunctionClassName(className: String, packageFqName: FqName) =
|
|
||||||
getFunctionalClassKind(className, packageFqName) == Kind.SuspendFunction
|
|
||||||
|
|
||||||
private fun toInt(s: String): Int? {
|
private fun toInt(s: String): Int? {
|
||||||
if (s.isEmpty()) return null
|
if (s.isEmpty()) return null
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,10 @@ public final class ClassId {
|
|||||||
return new FqName(packageFqName.asString() + "." + relativeClassName.asString());
|
return new FqName(packageFqName.asString() + "." + relativeClassName.asString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean startsWith(@NotNull Name segment) {
|
||||||
|
return packageFqName.startsWith(segment);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
|
* @return a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user