[FIR][K/N] Reduce use FIR internals usage in FirObjCInterop

^KT-61564
This commit is contained in:
Vladimir Sukharev
2024-01-12 13:25:40 +01:00
committed by Space Team
parent 55a41961d3
commit e109cac719
2 changed files with 10 additions and 28 deletions
@@ -53,13 +53,13 @@ private class FirObjCFunctionNameMangleComputer(
override fun getObjCMethodInfo(): ObjCMethodInfo? { override fun getObjCMethodInfo(): ObjCMethodInfo? {
val scopeSession = ScopeSession() val scopeSession = ScopeSession()
return function.getInitMethodIfObjCConstructor(session, scopeSession) return function.symbol.getInitMethodIfObjCConstructor(session, scopeSession)
?.getObjCMethodInfoFromOverriddenFunctions(session, scopeSession) ?.getObjCMethodInfoFromOverriddenFunctions(session, scopeSession)
} }
override fun getExtensionReceiverClassName(): Name? = function.receiverParameter?.getTypeName(session)?.let(Name::identifier) override fun getExtensionReceiverClassName(): Name? = function.receiverParameter?.getTypeName(session)?.let(Name::identifier)
override fun isObjCConstructor(): Boolean = function is FirConstructor && function.isObjCConstructor(session) override fun isObjCConstructor(): Boolean = function is FirConstructor && function.symbol.isObjCConstructor(session)
override fun isPropertyAccessor(): Boolean = function is FirPropertyAccessor override fun isPropertyAccessor(): Boolean = function is FirPropertyAccessor
@@ -29,13 +29,12 @@ import org.jetbrains.kotlin.name.NativeStandardInteropNames
import org.jetbrains.kotlin.native.interop.ObjCMethodInfo import org.jetbrains.kotlin.native.interop.ObjCMethodInfo
@OptIn(SymbolInternals::class) internal fun FirFunctionSymbol<*>.getObjCMethodInfoFromOverriddenFunctions(session: FirSession, scopeSession: ScopeSession): ObjCMethodInfo? {
internal fun FirFunction.getObjCMethodInfoFromOverriddenFunctions(session: FirSession, scopeSession: ScopeSession): ObjCMethodInfo? {
decodeObjCMethodAnnotation(session)?.let { decodeObjCMethodAnnotation(session)?.let {
return it return it
} }
// recursively find ObjCMethod annotation in getDirectOverriddenFunctions() (same as `overriddenDescriptors` in K1) // recursively find ObjCMethod annotation in getDirectOverriddenFunctions() (same as `overriddenDescriptors` in K1)
return when (val symbol = this.symbol) { return when (val symbol = this) {
is FirNamedFunctionSymbol -> { is FirNamedFunctionSymbol -> {
val firClassSymbol = containingClassLookupTag()?.toSymbol(session) as FirClassSymbol<*>? val firClassSymbol = containingClassLookupTag()?.toSymbol(session) as FirClassSymbol<*>?
firClassSymbol?.let { firClassSymbol?.let {
@@ -43,8 +42,8 @@ internal fun FirFunction.getObjCMethodInfoFromOverriddenFunctions(session: FirSe
// call of `processFunctionsByName()` is needed only for necessary side-effect before `getDirectOverriddenFunctions` call // call of `processFunctionsByName()` is needed only for necessary side-effect before `getDirectOverriddenFunctions` call
unsubstitutedScope.processFunctionsByName(symbol.name) {} unsubstitutedScope.processFunctionsByName(symbol.name) {}
unsubstitutedScope.getDirectOverriddenFunctions(symbol).firstNotNullOfOrNull { unsubstitutedScope.getDirectOverriddenFunctions(symbol).firstNotNullOfOrNull {
assert(it.fir != this) { "Function ${symbol.name}() is wrongly contained in its own getDirectOverriddenFunctions" } assert(it != this) { "Function ${symbol.name}() is wrongly contained in its own getDirectOverriddenFunctions" }
it.fir.getObjCMethodInfoFromOverriddenFunctions(session, scopeSession) it.getObjCMethodInfoFromOverriddenFunctions(session, scopeSession)
} }
} }
} }
@@ -55,23 +54,6 @@ internal fun FirFunction.getObjCMethodInfoFromOverriddenFunctions(session: FirSe
/** /**
* mimics ConstructorDescriptor.getObjCInitMethod() * mimics ConstructorDescriptor.getObjCInitMethod()
*/ */
@OptIn(SymbolInternals::class)
fun FirConstructor.getObjCInitMethod(session: FirSession, scopeSession: ScopeSession): FirFunction? {
this.annotations.getAnnotationByClassId(NativeStandardInteropNames.objCConstructorClassId, session)?.let { annotation ->
val initSelector: String = annotation.constStringArgument("initSelector")
val classSymbol = containingClassLookupTag()?.toSymbol(session) as FirClassSymbol<*>
val initSelectors = mutableListOf<FirFunction>()
classSymbol.fir.scopeForClass(ConeSubstitutor.Empty, session, scopeSession, classSymbol.toLookupTag(), memberRequiredPhase = null)
.processAllFunctions {
if (it.fir.decodeObjCMethodAnnotation(session)?.selector == initSelector)
initSelectors.add(it.fir)
}
return initSelectors.singleOrNull()
?: error("expected one init method for $classSymbol $initSelector, got ${initSelectors.size}")
}
return null
}
fun FirConstructorSymbol.getObjCInitMethod(session: FirSession, scopeSession: ScopeSession): FirFunctionSymbol<*>? { fun FirConstructorSymbol.getObjCInitMethod(session: FirSession, scopeSession: ScopeSession): FirFunctionSymbol<*>? {
this.annotations.getAnnotationByClassId(NativeStandardInteropNames.objCConstructorClassId, session)?.let { annotation -> this.annotations.getAnnotationByClassId(NativeStandardInteropNames.objCConstructorClassId, session)?.let { annotation ->
val initSelector: String = annotation.constStringArgument("initSelector") val initSelector: String = annotation.constStringArgument("initSelector")
@@ -130,8 +112,8 @@ internal fun FirFunction.isObjCClassMethod(session: FirSession) =
/** /**
* mimics ConstructorDescriptor.isObjCConstructor() * mimics ConstructorDescriptor.isObjCConstructor()
*/ */
internal fun FirConstructor.isObjCConstructor(session: FirSession) = internal fun FirConstructorSymbol.isObjCConstructor(session: FirSession) =
this.annotations.hasAnnotation(NativeStandardInteropNames.objCConstructorClassId, session) this.annotations.hasAnnotation(NativeStandardInteropNames.objCConstructorClassId, session)
/** /**
* mimics IrClass.isObjCClass() * mimics IrClass.isObjCClass()
@@ -146,8 +128,8 @@ private fun FirClassSymbol<*>.selfOrAnySuperClass(session: FirSession, predicate
lookupSuperTypes(listOf(this), lookupInterfaces = true, deep = true, session, substituteTypes = false) lookupSuperTypes(listOf(this), lookupInterfaces = true, deep = true, session, substituteTypes = false)
.any { predicate(it.lookupTag) } .any { predicate(it.lookupTag) }
internal fun FirFunction.getInitMethodIfObjCConstructor(session: FirSession, scopeSession: ScopeSession): FirFunction? = internal fun FirFunctionSymbol<*>.getInitMethodIfObjCConstructor(session: FirSession, scopeSession: ScopeSession): FirFunctionSymbol<*>? =
if (this is FirConstructor && isObjCConstructor(session)) if (this is FirConstructorSymbol && isObjCConstructor(session))
getObjCInitMethod(session, scopeSession) getObjCInitMethod(session, scopeSession)
else else
this this