FIR2IR: simplify f/o owner lookup tag extraction
This commit is contained in:
committed by
Space Team
parent
4cb41f8e82
commit
d35dedcb72
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
|||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
|
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
|
||||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||||
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
@@ -61,6 +62,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
|||||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
internal fun <T : IrElement> FirElement.convertWithOffsets(
|
internal fun <T : IrElement> FirElement.convertWithOffsets(
|
||||||
f: (startOffset: Int, endOffset: Int) -> T
|
f: (startOffset: Int, endOffset: Int) -> T
|
||||||
@@ -220,31 +222,36 @@ fun FirReference.toSymbolForCall(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun FirResolvedQualifier.toLookupTag(): ConeClassLikeLookupTag? = (symbol as? FirClassSymbol)?.toLookupTag()
|
||||||
|
|
||||||
context(Fir2IrComponents)
|
context(Fir2IrComponents)
|
||||||
private fun FirCallableSymbol<*>.toSymbolForCall(
|
private fun FirCallableSymbol<*>.toSymbolForCall(
|
||||||
dispatchReceiver: FirExpression,
|
dispatchReceiver: FirExpression,
|
||||||
preferGetter: Boolean,
|
preferGetter: Boolean,
|
||||||
|
// Note: in fact LHS for callable references and explicit receiver for normal qualified accesses
|
||||||
explicitReceiver: FirExpression? = null,
|
explicitReceiver: FirExpression? = null,
|
||||||
isDelegate: Boolean = false,
|
isDelegate: Boolean = false,
|
||||||
isReference: Boolean = false
|
isReference: Boolean = false
|
||||||
): IrSymbol? {
|
): IrSymbol? {
|
||||||
val fakeOverrideOwnerLookupTag = fir.importedFromObjectOrStaticData.takeIf { isStatic }?.let {
|
val fakeOverrideOwnerLookupTag = when {
|
||||||
ConeClassLikeLookupTagImpl(it.objectClassId)
|
// Static fake overrides
|
||||||
} ?: when (dispatchReceiver) {
|
isStatic -> {
|
||||||
is FirNoReceiverExpression -> {
|
fir.importedFromObjectOrStaticData?.let {
|
||||||
val containingClass = containingClassLookupTag()
|
ConeClassLikeLookupTagImpl(it.objectClassId)
|
||||||
if (containingClass != null && containingClass.classId != StandardClassIds.Any) {
|
} ?: (explicitReceiver as? FirResolvedQualifier)?.toLookupTag()
|
||||||
// Make sure that symbol is not extension and is not from inline class
|
}
|
||||||
((explicitReceiver as? FirResolvedQualifier)?.symbol as? FirClassSymbol)?.toLookupTag()
|
// Member fake override or bound callable reference
|
||||||
} else {
|
dispatchReceiver !is FirNoReceiverExpression -> {
|
||||||
null
|
dispatchReceiver.typeRef.coneType.let { it.findClassRepresentation(it, declarationStorage.session) }
|
||||||
|
}
|
||||||
|
// Unbound callable reference to member (non-extension)
|
||||||
|
isReference && fir.receiverTypeRef == null -> {
|
||||||
|
// TODO: remove runIf with StandardClassIds.Any comparison after fixing ValueClass::equals case (KT-54887)
|
||||||
|
runIf(containingClassLookupTag()?.classId != StandardClassIds.Any) {
|
||||||
|
(explicitReceiver as? FirResolvedQualifier)?.toLookupTag()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else -> null
|
||||||
else -> {
|
|
||||||
if (isStatic && dispatchReceiver is FirResolvedQualifier) (dispatchReceiver.symbol as? FirClassSymbol)?.toLookupTag()
|
|
||||||
else dispatchReceiver.typeRef.coneType.let { it.findClassRepresentation(it, declarationStorage.session) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return when (this) {
|
return when (this) {
|
||||||
|
|||||||
Reference in New Issue
Block a user