[FIR2IR] Get rid of all usages of IrSymbol.owner from ConversionUtils
^KT-60924
This commit is contained in:
committed by
Space Team
parent
55a6b1ef9f
commit
fa3e9c615b
@@ -16,11 +16,13 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.descriptors.ValueClassRepresentation
|
import org.jetbrains.kotlin.descriptors.ValueClassRepresentation
|
||||||
import org.jetbrains.kotlin.diagnostics.startOffsetSkippingComments
|
import org.jetbrains.kotlin.diagnostics.startOffsetSkippingComments
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
import org.jetbrains.kotlin.fir.backend.unsubstitutedScope
|
||||||
import org.jetbrains.kotlin.fir.builder.buildFileAnnotationsContainer
|
import org.jetbrains.kotlin.fir.builder.buildFileAnnotationsContainer
|
||||||
import org.jetbrains.kotlin.fir.builder.buildPackageDirective
|
import org.jetbrains.kotlin.fir.builder.buildPackageDirective
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildFile
|
import org.jetbrains.kotlin.fir.declarations.builder.buildFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isJava
|
import org.jetbrains.kotlin.fir.declarations.utils.isJava
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||||
@@ -39,11 +41,8 @@ import org.jetbrains.kotlin.fir.resolve.*
|
|||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
|
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
|
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||||
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.*
|
||||||
@@ -187,7 +186,6 @@ private fun FirBasedSymbol<*>.toSymbolForCall(
|
|||||||
}
|
}
|
||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
@OptIn(IrSymbolInternals::class)
|
|
||||||
fun FirReference.toSymbolForCall(
|
fun FirReference.toSymbolForCall(
|
||||||
dispatchReceiver: FirExpression,
|
dispatchReceiver: FirExpression,
|
||||||
conversionScope: Fir2IrConversionScope,
|
conversionScope: Fir2IrConversionScope,
|
||||||
@@ -215,11 +213,14 @@ fun FirReference.toSymbolForCall(
|
|||||||
|
|
||||||
is FirThisReference -> {
|
is FirThisReference -> {
|
||||||
when (val boundSymbol = boundSymbol) {
|
when (val boundSymbol = boundSymbol) {
|
||||||
is FirClassSymbol<*> -> classifierStorage.getIrClassSymbol(boundSymbol).owner.thisReceiver?.symbol
|
is FirClassSymbol<*> -> classifierStorage.getIrClassSymbol(boundSymbol)
|
||||||
is FirFunctionSymbol -> declarationStorage.getIrFunctionSymbol(boundSymbol).owner.extensionReceiverParameter?.symbol
|
is FirFunctionSymbol -> {
|
||||||
|
val firClassSymbol = boundSymbol.receiverParameter?.typeRef?.coneType?.toRegularClassSymbol(session)
|
||||||
|
firClassSymbol?.let { classifierStorage.getIrClassSymbol(it) }
|
||||||
|
}
|
||||||
is FirPropertySymbol -> {
|
is FirPropertySymbol -> {
|
||||||
val property = declarationStorage.getIrPropertySymbol(boundSymbol).owner as? IrProperty
|
val propertySymbol = declarationStorage.getIrPropertySymbol(boundSymbol) as? IrPropertySymbol
|
||||||
property?.let { conversionScope.parentAccessorOfPropertyFromStack(it) }?.symbol
|
propertySymbol?.let { conversionScope.parentAccessorOfPropertyFromStack(it).symbol }
|
||||||
}
|
}
|
||||||
is FirScriptSymbol -> declarationStorage.getCachedIrScript(boundSymbol.fir)?.thisReceiver?.symbol
|
is FirScriptSymbol -> declarationStorage.getCachedIrScript(boundSymbol.fir)?.thisReceiver?.symbol
|
||||||
else -> null
|
else -> null
|
||||||
@@ -561,15 +562,6 @@ fun FirClass.irOrigin(firProvider: FirProvider): IrDeclarationOrigin = when {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(IrSymbolInternals::class)
|
|
||||||
val IrType.isSamType: Boolean
|
|
||||||
get() {
|
|
||||||
val irClass = classOrNull ?: return false
|
|
||||||
if (irClass.owner.kind != ClassKind.INTERFACE) return false
|
|
||||||
val am = irClass.functions.singleOrNull { it.owner.modality == Modality.ABSTRACT }
|
|
||||||
return am != null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Fir2IrComponents.createSafeCallConstruction(
|
fun Fir2IrComponents.createSafeCallConstruction(
|
||||||
receiverVariable: IrVariable,
|
receiverVariable: IrVariable,
|
||||||
receiverVariableSymbol: IrValueSymbol,
|
receiverVariableSymbol: IrValueSymbol,
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
|
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrSymbolInternals
|
||||||
import org.jetbrains.kotlin.ir.util.isSetter
|
import org.jetbrains.kotlin.ir.util.isSetter
|
||||||
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||||
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
import org.jetbrains.kotlin.util.PrivateForInline
|
import org.jetbrains.kotlin.util.PrivateForInline
|
||||||
|
|
||||||
@OptIn(PrivateForInline::class)
|
@OptIn(PrivateForInline::class)
|
||||||
@@ -63,14 +66,19 @@ class Fir2IrConversionScope {
|
|||||||
|
|
||||||
fun parentFromStack(): IrDeclarationParent = parentStack.last()
|
fun parentFromStack(): IrDeclarationParent = parentStack.last()
|
||||||
|
|
||||||
fun parentAccessorOfPropertyFromStack(property: IrProperty): IrSimpleFunction? {
|
fun parentAccessorOfPropertyFromStack(propertySymbol: IrPropertySymbol): IrSimpleFunction {
|
||||||
|
// It is safe to access an owner of property symbol here, because this function may be called
|
||||||
|
// only from property accessor of corresponding property
|
||||||
|
// We inside accessor -> accessor is built -> property is built
|
||||||
|
@OptIn(IrSymbolInternals::class)
|
||||||
|
val property = propertySymbol.owner
|
||||||
for (parent in parentStack.asReversed()) {
|
for (parent in parentStack.asReversed()) {
|
||||||
when (parent) {
|
when (parent) {
|
||||||
property.getter -> return property.getter
|
property.getter -> return parent as IrSimpleFunction
|
||||||
property.setter -> return property.setter
|
property.setter -> return parent as IrSimpleFunction
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
error("Accessor of property ${property.render()} not found on parent stack")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : IrDeclaration> applyParentFromStackTo(declaration: T): T {
|
fun <T : IrDeclaration> applyParentFromStackTo(declaration: T): T {
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.ir.declarations.*
|
|||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbolInternals
|
import org.jetbrains.kotlin.ir.symbols.IrSymbolInternals
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
@@ -741,7 +742,7 @@ class Fir2IrVisitor(
|
|||||||
val irFunction = when (boundSymbol) {
|
val irFunction = when (boundSymbol) {
|
||||||
is FirFunctionSymbol -> declarationStorage.getIrFunctionSymbol(boundSymbol).owner
|
is FirFunctionSymbol -> declarationStorage.getIrFunctionSymbol(boundSymbol).owner
|
||||||
is FirPropertySymbol -> {
|
is FirPropertySymbol -> {
|
||||||
val property = declarationStorage.getIrPropertySymbol(boundSymbol).owner as? IrProperty
|
val property = declarationStorage.getIrPropertySymbol(boundSymbol) as? IrPropertySymbol
|
||||||
property?.let { conversionScope.parentAccessorOfPropertyFromStack(it) }
|
property?.let { conversionScope.parentAccessorOfPropertyFromStack(it) }
|
||||||
}
|
}
|
||||||
else -> null
|
else -> null
|
||||||
|
|||||||
+19
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.backend.generators
|
package org.jetbrains.kotlin.fir.backend.generators
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
import org.jetbrains.kotlin.fir.backend.*
|
||||||
@@ -25,6 +26,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
|||||||
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
|
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.processAllCallables
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||||
@@ -36,6 +38,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
|
|||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrSymbolInternals
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
@@ -446,9 +449,9 @@ internal class AdapterGenerator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val samFirType = substitutedParameterType.removeExternalProjections() ?: substitutedParameterType
|
val samFirType = substitutedParameterType.removeExternalProjections() ?: substitutedParameterType
|
||||||
|
if (!samFirType.isSamType) return this
|
||||||
val samType = samFirType.toIrType(ConversionTypeOrigin.DEFAULT)
|
val samType = samFirType.toIrType(ConversionTypeOrigin.DEFAULT)
|
||||||
// Make sure the converted IrType owner indeed has a single abstract method, since FunctionReferenceLowering relies on it.
|
// Make sure the converted IrType owner indeed has a single abstract method, since FunctionReferenceLowering relies on it.
|
||||||
if (!samType.isSamType) return this
|
|
||||||
return IrTypeOperatorCallImpl(
|
return IrTypeOperatorCallImpl(
|
||||||
this.startOffset, this.endOffset, samType, IrTypeOperator.SAM_CONVERSION, samType,
|
this.startOffset, this.endOffset, samType, IrTypeOperator.SAM_CONVERSION, samType,
|
||||||
castArgumentToFunctionalInterfaceForSamType(this, argument.resolvedType, samFirType)
|
castArgumentToFunctionalInterfaceForSamType(this, argument.resolvedType, samFirType)
|
||||||
@@ -836,4 +839,19 @@ internal class AdapterGenerator(
|
|||||||
irAdapterFunction.parent = conversionScope.parent()!!
|
irAdapterFunction.parent = conversionScope.parent()!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(Fir2IrComponents)
|
||||||
|
private val ConeKotlinType.isSamType: Boolean
|
||||||
|
get() {
|
||||||
|
val classSymbol = this.lowerBoundIfFlexible().toRegularClassSymbol(session) ?: return false
|
||||||
|
if (!classSymbol.isInterface) return false
|
||||||
|
val scope = classSymbol.unsubstitutedScope()
|
||||||
|
var abstractNumber = 0
|
||||||
|
scope.processAllCallables {
|
||||||
|
if (it.isAbstract) {
|
||||||
|
abstractNumber++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return abstractNumber == 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user