[LL FIR] make FirDesignation.path type more precise. I's always a FirRegularClass

This commit is contained in:
Ilya Kirillov
2022-12-12 17:34:54 +01:00
committed by Space Team
parent cd83fec078
commit 573811a199
6 changed files with 29 additions and 34 deletions
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLookupTagWithFixedSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLookupTagWithFixedSymbol
class FirDesignationWithFile( class FirDesignationWithFile(
path: List<FirDeclaration>, path: List<FirRegularClass>,
target: FirElementWithResolvePhase, target: FirElementWithResolvePhase,
val firFile: FirFile val firFile: FirFile
) : FirDesignation( ) : FirDesignation(
@@ -40,7 +40,7 @@ class FirDesignationWithFile(
} }
open class FirDesignation( open class FirDesignation(
val path: List<FirDeclaration>, val path: List<FirRegularClass>,
val target: FirElementWithResolvePhase, val target: FirElementWithResolvePhase,
) { ) {
val firstNonFileDeclaration: FirElementWithResolvePhase val firstNonFileDeclaration: FirElementWithResolvePhase
@@ -52,20 +52,20 @@ open class FirDesignation(
} }
} }
private fun FirRegularClass.collectForNonLocal(): List<FirDeclaration> { private fun FirRegularClass.collectForNonLocal(): List<FirRegularClass> {
require(!isLocal) require(!isLocal)
val firProvider = moduleData.session.firProvider val firProvider = moduleData.session.firProvider
var containingClassId = classId.outerClassId var containingClassId = classId.outerClassId
val designation = mutableListOf<FirDeclaration>(this) val designation = mutableListOf<FirRegularClass>(this)
while (containingClassId != null) { while (containingClassId != null) {
val currentClass = firProvider.getFirClassifierByFqName(containingClassId) ?: break val currentClass = firProvider.getFirClassifierByFqName(containingClassId) as? FirRegularClass ?: break
designation.add(currentClass) designation.add(currentClass)
containingClassId = containingClassId.outerClassId containingClassId = containingClassId.outerClassId
} }
return designation return designation
} }
private fun collectDesignationPath(target: FirElementWithResolvePhase): List<FirDeclaration>? { private fun collectDesignationPath(target: FirElementWithResolvePhase): List<FirRegularClass>? {
val containingClass = when (target) { val containingClass = when (target) {
is FirCallableDeclaration -> { is FirCallableDeclaration -> {
if (target !is FirConstructor && target.symbol.callableId.isLocal) return null if (target !is FirConstructor && target.symbol.callableId.isLocal) return null
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder package org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.FirLazyBodiesCalculator
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -17,8 +19,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyRe
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.FirLazyBodiesCalculator
fun LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator( fun LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator(
designation: Iterator<FirElement>, designation: Iterator<FirElement>,
@@ -67,7 +67,10 @@ private class LLFirDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
if (returnTypeRef is FirImplicitTypeRef) { if (returnTypeRef is FirImplicitTypeRef) {
val declarationList = designation.filterIsInstance<FirDeclaration>() val declarationList = designation.filterIsInstance<FirDeclaration>()
check(declarationList.isNotEmpty()) { "Invalid empty declaration designation" } check(declarationList.isNotEmpty()) { "Invalid empty declaration designation" }
body(FirDesignation(declarationList.dropLast(1), this)) val designationPath = declarationList.dropLast(1)
check(designationPath.all { it is FirRegularClass })
@Suppress("UNCHECKED_CAST")
body(FirDesignation(designationPath as List<FirRegularClass>, this))
} }
} }
@@ -26,14 +26,14 @@ import org.jetbrains.kotlin.psi.*
internal object FirLazyBodiesCalculator { internal object FirLazyBodiesCalculator {
fun calculateLazyBodiesInside(designation: FirDesignation) { fun calculateLazyBodiesInside(designation: FirDesignation) {
designation.target.transform<FirElement, PersistentList<FirDeclaration>>( designation.target.transform<FirElement, PersistentList<FirRegularClass>>(
FirLazyBodiesCalculatorTransformer, FirLazyBodiesCalculatorTransformer,
designation.path.toPersistentList(), designation.path.toPersistentList(),
) )
} }
fun calculateLazyBodies(firFile: FirFile) { fun calculateLazyBodies(firFile: FirFile) {
firFile.transform<FirElement, PersistentList<FirDeclaration>>(FirLazyBodiesCalculatorTransformer, persistentListOf()) firFile.transform<FirElement, PersistentList<FirRegularClass>>(FirLazyBodiesCalculatorTransformer, persistentListOf())
} }
private fun replaceValueParameterDefaultValues(valueParameters: List<FirValueParameter>, newValueParameters: List<FirValueParameter>) { private fun replaceValueParameterDefaultValues(valueParameters: List<FirValueParameter>, newValueParameters: List<FirValueParameter>) {
@@ -171,16 +171,16 @@ internal object FirLazyBodiesCalculator {
|| firProperty.getExplicitBackingField()?.initializer is FirLazyExpression || firProperty.getExplicitBackingField()?.initializer is FirLazyExpression
} }
private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentList<FirDeclaration>>() { private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentList<FirRegularClass>>() {
override fun transformFile(file: FirFile, data: PersistentList<FirDeclaration>): FirFile { override fun transformFile(file: FirFile, data: PersistentList<FirRegularClass>): FirFile {
file.declarations.forEach { file.declarations.forEach {
it.transformSingle(this, data) it.transformSingle(this, data)
} }
return file return file
} }
override fun <E : FirElement> transformElement(element: E, data: PersistentList<FirDeclaration>): E { override fun <E : FirElement> transformElement(element: E, data: PersistentList<FirRegularClass>): E {
if (element is FirRegularClass) { if (element is FirRegularClass) {
val newList = data.add(element) val newList = data.add(element)
element.declarations.forEach { element.declarations.forEach {
@@ -193,7 +193,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
override fun transformSimpleFunction( override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: PersistentList<FirDeclaration> data: PersistentList<FirRegularClass>
): FirSimpleFunction { ): FirSimpleFunction {
if (FirLazyBodiesCalculator.needCalculatingLazyBodyForFunction(simpleFunction)) { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForFunction(simpleFunction)) {
val designation = FirDesignation(data, simpleFunction) val designation = FirDesignation(data, simpleFunction)
@@ -204,7 +204,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
override fun transformConstructor( override fun transformConstructor(
constructor: FirConstructor, constructor: FirConstructor,
data: PersistentList<FirDeclaration> data: PersistentList<FirRegularClass>
): FirConstructor { ): FirConstructor {
if (FirLazyBodiesCalculator.needCalculatingLazyBodyForConstructor(constructor)) { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForConstructor(constructor)) {
val designation = FirDesignation(data, constructor) val designation = FirDesignation(data, constructor)
@@ -213,7 +213,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
return constructor return constructor
} }
override fun transformProperty(property: FirProperty, data: PersistentList<FirDeclaration>): FirProperty { override fun transformProperty(property: FirProperty, data: PersistentList<FirRegularClass>): FirProperty {
if (FirLazyBodiesCalculator.needCalculatingLazyBodyForProperty(property)) { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForProperty(property)) {
val designation = FirDesignation(data, property) val designation = FirDesignation(data, property)
FirLazyBodiesCalculator.calculateLazyBodyForProperty(designation) FirLazyBodiesCalculator.calculateLazyBodyForProperty(designation)
@@ -221,11 +221,11 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
return property return property
} }
override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: PersistentList<FirDeclaration>): FirStatement { override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: PersistentList<FirRegularClass>): FirStatement {
return propertyAccessor.also { transformProperty(it.propertySymbol.fir, data) } return propertyAccessor.also { transformProperty(it.propertySymbol.fir, data) }
} }
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: PersistentList<FirDeclaration>): FirStatement { override fun transformEnumEntry(enumEntry: FirEnumEntry, data: PersistentList<FirRegularClass>): FirStatement {
if (enumEntry.initializer is FirLazyExpression) { if (enumEntry.initializer is FirLazyExpression) {
val designation = FirDesignation(data, enumEntry) val designation = FirDesignation(data, enumEntry)
FirLazyBodiesCalculator.calculateLazyInitializerForEnumEntry(designation) FirLazyBodiesCalculator.calculateLazyInitializerForEnumEntry(designation)
@@ -234,7 +234,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
} }
override fun transformAnonymousInitializer( override fun transformAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer, data: PersistentList<FirDeclaration> anonymousInitializer: FirAnonymousInitializer, data: PersistentList<FirRegularClass>
): FirAnonymousInitializer { ): FirAnonymousInitializer {
if (anonymousInitializer.body is FirLazyBlock) { if (anonymousInitializer.body is FirLazyBlock) {
val designation = FirDesignation(data, anonymousInitializer) val designation = FirDesignation(data, anonymousInitializer)
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
/** /**
* Transform designation into STATUS phase. Affects only for designation, target declaration, it's children and dependents * Transform designation into STATUS phase. Affects only for designation, members of designation classes, target declaration, it's children and dependents
*/ */
internal class LLFirDesignatedStatusResolveTransformer( internal class LLFirDesignatedStatusResolveTransformer(
private val designation: FirDesignationWithFile, private val designation: FirDesignationWithFile,
@@ -29,12 +29,11 @@ internal class LLFirDesignatedStatusResolveTransformer(
private val scopeSession: ScopeSession, private val scopeSession: ScopeSession,
) : LLFirLazyTransformer { ) : LLFirLazyTransformer {
private inner class FirDesignatedStatusResolveTransformerForIDE( private inner class FirDesignatedStatusResolveTransformerForIDE(
private val designationIterator: Iterator<FirElementWithResolvePhase> private val designationIterator: Iterator<FirRegularClass>,
) : FirStatusResolveTransformer(session, scopeSession, StatusComputationSession()) { ) : FirStatusResolveTransformer(session, scopeSession, StatusComputationSession()) {
private var isInsideTargetDeclaration = false private var isInsideTargetDeclaration = false
override fun transformClass(klass: FirClass, data: FirResolvedDeclarationStatus?): FirStatement { override fun transformClass(klass: FirClass, data: FirResolvedDeclarationStatus?): FirStatement {
return storeClass(klass) { return storeClass(klass) {
resolveClassTypeParameters(klass) resolveClassTypeParameters(klass)
@@ -71,14 +70,8 @@ internal class LLFirDesignatedStatusResolveTransformer(
designation.target.transform<FirDeclaration, _>(this, data = null) designation.target.transform<FirDeclaration, _>(this, data = null)
return return
} }
when (val nextElement = designationIterator.next()) { val nextClass = designationIterator.next()
is FirClass -> { transformClassContent(nextClass, data = null)
transformClassContent(nextElement, data = null)
}
else -> {
error("Unexpected declaration in designation: ${nextElement::class.qualifiedName}")
}
}
} }
} }
@@ -87,7 +80,7 @@ internal class LLFirDesignatedStatusResolveTransformer(
if (designation.target.resolvePhase >= FirResolvePhase.STATUS) return if (designation.target.resolvePhase >= FirResolvePhase.STATUS) return
designation.target.checkPhase(FirResolvePhase.TYPES) designation.target.checkPhase(FirResolvePhase.TYPES)
val designationIterator = designation.toSequence(includeTarget = false).iterator() val designationIterator = designation.path.iterator()
val transformer = FirDesignatedStatusResolveTransformerForIDE(designationIterator) val transformer = FirDesignatedStatusResolveTransformerForIDE(designationIterator)
phaseRunner.runPhaseWithCustomResolve(FirResolvePhase.STATUS) { phaseRunner.runPhaseWithCustomResolve(FirResolvePhase.STATUS) {
transformer.moveNextDeclaration() transformer.moveNextDeclaration()
@@ -137,7 +137,6 @@ internal class LLFirDesignatedSupertypeResolverTransformer(
updatePhaseDeep(designation.target, FirResolvePhase.SUPER_TYPES) updatePhaseDeep(designation.target, FirResolvePhase.SUPER_TYPES)
return return
} }
check(resolvableTarget is FirClassLikeDeclaration)
val targetPath = designation.path.dropLast(1) val targetPath = designation.path.dropLast(1)
FirDesignationWithFile(targetPath, resolvableTarget, designation.firFile) FirDesignationWithFile(targetPath, resolvableTarget, designation.firFile)
} else designation } else designation
@@ -58,7 +58,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF
} }
private class DesignationBuilder(private val elementToBuild: KtDeclaration) : FirVisitorVoid() { private class DesignationBuilder(private val elementToBuild: KtDeclaration) : FirVisitorVoid() {
private val path = mutableListOf<FirDeclaration>() private val path = mutableListOf<FirRegularClass>()
var resultDesignation: FirDesignation? = null var resultDesignation: FirDesignation? = null
private set private set