FIR: make class member helper names more consistent

This commit is contained in:
Mikhail Glukhikh
2022-10-26 14:07:51 +02:00
committed by Space Team
parent e2a83a0ed0
commit d4fc2248ff
19 changed files with 39 additions and 40 deletions
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -36,7 +36,7 @@ fun FirBasedSymbol<*>.getContainingKtModule(firResolveSession: LLFirResolveSessi
val target = when (this) { val target = when (this) {
is FirCallableSymbol -> { is FirCallableSymbol -> {
// callable fake overrides have use-site FirModuleData // callable fake overrides have use-site FirModuleData
dispatchReceiverClassOrNull()?.toFirRegularClassSymbol(firResolveSession.useSiteFirSession) ?: this dispatchReceiverClassLookupTagOrNull()?.toFirRegularClassSymbol(firResolveSession.useSiteFirSession) ?: this
} }
else -> this else -> this
} }
@@ -224,7 +224,7 @@ class FirElementSerializer private constructor(
if (declaration.isSubstitutionOrIntersectionOverride) return if (declaration.isSubstitutionOrIntersectionOverride) return
// non-intersection or substitution fake override // non-intersection or substitution fake override
if (!declaration.isStatic && declaration.dispatchReceiverClassOrNull() != this@declarations.symbol.toLookupTag()) return if (!declaration.isStatic && declaration.dispatchReceiverClassLookupTagOrNull() != this@declarations.symbol.toLookupTag()) return
add(declaration) add(declaration)
} }
@@ -414,7 +414,7 @@ fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
): ProcessorAction = ): ProcessorAction =
processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ -> processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride && val unwrapped = if (overridden.fir.isSubstitutionOverride &&
overridden.dispatchReceiverClassOrNull() == containingClass.symbol.toLookupTag() overridden.dispatchReceiverClassLookupTagOrNull() == containingClass.symbol.toLookupTag()
) )
overridden.originalForSubstitutionOverride!! overridden.originalForSubstitutionOverride!!
else else
@@ -430,7 +430,7 @@ fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
): ProcessorAction = ): ProcessorAction =
processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, _ -> processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride && val unwrapped = if (overridden.fir.isSubstitutionOverride &&
overridden.dispatchReceiverClassOrNull() == containingClass.symbol.toLookupTag() overridden.dispatchReceiverClassLookupTagOrNull() == containingClass.symbol.toLookupTag()
) )
overridden.originalForSubstitutionOverride!! overridden.originalForSubstitutionOverride!!
else else
@@ -1406,8 +1406,8 @@ class Fir2IrDeclarationStorage(
symbolTable.declareProperty(signature, { symbol }) { symbolTable.declareProperty(signature, { symbol }) {
val isFakeOverride = val isFakeOverride =
fir.isSubstitutionOrIntersectionOverride && fir.isSubstitutionOrIntersectionOverride &&
firPropertySymbol.dispatchReceiverClassOrNull() != firPropertySymbol.dispatchReceiverClassLookupTagOrNull() !=
firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassOrNull() firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassLookupTagOrNull()
Fir2IrLazyProperty( Fir2IrLazyProperty(
components, startOffset, endOffset, declarationOrigin, fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride components, startOffset, endOffset, declarationOrigin, fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride
).apply { ).apply {
@@ -698,7 +698,7 @@ class CallAndReferenceGenerator(
val resolvedReference = callableReferenceAccess.calleeReference as FirResolvedNamedReference val resolvedReference = callableReferenceAccess.calleeReference as FirResolvedNamedReference
val firCallableSymbol = resolvedReference.resolvedSymbol as FirCallableSymbol<*> val firCallableSymbol = resolvedReference.resolvedSymbol as FirCallableSymbol<*>
// Make sure the reference indeed refers to a member of that companion // Make sure the reference indeed refers to a member of that companion
if (firCallableSymbol.dispatchReceiverClassOrNull() != classSymbol.toLookupTag()) { if (firCallableSymbol.dispatchReceiverClassLookupTagOrNull() != classSymbol.toLookupTag()) {
return null return null
} }
} }
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.declarations.utils.isFromEnumClass import org.jetbrains.kotlin.fir.declarations.utils.isFromEnumClass
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
@@ -175,7 +175,7 @@ internal class ClassMemberGenerator(
irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind) irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind)
} }
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> { irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull() val lookupTag = firFunction?.symbol?.dispatchReceiverClassLookupTagOrNull()
when { when {
DataClassResolver.isComponentLike(irFunction.name) -> DataClassResolver.isComponentLike(irFunction.name) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) } firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
@@ -176,7 +176,7 @@ class FakeOverrideGenerator(
} }
private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean = private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean =
fir.origin.fromSupertypes && dispatchReceiverClassOrNull() == classLookupTag fir.origin.fromSupertypes && dispatchReceiverClassLookupTagOrNull() == classLookupTag
private inline fun <reified D : FirCallableDeclaration, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded( private inline fun <reified D : FirCallableDeclaration, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded(
klass: FirClass, klass: FirClass,
@@ -197,7 +197,7 @@ class FakeOverrideGenerator(
val classLookupTag = klass.symbol.toLookupTag() val classLookupTag = klass.symbol.toLookupTag()
val originalDeclaration = originalSymbol.fir val originalDeclaration = originalSymbol.fir
if (originalSymbol.dispatchReceiverClassOrNull() == classLookupTag && !originalDeclaration.origin.fromSupertypes) return if (originalSymbol.dispatchReceiverClassLookupTagOrNull() == classLookupTag && !originalDeclaration.origin.fromSupertypes) return
// Data classes' methods from Any (toString/equals/hashCode) are not handled by the line above because they have Any-typed dispatch receiver // Data classes' methods from Any (toString/equals/hashCode) are not handled by the line above because they have Any-typed dispatch receiver
// (there are no special FIR method for them, it's just fake overrides) // (there are no special FIR method for them, it's just fake overrides)
// But they are treated differently in IR (real declarations have already been declared before) and such methods are present among realDeclarationSymbols // But they are treated differently in IR (real declarations have already been declared before) and such methods are present among realDeclarationSymbols
@@ -330,7 +330,7 @@ class FakeOverrideGenerator(
return scope.directOverridden(symbol).map { return scope.directOverridden(symbol).map {
// Unwrapping should happen only for fake overrides members from the same class, not from supertypes // Unwrapping should happen only for fake overrides members from the same class, not from supertypes
if (it.fir.isSubstitutionOverride && it.dispatchReceiverClassOrNull() == containingClass) if (it.fir.isSubstitutionOverride && it.dispatchReceiverClassLookupTagOrNull() == containingClass)
it.originalForSubstitutionOverride!! it.originalForSubstitutionOverride!!
else else
it it
@@ -10,11 +10,9 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride
import org.jetbrains.kotlin.fir.scopes.getDeclaredConstructors
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
@@ -197,7 +195,7 @@ class Fir2IrLazyClass(
scope.processFunctionsByName(name) { scope.processFunctionsByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName
if (!shouldBuildStub(it.fir)) return@processFunctionsByName if (!shouldBuildStub(it.fir)) return@processFunctionsByName
if (it.dispatchReceiverClassOrNull() == ownerLookupTag) { if (it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) {
if (it.isAbstractMethodOfAny()) { if (it.isAbstractMethodOfAny()) {
return@processFunctionsByName return@processFunctionsByName
} }
@@ -207,7 +205,7 @@ class Fir2IrLazyClass(
scope.processPropertiesByName(name) { scope.processPropertiesByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName
if (!shouldBuildStub(it.fir)) return@processPropertiesByName if (!shouldBuildStub(it.fir)) return@processPropertiesByName
if (it is FirPropertySymbol && it.dispatchReceiverClassOrNull() == ownerLookupTag) { if (it is FirPropertySymbol && it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) {
result.addIfNotNull( result.addIfNotNull(
declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration
) )
@@ -91,7 +91,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableDeclaration) { if (declaration is FirCallableDeclaration) {
if (declaration.visibility == Visibilities.Local) return null if (declaration.visibility == Visibilities.Local) return null
if (!allowLocalClasses && (declaration.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true)) return null if (!allowLocalClasses && (declaration.dispatchReceiverClassLookupTagOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true)) return null
} }
val declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId) val declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.java.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.java.scopes.ClassicBuiltinSpecialProperties.getBuiltinSpecialPropertyGetterName import org.jetbrains.kotlin.fir.java.scopes.ClassicBuiltinSpecialProperties.getBuiltinSpecialPropertyGetterName
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
@@ -159,7 +159,7 @@ object ClassicBuiltinSpecialProperties {
} }
private fun FirCallableSymbol<*>.isFromBuiltinClass(session: FirSession): Boolean { private fun FirCallableSymbol<*>.isFromBuiltinClass(session: FirSession): Boolean {
return dispatchReceiverClassOrNull()?.toSymbol(session)?.fir?.origin == FirDeclarationOrigin.BuiltIns return dispatchReceiverClassLookupTagOrNull()?.toSymbol(session)?.fir?.origin == FirDeclarationOrigin.BuiltIns
} }
private fun FirNamedFunctionSymbol.firstOverriddenFunction( private fun FirNamedFunctionSymbol.firstOverriddenFunction(
@@ -304,7 +304,7 @@ abstract class FirVisibilityChecker : FirSessionComponent {
val dispatchReceiverParameterClassSymbol = val dispatchReceiverParameterClassSymbol =
(fir as? FirCallableDeclaration) (fir as? FirCallableDeclaration)
?.propertyIfAccessor?.propertyIfBackingField ?.propertyIfAccessor?.propertyIfBackingField
?.dispatchReceiverClassOrNull()?.toSymbol(session) ?.dispatchReceiverClassLookupTagOrNull()?.toSymbol(session)
?: return true ?: return true
val dispatchReceiverParameterClassLookupTag = dispatchReceiverParameterClassSymbol.toLookupTag() val dispatchReceiverParameterClassLookupTag = dispatchReceiverParameterClassSymbol.toLookupTag()
@@ -125,7 +125,7 @@ class FirSyntheticPropertiesScope private constructor(
}) })
} }
val classLookupTag = getterSymbol.originalOrSelf().dispatchReceiverClassOrNull() val classLookupTag = getterSymbol.originalOrSelf().dispatchReceiverClassLookupTagOrNull()
val packageName = classLookupTag?.classId?.packageFqName ?: getterSymbol.callableId.packageName val packageName = classLookupTag?.classId?.packageFqName ?: getterSymbol.callableId.packageName
val className = classLookupTag?.classId?.relativeClassName val className = classLookupTag?.classId?.relativeClassName
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.caches.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -286,7 +286,7 @@ class FirClassSubstitutionScope(
member as FirTypeParameterRefsOwner, member as FirTypeParameterRefsOwner,
symbolForOverride, symbolForOverride,
substitutor, substitutor,
forceTypeParametersRecreation = dispatchReceiverTypeForSubstitutedMembers.lookupTag != member.dispatchReceiverClassOrNull() forceTypeParametersRecreation = dispatchReceiverTypeForSubstitutedMembers.lookupTag != member.dispatchReceiverClassLookupTagOrNull()
) )
val receiverType = member.receiverTypeRef?.coneType val receiverType = member.receiverTypeRef?.coneType
@@ -356,7 +356,7 @@ class FirTypeIntersectionScopeContext(
val key = mostSpecific.first() as FirNamedFunctionSymbol val key = mostSpecific.first() as FirNamedFunctionSymbol
val keyFir = key.fir val keyFir = key.fir
val callableId = CallableId( val callableId = CallableId(
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassOrNull()?.classId!!, dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!,
keyFir.name keyFir.name
) )
val newSymbol = FirIntersectionOverrideFunctionSymbol(callableId, overrides) val newSymbol = FirIntersectionOverrideFunctionSymbol(callableId, overrides)
@@ -381,7 +381,7 @@ class FirTypeIntersectionScopeContext(
val key = mostSpecific.first() as FirPropertySymbol val key = mostSpecific.first() as FirPropertySymbol
val keyFir = key.fir val keyFir = key.fir
val callableId = CallableId( val callableId = CallableId(
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassOrNull()?.classId!!, dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!,
keyFir.name keyFir.name
) )
val newSymbol = FirIntersectionOverridePropertySymbol(callableId, overrides) val newSymbol = FirIntersectionOverridePropertySymbol(callableId, overrides)
@@ -541,7 +541,7 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(
} }
// referenced function of a Kotlin function type // referenced function of a Kotlin function type
FirDeclarationOrigin.BuiltIns -> { FirDeclarationOrigin.BuiltIns -> {
if (dispatchReceiverClassOrNull()?.isBuiltinFunctionalType() == true) { if (dispatchReceiverClassLookupTagOrNull()?.isBuiltinFunctionalType() == true) {
ForbiddenNamedArgumentsTarget.INVOKE_ON_FUNCTION_TYPE ForbiddenNamedArgumentsTarget.INVOKE_ON_FUNCTION_TYPE
} else { } else {
null null
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.descriptors.isClass
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -151,5 +151,5 @@ private fun BodyResolveComponents.isConcreteMember(supertype: ConeKotlinType, me
val classSymbol = val classSymbol =
(supertype as? ConeClassLikeType)?.lookupTag?.toSymbol(session) as? FirRegularClassSymbol ?: return true (supertype as? ConeClassLikeType)?.lookupTag?.toSymbol(session) as? FirRegularClassSymbol ?: return true
if (classSymbol.fir.classKind != ClassKind.INTERFACE) return true if (classSymbol.fir.classKind != ClassKind.INTERFACE) return true
return member.symbol.unwrapFakeOverrides().dispatchReceiverClassOrNull()?.classId != StandardClassIds.Any return member.symbol.unwrapFakeOverrides().dispatchReceiverClassLookupTagOrNull()?.classId != StandardClassIds.Any
} }
@@ -333,7 +333,7 @@ class ScopeTowerLevel(
return null return null
} }
val lookupTag = candidate.fir.propertySymbol.dispatchReceiverClassOrNull() val lookupTag = candidate.fir.propertySymbol.dispatchReceiverClassLookupTagOrNull()
return when { return when {
lookupTag != null -> { lookupTag != null -> {
bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue -> bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue ->
@@ -16,22 +16,23 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
fun FirCallableSymbol<*>.dispatchReceiverTypeOrNull(): ConeKotlinType? = fun FirCallableSymbol<*>.dispatchReceiverTypeOrNull(): ConeKotlinType? =
fir.dispatchReceiverType fir.dispatchReceiverType
fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? =
fir.dispatchReceiverClassOrNull()
fun FirCallableDeclaration.dispatchReceiverClassTypeOrNull(): ConeClassLikeType? = fun FirCallableDeclaration.dispatchReceiverClassTypeOrNull(): ConeClassLikeType? =
if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride) if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride)
baseForIntersectionOverride!!.dispatchReceiverClassTypeOrNull() baseForIntersectionOverride!!.dispatchReceiverClassTypeOrNull()
else else
dispatchReceiverType as? ConeClassLikeType dispatchReceiverType as? ConeClassLikeType
fun FirCallableDeclaration.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? = fun FirCallableSymbol<*>.dispatchReceiverClassLookupTagOrNull(): ConeClassLikeLookupTag? =
fir.dispatchReceiverClassLookupTagOrNull()
fun FirCallableDeclaration.dispatchReceiverClassLookupTagOrNull(): ConeClassLikeLookupTag? =
dispatchReceiverClassTypeOrNull()?.lookupTag dispatchReceiverClassTypeOrNull()?.lookupTag
fun FirCallableSymbol<*>.containingClassLookupTag(): ConeClassLikeLookupTag? = fir.containingClassLookupTag() fun FirCallableSymbol<*>.containingClassLookupTag(): ConeClassLikeLookupTag? =
fun FirCallableDeclaration.containingClassLookupTag(): ConeClassLikeLookupTag? { fir.containingClassLookupTag()
return (containingClassForStaticMemberAttr ?: dispatchReceiverClassOrNull())
} fun FirCallableDeclaration.containingClassLookupTag(): ConeClassLikeLookupTag? =
containingClassForStaticMemberAttr ?: dispatchReceiverClassLookupTagOrNull()
fun FirRegularClass.containingClassForLocal(): ConeClassLikeLookupTag? = fun FirRegularClass.containingClassForLocal(): ConeClassLikeLookupTag? =
if (isLocal) containingClassForLocalAttr else null if (isLocal) containingClassForLocalAttr else null
@@ -856,7 +856,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
return when (val fir = this.fir) { return when (val fir = this.fir) {
is FirConstructor -> fir.returnTypeRef.coneType.isLocal() is FirConstructor -> fir.returnTypeRef.coneType.isLocal()
is FirCallableDeclaration -> { is FirCallableDeclaration -> {
fir.dispatchReceiverClassOrNull()?.toFirRegularClassSymbol(session)?.isLocal ?: false fir.dispatchReceiverClassLookupTagOrNull()?.toFirRegularClassSymbol(session)?.isLocal ?: false
} }
else -> false else -> false
} }