Move FunctionClassKind utils to :core.descriptors.common
This commit is contained in:
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir
|
package org.jetbrains.kotlin.fir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
|
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||||
@@ -875,7 +874,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
private val FirResolvedTypeRef.functionTypeKind: FunctionClassKind?
|
private val FirResolvedTypeRef.functionTypeKind: FunctionClassKind?
|
||||||
get() {
|
get() {
|
||||||
val classId = (type as? ConeClassLikeType)?.lookupTag?.classId ?: return null
|
val classId = (type as? ConeClassLikeType)?.lookupTag?.classId ?: return null
|
||||||
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(
|
return FunctionClassKind.getFunctionalClassKind(
|
||||||
classId.shortClassName.asString(), classId.packageFqName
|
classId.shortClassName.asString(), classId.packageFqName
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -20,5 +20,34 @@ enum class FunctionClassKind(val packageFqName: FqName, val classNamePrefix: Str
|
|||||||
companion object {
|
companion object {
|
||||||
fun byClassNamePrefix(packageFqName: FqName, className: String): FunctionClassKind? =
|
fun byClassNamePrefix(packageFqName: FqName, className: String): FunctionClassKind? =
|
||||||
values().firstOrNull { it.packageFqName == packageFqName && className.startsWith(it.classNamePrefix) }
|
values().firstOrNull { it.packageFqName == packageFqName && className.startsWith(it.classNamePrefix) }
|
||||||
|
|
||||||
|
data class KindWithArity(val kind: FunctionClassKind, val arity: Int)
|
||||||
|
|
||||||
|
fun parseClassName(className: String, packageFqName: FqName): KindWithArity? {
|
||||||
|
val kind = byClassNamePrefix(packageFqName, className) ?: return null
|
||||||
|
|
||||||
|
val prefix = kind.classNamePrefix
|
||||||
|
|
||||||
|
val arity = toInt(className.substring(prefix.length)) ?: return null
|
||||||
|
|
||||||
|
// TODO: validate arity, should be <= 255
|
||||||
|
return KindWithArity(kind, arity)
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun getFunctionalClassKind(className: String, packageFqName: FqName) =
|
||||||
|
parseClassName(className, packageFqName)?.kind
|
||||||
|
|
||||||
|
private fun toInt(s: String): Int? {
|
||||||
|
if (s.isEmpty()) return null
|
||||||
|
|
||||||
|
var result = 0
|
||||||
|
for (c in s) {
|
||||||
|
val d = c - '0'
|
||||||
|
if (d !in 0..9) return null
|
||||||
|
result = result * 10 + d
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ fun DeclarationDescriptor.getFunctionalClassKind(): FunctionClassKind? {
|
|||||||
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassKind? {
|
private fun FqNameUnsafe.getFunctionalClassKind(): FunctionClassKind? {
|
||||||
if (!isSafe || isRoot) return null
|
if (!isSafe || isRoot) return null
|
||||||
|
|
||||||
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(shortName().asString(), toSafe().parent())
|
return FunctionClassKind.getFunctionalClassKind(shortName().asString(), toSafe().parent())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-34
@@ -33,43 +33,11 @@ class BuiltInFictitiousFunctionClassFactory(
|
|||||||
private val storageManager: StorageManager,
|
private val storageManager: StorageManager,
|
||||||
private val module: ModuleDescriptor
|
private val module: ModuleDescriptor
|
||||||
) : ClassDescriptorFactory {
|
) : ClassDescriptorFactory {
|
||||||
|
|
||||||
private data class KindWithArity(val kind: FunctionClassKind, val arity: Int)
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private fun parseClassName(className: String, packageFqName: FqName): KindWithArity? {
|
|
||||||
val kind = FunctionClassKind.byClassNamePrefix(packageFqName, className) ?: return null
|
|
||||||
|
|
||||||
val prefix = kind.classNamePrefix
|
|
||||||
|
|
||||||
val arity = toInt(className.substring(prefix.length)) ?: return null
|
|
||||||
|
|
||||||
// TODO: validate arity, should be <= 255
|
|
||||||
return KindWithArity(kind, arity)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun getFunctionalClassKind(className: String, packageFqName: FqName) =
|
|
||||||
parseClassName(className, packageFqName)?.kind
|
|
||||||
|
|
||||||
private fun toInt(s: String): Int? {
|
|
||||||
if (s.isEmpty()) return null
|
|
||||||
|
|
||||||
var result = 0
|
|
||||||
for (c in s) {
|
|
||||||
val d = c - '0'
|
|
||||||
if (d !in 0..9) return null
|
|
||||||
result = result * 10 + d
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun shouldCreateClass(packageFqName: FqName, name: Name): Boolean {
|
override fun shouldCreateClass(packageFqName: FqName, name: Name): Boolean {
|
||||||
val string = name.asString()
|
val string = name.asString()
|
||||||
return (string.startsWith("Function") || string.startsWith("KFunction") ||
|
return (string.startsWith("Function") || string.startsWith("KFunction") ||
|
||||||
string.startsWith("SuspendFunction") || string.startsWith("KSuspendFunction")) // an optimization
|
string.startsWith("SuspendFunction") || string.startsWith("KSuspendFunction")) // an optimization
|
||||||
&& parseClassName(string, packageFqName) != null
|
&& FunctionClassKind.parseClassName(string, packageFqName) != null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createClass(classId: ClassId): ClassDescriptor? {
|
override fun createClass(classId: ClassId): ClassDescriptor? {
|
||||||
@@ -79,7 +47,7 @@ class BuiltInFictitiousFunctionClassFactory(
|
|||||||
if ("Function" !in className) return null // An optimization
|
if ("Function" !in className) return null // An optimization
|
||||||
|
|
||||||
val packageFqName = classId.packageFqName
|
val packageFqName = classId.packageFqName
|
||||||
val (kind, arity) = parseClassName(className, packageFqName) ?: return null
|
val (kind, arity) = FunctionClassKind.parseClassName(className, packageFqName) ?: return null
|
||||||
|
|
||||||
|
|
||||||
val builtInsFragments = module.getPackage(packageFqName).fragments.filterIsInstance<BuiltInsPackageFragment>()
|
val builtInsFragments = module.getPackage(packageFqName).fragments.filterIsInstance<BuiltInsPackageFragment>()
|
||||||
|
|||||||
Reference in New Issue
Block a user