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.project.structure.llFirModuleData
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.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -36,7 +36,7 @@ fun FirBasedSymbol<*>.getContainingKtModule(firResolveSession: LLFirResolveSessi
val target = when (this) {
is FirCallableSymbol -> {
// callable fake overrides have use-site FirModuleData
dispatchReceiverClassOrNull()?.toFirRegularClassSymbol(firResolveSession.useSiteFirSession) ?: this
dispatchReceiverClassLookupTagOrNull()?.toFirRegularClassSymbol(firResolveSession.useSiteFirSession) ?: this
}
else -> this
}
@@ -224,7 +224,7 @@ class FirElementSerializer private constructor(
if (declaration.isSubstitutionOrIntersectionOverride) return
// 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)
}
@@ -414,7 +414,7 @@ fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
): ProcessorAction =
processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride &&
overridden.dispatchReceiverClassOrNull() == containingClass.symbol.toLookupTag()
overridden.dispatchReceiverClassLookupTagOrNull() == containingClass.symbol.toLookupTag()
)
overridden.originalForSubstitutionOverride!!
else
@@ -430,7 +430,7 @@ fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
): ProcessorAction =
processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride &&
overridden.dispatchReceiverClassOrNull() == containingClass.symbol.toLookupTag()
overridden.dispatchReceiverClassLookupTagOrNull() == containingClass.symbol.toLookupTag()
)
overridden.originalForSubstitutionOverride!!
else
@@ -1406,8 +1406,8 @@ class Fir2IrDeclarationStorage(
symbolTable.declareProperty(signature, { symbol }) {
val isFakeOverride =
fir.isSubstitutionOrIntersectionOverride &&
firPropertySymbol.dispatchReceiverClassOrNull() !=
firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassOrNull()
firPropertySymbol.dispatchReceiverClassLookupTagOrNull() !=
firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassLookupTagOrNull()
Fir2IrLazyProperty(
components, startOffset, endOffset, declarationOrigin, fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride
).apply {
@@ -698,7 +698,7 @@ class CallAndReferenceGenerator(
val resolvedReference = callableReferenceAccess.calleeReference as FirResolvedNamedReference
val firCallableSymbol = resolvedReference.resolvedSymbol as FirCallableSymbol<*>
// Make sure the reference indeed refers to a member of that companion
if (firCallableSymbol.dispatchReceiverClassOrNull() != classSymbol.toLookupTag()) {
if (firCallableSymbol.dispatchReceiverClassLookupTagOrNull() != classSymbol.toLookupTag()) {
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.isFromEnumClass
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.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
@@ -175,7 +175,7 @@ internal class ClassMemberGenerator(
irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind)
}
irFunction.parent is IrClass && irFunction.parentAsClass.isData -> {
val lookupTag = firFunction?.symbol?.dispatchReceiverClassOrNull()
val lookupTag = firFunction?.symbol?.dispatchReceiverClassLookupTagOrNull()
when {
DataClassResolver.isComponentLike(irFunction.name) ->
firFunction?.body?.let { irFunction.body = visitor.convertToIrBlockBody(it) }
@@ -176,7 +176,7 @@ class FakeOverrideGenerator(
}
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(
klass: FirClass,
@@ -197,7 +197,7 @@ class FakeOverrideGenerator(
val classLookupTag = klass.symbol.toLookupTag()
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
// (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
@@ -330,7 +330,7 @@ class FakeOverrideGenerator(
return scope.directOverridden(symbol).map {
// 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!!
else
it
@@ -10,11 +10,9 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
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.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.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
@@ -197,7 +195,7 @@ class Fir2IrLazyClass(
scope.processFunctionsByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName
if (!shouldBuildStub(it.fir)) return@processFunctionsByName
if (it.dispatchReceiverClassOrNull() == ownerLookupTag) {
if (it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) {
if (it.isAbstractMethodOfAny()) {
return@processFunctionsByName
}
@@ -207,7 +205,7 @@ class Fir2IrLazyClass(
scope.processPropertiesByName(name) {
if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName
if (!shouldBuildStub(it.fir)) return@processPropertiesByName
if (it is FirPropertySymbol && it.dispatchReceiverClassOrNull() == ownerLookupTag) {
if (it is FirPropertySymbol && it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) {
result.addIfNotNull(
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 FirCallableDeclaration) {
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)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.java.scopes
import org.jetbrains.kotlin.fir.FirSession
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.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.*
@@ -159,7 +159,7 @@ object ClassicBuiltinSpecialProperties {
}
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(
@@ -304,7 +304,7 @@ abstract class FirVisibilityChecker : FirSessionComponent {
val dispatchReceiverParameterClassSymbol =
(fir as? FirCallableDeclaration)
?.propertyIfAccessor?.propertyIfBackingField
?.dispatchReceiverClassOrNull()?.toSymbol(session)
?.dispatchReceiverClassLookupTagOrNull()?.toSymbol(session)
?: return true
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 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.synthetic.FirSyntheticProperty
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.resolve.ScopeSessionKey
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -286,7 +286,7 @@ class FirClassSubstitutionScope(
member as FirTypeParameterRefsOwner,
symbolForOverride,
substitutor,
forceTypeParametersRecreation = dispatchReceiverTypeForSubstitutedMembers.lookupTag != member.dispatchReceiverClassOrNull()
forceTypeParametersRecreation = dispatchReceiverTypeForSubstitutedMembers.lookupTag != member.dispatchReceiverClassLookupTagOrNull()
)
val receiverType = member.receiverTypeRef?.coneType
@@ -356,7 +356,7 @@ class FirTypeIntersectionScopeContext(
val key = mostSpecific.first() as FirNamedFunctionSymbol
val keyFir = key.fir
val callableId = CallableId(
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassOrNull()?.classId!!,
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!,
keyFir.name
)
val newSymbol = FirIntersectionOverrideFunctionSymbol(callableId, overrides)
@@ -381,7 +381,7 @@ class FirTypeIntersectionScopeContext(
val key = mostSpecific.first() as FirPropertySymbol
val keyFir = key.fir
val callableId = CallableId(
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassOrNull()?.classId!!,
dispatchReceiverType.classId ?: keyFir.dispatchReceiverClassLookupTagOrNull()?.classId!!,
keyFir.name
)
val newSymbol = FirIntersectionOverridePropertySymbol(callableId, overrides)
@@ -541,7 +541,7 @@ fun FirFunction.getAsForbiddenNamedArgumentsTarget(
}
// referenced function of a Kotlin function type
FirDeclarationOrigin.BuiltIns -> {
if (dispatchReceiverClassOrNull()?.isBuiltinFunctionalType() == true) {
if (dispatchReceiverClassLookupTagOrNull()?.isBuiltinFunctionalType() == true) {
ForbiddenNamedArgumentsTarget.INVOKE_ON_FUNCTION_TYPE
} else {
null
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.descriptors.isClass
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirVariable
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.FirQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -151,5 +151,5 @@ private fun BodyResolveComponents.isConcreteMember(supertype: ConeKotlinType, me
val classSymbol =
(supertype as? ConeClassLikeType)?.lookupTag?.toSymbol(session) as? FirRegularClassSymbol ?: 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
}
val lookupTag = candidate.fir.propertySymbol.dispatchReceiverClassOrNull()
val lookupTag = candidate.fir.propertySymbol.dispatchReceiverClassLookupTagOrNull()
return when {
lookupTag != null -> {
bodyResolveComponents.implicitReceiverStack.lastDispatchReceiver { implicitReceiverValue ->
@@ -16,22 +16,23 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
fun FirCallableSymbol<*>.dispatchReceiverTypeOrNull(): ConeKotlinType? =
fir.dispatchReceiverType
fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? =
fir.dispatchReceiverClassOrNull()
fun FirCallableDeclaration.dispatchReceiverClassTypeOrNull(): ConeClassLikeType? =
if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride)
baseForIntersectionOverride!!.dispatchReceiverClassTypeOrNull()
else
dispatchReceiverType as? ConeClassLikeType
fun FirCallableDeclaration.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? =
fun FirCallableSymbol<*>.dispatchReceiverClassLookupTagOrNull(): ConeClassLikeLookupTag? =
fir.dispatchReceiverClassLookupTagOrNull()
fun FirCallableDeclaration.dispatchReceiverClassLookupTagOrNull(): ConeClassLikeLookupTag? =
dispatchReceiverClassTypeOrNull()?.lookupTag
fun FirCallableSymbol<*>.containingClassLookupTag(): ConeClassLikeLookupTag? = fir.containingClassLookupTag()
fun FirCallableDeclaration.containingClassLookupTag(): ConeClassLikeLookupTag? {
return (containingClassForStaticMemberAttr ?: dispatchReceiverClassOrNull())
}
fun FirCallableSymbol<*>.containingClassLookupTag(): ConeClassLikeLookupTag? =
fir.containingClassLookupTag()
fun FirCallableDeclaration.containingClassLookupTag(): ConeClassLikeLookupTag? =
containingClassForStaticMemberAttr ?: dispatchReceiverClassLookupTagOrNull()
fun FirRegularClass.containingClassForLocal(): ConeClassLikeLookupTag? =
if (isLocal) containingClassForLocalAttr else null
@@ -856,7 +856,7 @@ class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
return when (val fir = this.fir) {
is FirConstructor -> fir.returnTypeRef.coneType.isLocal()
is FirCallableDeclaration -> {
fir.dispatchReceiverClassOrNull()?.toFirRegularClassSymbol(session)?.isLocal ?: false
fir.dispatchReceiverClassLookupTagOrNull()?.toFirRegularClassSymbol(session)?.isLocal ?: false
}
else -> false
}