[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.
This commit is contained in:
Marco Pennekamp
2023-02-28 11:16:02 +01:00
committed by Space Team
parent a725fe559c
commit eb673e4566
@@ -144,8 +144,12 @@ fun Set<String>.mayHaveTopLevelClassifier(
private inline fun Set<String>.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)