Refactor and simplify functionTypes.kt and related code

Remove unused declarations, inline one-liners, optimize by using
KotlinBuiltIns.isUnderKotlinPackage
This commit is contained in:
Alexander Udalov
2017-06-20 20:01:01 +03:00
parent 5a25ba199a
commit 4e51448b66
3 changed files with 14 additions and 22 deletions
@@ -17,10 +17,10 @@
package org.jetbrains.kotlin.builtins
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
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.Annotations
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
@@ -80,6 +80,8 @@ val KotlinType.isBuiltinFunctionalType: Boolean
}
fun isBuiltinFunctionClass(classId: ClassId): Boolean {
if (!classId.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME)) return false
val kind = classId.asSingleFqName().toUnsafe().getFunctionalClassKind()
return kind == FunctionClassDescriptor.Kind.Function ||
kind == FunctionClassDescriptor.Kind.SuspendFunction
@@ -102,27 +104,21 @@ private val KotlinType.isTypeAnnotatedWithExtensionFunctionType: Boolean
* e.g. kotlin.Function1 (but NOT kotlin.reflect.KFunction1)
*/
fun isNumberedFunctionClassFqName(fqName: FqNameUnsafe): Boolean {
if (!fqName.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME)) return false
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)
return fqName.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME) &&
fqName.getFunctionalClassKind() == FunctionClassDescriptor.Kind.Function
}
fun DeclarationDescriptor.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
if (this !is ClassDescriptor) return null
if (!KotlinBuiltIns.isUnderKotlinPackage(this)) return null
val fqNameUnsafe = this.fqNameUnsafe
return fqNameUnsafe.getFunctionalClassKind()
}
fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassDescriptor.Kind? {
if (!isSafe || isRoot) return null
val fqName = toSafe()
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(fqName.shortName().asString(), fqName.parent())
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(shortName().asString(), toSafe().parent())
}
@@ -48,18 +48,10 @@ class BuiltInFictitiousFunctionClassFactory(
return KindWithArity(kind, arity)
}
@JvmStatic fun getFunctionalClassKind(className: String, packageFqName: FqName) =
@JvmStatic
fun getFunctionalClassKind(className: String, packageFqName: FqName) =
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? {
if (s.isEmpty()) return null
@@ -90,6 +90,10 @@ public final class ClassId {
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"
*/