From eb673e456663185cc9d21789cd785e2ce9218f4d Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Tue, 28 Feb 2023 11:16:02 +0100 Subject: [PATCH] [FIR] KTIJ-24296 Optimize `isNameForFunctionClass` based on name shape - A `classId` can only be a generated function class if it ends with a digit, per the contract described in `FunctionTypeKind`. - The optimization uses this fact to avoid calling `functionTypeService.getKindByClassNamePrefix`, which can be expensive due to a hash map access. --- .../kotlin/fir/resolve/providers/FirSymbolProvider.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt index 6be3cd1820e..b79914e5b37 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt @@ -144,8 +144,12 @@ fun Set.mayHaveTopLevelClassifier( private inline fun Set.mayHaveTopLevelClassifier(shortClassName: Name): Boolean = shortClassName.asString() in this || shortClassName.isSpecial -private fun isNameForFunctionClass(classId: ClassId, session: FirSession): Boolean = - session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null +private fun isNameForFunctionClass(classId: ClassId, session: FirSession): Boolean { + // Optimization: `classId` can only be a name for a generated function class if it ends with a digit. See `FunctionTypeKind`. + if (classId.relativeClassName.asString().lastOrNull()?.isDigit() != true) return false + + return session.functionTypeService.getKindByClassNamePrefix(classId.packageFqName, classId.shortClassName.asString()) != null +} fun ClassId.toSymbol(session: FirSession): FirClassifierSymbol<*>? { return session.symbolProvider.getClassLikeSymbolByClassId(this)