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 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())
} }
@@ -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"
*/ */