[FIR2IR] Get rid of all usages of IrSymbol.owner from FirIrProvider
^KT-60924
This commit is contained in:
committed by
Space Team
parent
0cbce42185
commit
2ee0d6a4c1
@@ -22,11 +22,11 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
class FirIrProvider(val components: Fir2IrComponents) : IrProvider {
|
||||||
private val symbolProvider = fir2IrComponents.session.symbolProvider
|
private val symbolProvider = components.session.symbolProvider
|
||||||
private val declarationStorage = fir2IrComponents.declarationStorage
|
private val declarationStorage = components.declarationStorage
|
||||||
private val classifierStorage = fir2IrComponents.classifierStorage
|
private val classifierStorage = components.classifierStorage
|
||||||
private val fakeOverrideGenerator = FakeOverrideGenerator(fir2IrComponents, Fir2IrConversionScope(components.configuration))
|
private val fakeOverrideGenerator = FakeOverrideGenerator(components, Fir2IrConversionScope(components.configuration))
|
||||||
|
|
||||||
override fun getDeclaration(symbol: IrSymbol): IrDeclaration? {
|
override fun getDeclaration(symbol: IrSymbol): IrDeclaration? {
|
||||||
val signature = symbol.signature ?: return null
|
val signature = symbol.signature ?: return null
|
||||||
@@ -61,7 +61,6 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
return getDeclarationForSignature(signature.nearestPublicSig(), kind)
|
return getDeclarationForSignature(signature.nearestPublicSig(), kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(IrSymbolInternals::class)
|
|
||||||
private fun getDeclarationForCommonSignature(signature: IdSignature.CommonSignature, kind: SymbolKind): IrDeclaration? {
|
private fun getDeclarationForCommonSignature(signature: IdSignature.CommonSignature, kind: SymbolKind): IrDeclaration? {
|
||||||
val packageFqName = FqName(signature.packageFqName)
|
val packageFqName = FqName(signature.packageFqName)
|
||||||
val nameSegments = signature.nameSegments
|
val nameSegments = signature.nameSegments
|
||||||
@@ -86,27 +85,32 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
?: return null
|
?: return null
|
||||||
}
|
}
|
||||||
val classId = firClass.classId
|
val classId = firClass.classId
|
||||||
val scope = with(fir2IrComponents) { firClass.unsubstitutedScope() }
|
val scope = with(components) { firClass.unsubstitutedScope() }
|
||||||
|
|
||||||
|
fun findIrClass(firClass: FirRegularClass): IrClass {
|
||||||
|
val irClassSymbol = classifierStorage.getIrClassSymbol(firClass.symbol)
|
||||||
|
return getDeclaration(irClassSymbol) as IrClass
|
||||||
|
}
|
||||||
|
|
||||||
when (kind) {
|
when (kind) {
|
||||||
SymbolKind.CLASS_SYMBOL -> {
|
SymbolKind.CLASS_SYMBOL -> {
|
||||||
firCandidates = listOf(firClass)
|
firCandidates = listOf(firClass)
|
||||||
parent = firParentClass?.let { classifierStorage.getIrClassSymbol(it.symbol).owner } ?: packageFragment
|
parent = firParentClass?.let { findIrClass(it) } ?: packageFragment
|
||||||
}
|
}
|
||||||
SymbolKind.ENUM_ENTRY_SYMBOL -> {
|
SymbolKind.ENUM_ENTRY_SYMBOL -> {
|
||||||
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
||||||
val firCandidate = firClass.declarations.singleOrNull { (it as? FirEnumEntry)?.name == lastName }
|
val firCandidate = firClass.declarations.singleOrNull { (it as? FirEnumEntry)?.name == lastName }
|
||||||
firCandidates = firCandidate?.let { listOf(it) } ?: return null
|
firCandidates = firCandidate?.let { listOf(it) } ?: return null
|
||||||
parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner
|
parent = findIrClass(firClass)
|
||||||
}
|
}
|
||||||
SymbolKind.CONSTRUCTOR_SYMBOL -> {
|
SymbolKind.CONSTRUCTOR_SYMBOL -> {
|
||||||
val constructors = mutableListOf<FirConstructor>()
|
val constructors = mutableListOf<FirConstructor>()
|
||||||
scope.processDeclaredConstructors { constructors.add(it.fir) }
|
scope.processDeclaredConstructors { constructors.add(it.fir) }
|
||||||
firCandidates = constructors
|
firCandidates = constructors
|
||||||
parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner
|
parent = findIrClass(firClass)
|
||||||
}
|
}
|
||||||
SymbolKind.FUNCTION_SYMBOL -> {
|
SymbolKind.FUNCTION_SYMBOL -> {
|
||||||
parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner
|
parent = findIrClass(firClass)
|
||||||
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
||||||
val functions = mutableListOf<FirSimpleFunction>()
|
val functions = mutableListOf<FirSimpleFunction>()
|
||||||
scope.processFunctionsByName(lastName) { functionSymbol ->
|
scope.processFunctionsByName(lastName) { functionSymbol ->
|
||||||
@@ -122,7 +126,7 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
firCandidates = functions
|
firCandidates = functions
|
||||||
}
|
}
|
||||||
SymbolKind.PROPERTY_SYMBOL -> {
|
SymbolKind.PROPERTY_SYMBOL -> {
|
||||||
parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner
|
parent = findIrClass(firClass)
|
||||||
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
||||||
val properties = mutableListOf<FirVariable>()
|
val properties = mutableListOf<FirVariable>()
|
||||||
scope.processPropertiesByName(lastName) { propertySymbol ->
|
scope.processPropertiesByName(lastName) { propertySymbol ->
|
||||||
@@ -136,7 +140,7 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
firCandidates = properties
|
firCandidates = properties
|
||||||
}
|
}
|
||||||
SymbolKind.FIELD_SYMBOL -> {
|
SymbolKind.FIELD_SYMBOL -> {
|
||||||
parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner
|
parent = findIrClass(firClass)
|
||||||
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
val lastName = Name.guessByFirstCharacter(nameSegments.last())
|
||||||
val fields = mutableListOf<FirVariable>()
|
val fields = mutableListOf<FirVariable>()
|
||||||
scope.processPropertiesByName(lastName) { propertySymbol ->
|
scope.processPropertiesByName(lastName) { propertySymbol ->
|
||||||
@@ -150,7 +154,7 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
else -> {
|
else -> {
|
||||||
val lastName = nameSegments.last()
|
val lastName = nameSegments.last()
|
||||||
firCandidates = firClass.declarations.filter { it is FirCallableDeclaration && it.symbol.name.asString() == lastName }
|
firCandidates = firClass.declarations.filter { it is FirCallableDeclaration && it.symbol.name.asString() == lastName }
|
||||||
parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner
|
parent = findIrClass(firClass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -159,9 +163,11 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
?: return null
|
?: return null
|
||||||
|
|
||||||
return when (kind) {
|
return when (kind) {
|
||||||
SymbolKind.CLASS_SYMBOL -> classifierStorage.getIrClassSymbol(
|
SymbolKind.CLASS_SYMBOL -> {
|
||||||
(firDeclaration as FirRegularClass).symbol
|
// TODO: effectively call getIrClassSymbol should be replaced with getOrCreateClass (KT-61348)
|
||||||
).owner
|
@OptIn(IrSymbolInternals::class)
|
||||||
|
classifierStorage.getIrClassSymbol((firDeclaration as FirRegularClass).symbol).owner
|
||||||
|
}
|
||||||
SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.getIrEnumEntry(
|
SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.getIrEnumEntry(
|
||||||
firDeclaration as FirEnumEntry, parent as IrClass
|
firDeclaration as FirEnumEntry, parent as IrClass
|
||||||
)
|
)
|
||||||
@@ -179,6 +185,8 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
}
|
}
|
||||||
SymbolKind.FIELD_SYMBOL -> {
|
SymbolKind.FIELD_SYMBOL -> {
|
||||||
val firField = firDeclaration as FirField
|
val firField = firDeclaration as FirField
|
||||||
|
// TODO: effectively call getIrClassSymbol should be replaced with getOrCreateField (KT-61348)
|
||||||
|
@OptIn(IrSymbolInternals::class)
|
||||||
declarationStorage.getIrFieldSymbol(firField.symbol).owner
|
declarationStorage.getIrFieldSymbol(firField.symbol).owner
|
||||||
}
|
}
|
||||||
else -> error("Don't know how to deal with this symbol kind: $kind")
|
else -> error("Don't know how to deal with this symbol kind: $kind")
|
||||||
@@ -192,10 +200,10 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider {
|
|||||||
candidate is FirClass || candidate is FirEnumEntry || candidate is FirTypeAlias
|
candidate is FirClass || candidate is FirEnumEntry || candidate is FirTypeAlias
|
||||||
} else {
|
} else {
|
||||||
// The next line should have singleOrNull, but in some cases we get multiple references to the same FIR declaration.
|
// The next line should have singleOrNull, but in some cases we get multiple references to the same FIR declaration.
|
||||||
with(fir2IrComponents.signatureComposer.mangler) { candidate.signatureMangle(compatibleMode = false) == hash }
|
with(components.signatureComposer.mangler) { candidate.signatureMangle(compatibleMode = false) == hash }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val FirClass.staticScopeForCallables: FirScope?
|
private val FirClass.staticScopeForCallables: FirScope?
|
||||||
get() = scopeProvider.getStaticMemberScopeForCallables(this, fir2IrComponents.session, fir2IrComponents.scopeSession)
|
get() = scopeProvider.getStaticMemberScopeForCallables(this, components.session, components.scopeSession)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user