[LL FIR] unify FirDesignation

Now we have only one FirDesignation instead of `FirDesignation`,
`FirDesignationWithFile` and `FirDesignationWithScript`

This allows us to unify situations with `FirFile` and `FirScript`
in the path and unbind from `FirRegularClass`.
This commit only refactors code, the semantic is still the same yet

^KT-65345
This commit is contained in:
Dmitrii Gridin
2024-01-29 17:44:21 +01:00
committed by Space Team
parent 14b6f6d050
commit f06b17cbb2
12 changed files with 173 additions and 144 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -7,22 +7,21 @@ package org.jetbrains.kotlin.analysis.api.fir.types.qualifiers
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.toSequence
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.tryCollectDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment
import org.jetbrains.kotlin.fir.containingClassForLocal
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.LookupTagInternals
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
internal object UsualClassTypeQualifierBuilder {
fun buildQualifiers(
@@ -48,23 +47,18 @@ internal object UsualClassTypeQualifierBuilder {
val designation = classSymbolToRender.fir.let {
val nonLocalDesignation = it.tryCollectDesignation()
nonLocalDesignation?.toSequence(includeTarget = true)?.toList()
?: collectDesignationPathForLocal(it)
}
nonLocalDesignation?.toSequence(includeTarget = true)?.toList() ?: collectDesignationPathForLocal(it)
}.filterIsInstance<FirRegularClass>()
var typeParametersLeft = coneType.typeArguments.size
fun needToRenderTypeParameters(index: Int): Boolean {
if (typeParametersLeft <= 0) return false
return index == designation.lastIndex ||
(designation[index] as? FirRegularClass)?.isInner == true ||
(designation[index + 1] as? FirRegularClass)?.isInner == true
return index == designation.lastIndex || designation[index].isInner || designation[index + 1].isInner
}
val result = mutableListOf<KtClassTypeQualifier.KtResolvedClassTypeQualifier>()
designation.forEachIndexed { index, currentClass ->
check(currentClass is FirRegularClass)
val typeParameters = if (needToRenderTypeParameters(index)) {
val typeParametersCount = currentClass.typeParameters.count { it is FirTypeParameter }
val begin = typeParametersLeft - typeParametersCount
@@ -95,7 +89,7 @@ internal object UsualClassTypeQualifierBuilder {
return designation.asReversed()
}
private fun collectDesignationPathForLocal(declaration: FirClassLikeDeclaration): List<FirDeclaration> {
private fun collectDesignationPathForLocal(declaration: FirClassLikeDeclaration): List<FirClassLikeDeclaration> {
checkWithAttachment(
declaration.isLocal,
message = { "${declaration::class} is not local" }
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -42,15 +42,14 @@ private class FirDesignationState(val designation: FirDesignation) {
* Holds current declaration index
* if `currentIndex in [0, designation.path.lastIndex]` then current declaration is in path
* if `currentIndex == `designation.path.lastIndex + 1` then current declaration is our target declaration
* if `currentIndex > designation.path.lastIndex + 1` then we are inside current declaration
* if `currentIndex > designation.path.lastIndex + 1` then we are inside target declaration
*/
private var currentIndex = -1
fun canGoNext(): Boolean = currentIndex < designation.path.size
val currentDeclarationIfPresent: FirElementWithResolveState?
get() = when (currentIndex) {
in designation.path.indices -> designation.path[currentIndex]
get() = designation.path.getOrNull(currentIndex) ?: when (currentIndex) {
designation.path.size -> designation.target
else -> null
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -33,38 +33,101 @@ import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.utils.exceptions.ExceptionAttachmentBuilder
import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
class FirDesignationWithFile(
path: List<FirRegularClass>,
target: FirElementWithResolveState,
val firFile: FirFile
) : FirDesignation(
path,
target,
/**
* This class describes where locates [target] element and its essential [path].
*
* Usually a resolver uses [path] to resolve [target] in the proper context.
*
* @see org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget
*/
class FirDesignation(
/**
* The path to [target] element.
*
* ### Contracts:
* * Can contain [FirFile] only in the first position
* * Can contain [FirScript] only in the first or second position
*
* @see file
* @see fileOrNull
* @see script
* @see scriptOrNull
*/
val path: List<FirDeclaration>,
val target: FirElementWithResolveState,
) {
fun toSequenceWithFile(includeTarget: Boolean): Sequence<FirElementWithResolveState> = sequence {
yield(firFile)
yieldAll(path)
if (includeTarget) yield(target)
init {
for ((index, declaration) in path.withIndex()) {
when (declaration) {
is FirFile -> requireWithAttachment(
index == 0,
{ "${FirFile::class.simpleName} can be only in the first position of the path, but actual is '$index'" },
) {
withFirDesignationEntry("designation", this@FirDesignation)
}
is FirScript -> requireWithAttachment(
index == 0 || index == 1 && path.first() is FirFile,
{ "${FirScript::class.simpleName} can be only in the first or second position of the path, but actual is '$index'" },
) {
withFirDesignationEntry("designation", this@FirDesignation)
}
is FirRegularClass -> {}
else -> errorWithAttachment("Unexpected declaration type: ${declaration::class.simpleName}") {
withFirDesignationEntry("designation", this@FirDesignation)
}
}
}
}
val file: FirFile
get() = fileOrNull ?: errorWithAttachment("File is not found") {
withFirDesignationEntry("designation", this@FirDesignation)
}
val fileOrNull: FirFile? get() = path.firstOrNull() as? FirFile
val script: FirScript
get() = scriptOrNull ?: errorWithAttachment("Script is not found") {
withFirDesignationEntry("designation", this@FirDesignation)
}
val scriptOrNull: FirScript? get() = path.getOrNull(0) as? FirScript ?: path.getOrNull(1) as? FirScript
/**
* This property exists only for compatibility and should be dropped after KT-65345
*/
val classPath: List<FirRegularClass> get() = path.filterIsInstance<FirRegularClass>()
/**
* This constructor exists only for compatibility and should be dropped after KT-65345
*/
constructor(
firFile: FirFile,
path: List<FirRegularClass>,
target: FirElementWithResolveState,
) : this(listOf(firFile) + path, target)
}
fun ExceptionAttachmentBuilder.withFirDesignationEntry(name: String, designation: FirDesignation) {
withEntryGroup(name) {
for ((index, declaration) in designation.path.withIndex()) {
withFirEntry("path$index", declaration)
}
withFirEntry("target", designation.target)
}
}
class FirDesignationWithScript(
path: List<FirRegularClass>,
target: FirElementWithResolveState,
val firScript: FirScript,
): FirDesignation(path, target)
open class FirDesignation(
val path: List<FirRegularClass>,
val target: FirElementWithResolveState,
) {
fun toSequence(includeTarget: Boolean): Sequence<FirElementWithResolveState> = sequence {
yieldAll(path)
if (includeTarget) yield(target)
}
fun FirDesignation.toSequence(includeTarget: Boolean): Sequence<FirElementWithResolveState> = sequence {
yieldAll(path)
if (includeTarget) yield(target)
}
private fun collectDesignationPath(target: FirElementWithResolveState): List<FirRegularClass>? {
@@ -247,7 +310,7 @@ private fun findKotlinStdlibClass(classId: ClassId, target: FirDeclaration): Fir
return FirElementFinder.findClassifierWithClassId(firFile, classId) as? FirRegularClass
}
fun FirElementWithResolveState.collectDesignation(firFile: FirFile): FirDesignationWithFile =
fun FirElementWithResolveState.collectDesignation(firFile: FirFile): FirDesignation =
tryCollectDesignation(firFile) ?: errorWithAttachment("No designation of local declaration") {
withFirEntry("firFile", firFile)
}
@@ -258,15 +321,15 @@ fun FirElementWithResolveState.collectDesignation(): FirDesignation =
withFirEntry("FirDeclaration", this@collectDesignation)
}
fun FirElementWithResolveState.collectDesignationWithFile(): FirDesignationWithFile =
fun FirElementWithResolveState.collectDesignationWithFile(): FirDesignation =
tryCollectDesignationWithFile()
?: errorWithAttachment("No designation of local declaration") {
withFirEntry("FirDeclaration", this@collectDesignationWithFile)
}
fun FirElementWithResolveState.tryCollectDesignation(firFile: FirFile): FirDesignationWithFile? =
fun FirElementWithResolveState.tryCollectDesignation(firFile: FirFile): FirDesignation? =
collectDesignationPath(this)?.let {
FirDesignationWithFile(it, this, firFile)
FirDesignation(firFile, it, this)
}
fun FirElementWithResolveState.tryCollectDesignation(): FirDesignation? =
@@ -274,11 +337,11 @@ fun FirElementWithResolveState.tryCollectDesignation(): FirDesignation? =
FirDesignation(it, this)
}
fun FirElementWithResolveState.tryCollectDesignationWithFile(): FirDesignationWithFile? {
fun FirElementWithResolveState.tryCollectDesignationWithFile(): FirDesignation? {
return when (this) {
is FirScript, is FirCodeFragment, is FirFileAnnotationsContainer -> {
val firFile = getContainingFile() ?: return null
FirDesignationWithFile(path = emptyList(), this, firFile)
FirDesignation(firFile, path = emptyList(), this)
}
is FirSyntheticProperty, is FirSyntheticPropertyAccessor -> unexpectedElementError<FirElementWithResolveState>(this)
@@ -288,24 +351,24 @@ fun FirElementWithResolveState.tryCollectDesignationWithFile(): FirDesignationWi
val path = collectDesignationPath(this) ?: return null
val firFile = path.lastOrNull()?.getContainingFile() ?: getContainingFile() ?: return null
FirDesignationWithFile(path, this, firFile)
FirDesignation(firFile, path, this)
}
else -> unexpectedElementError<FirElementWithResolveState>(this)
}
}
private fun FirDeclaration.scriptDesignation(): FirDesignationWithFile? {
private fun FirDeclaration.scriptDesignation(): FirDesignation? {
return when {
this is FirAnonymousInitializer -> {
val firScriptSymbol = (containingDeclarationSymbol as? FirScriptSymbol) ?: return null
val firFile = firScriptSymbol.fir.getContainingFile() ?: return null
FirDesignationWithFile(path = emptyList(), firScriptSymbol.fir, firFile)
FirDesignation(firFile, path = emptyList(), firScriptSymbol.fir)
}
isScriptDependentDeclaration -> {
val firFile = getContainingFile() ?: return null
val firScript = firFile.declarations.singleOrNull() as? FirScript ?: return null
FirDesignationWithFile(path = emptyList(), firScript, firFile)
FirDesignation(firFile, path = emptyList(), firScript)
}
else -> null
}
@@ -1,24 +1,22 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirResolvableSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
internal fun LLFirResolveTarget.forEachPathElementAndTarget(action: (FirElementWithResolveState) -> Unit) {
path.forEach(action)
forEachTarget(action)
}
internal fun FirDesignationWithFile.asResolveTarget(): LLFirSingleResolveTarget = LLFirSingleResolveTarget(firFile, path, target)
internal fun FirDesignation.asResolveTarget(): LLFirSingleResolveTarget = LLFirSingleResolveTarget(
file,
classPath,
target,
)
/**
* Resolves the target to the specified [phase].
@@ -1,13 +1,14 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.fir
import org.jetbrains.kotlin.analysis.low.level.api.fir.ContextByDesignationCollector
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDesignationEntry
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.containingClassIdOrNull
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirElementWithResolveState
@@ -23,7 +24,7 @@ import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
private class ContextCollectingDiagnosticCollectorVisitor private constructor(
sessionHolder: SessionHolder,
designation: FirDesignationWithFile,
designation: FirDesignation,
) : AbstractDiagnosticCollectorVisitor(
PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(sessionHolder)
) {
@@ -45,11 +46,20 @@ private class ContextCollectingDiagnosticCollectorVisitor private constructor(
override fun checkElement(element: FirElement) {}
fun collect(): CheckerContextForProvider {
// Trigger the collector
contextCollector.nextStep()
return contextCollector.getCollectedContext()
}
companion object {
fun collect(sessionHolder: SessionHolder, designation: FirDesignationWithFile): CheckerContextForProvider {
val visitor = ContextCollectingDiagnosticCollectorVisitor(sessionHolder, designation)
designation.firFile.accept(visitor, null)
return visitor.contextCollector.getCollectedContext()
fun collect(sessionHolder: SessionHolder, designation: FirDesignation): CheckerContextForProvider {
requireWithAttachment(designation.fileOrNull != null, { "${FirFile::class.simpleName} is missed" }) {
withFirDesignationEntry("designation", designation)
}
return ContextCollectingDiagnosticCollectorVisitor(sessionHolder, designation).collect()
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirClassWithSpecificMembersResolveTarget
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.resolve
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.isImplicitConstructor
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
internal object FileElementFactory {
fun createFileStructureElement(
@@ -20,7 +20,7 @@ internal object FileElementFactory {
moduleComponents: LLFirModuleResolveComponents,
): FileStructureElement = when {
firDeclaration is FirRegularClass -> {
lazyResolveClassWithGeneratedMembers(firDeclaration, moduleComponents)
lazyResolveClassWithGeneratedMembers(firDeclaration)
ClassDeclarationStructureElement(firFile, firDeclaration, moduleComponents)
}
@@ -28,7 +28,7 @@ internal object FileElementFactory {
else -> DeclarationStructureElement(firFile, firDeclaration, moduleComponents)
}
private fun lazyResolveClassWithGeneratedMembers(firClass: FirRegularClass, moduleComponents: LLFirModuleResolveComponents) {
private fun lazyResolveClassWithGeneratedMembers(firClass: FirRegularClass) {
val classMembersToResolve = buildList {
for (member in firClass.declarations) {
when {
@@ -57,16 +57,12 @@ internal object FileElementFactory {
val firClassDesignation = firClass.collectDesignationWithFile()
val designationWithMembers = LLFirClassWithSpecificMembersResolveTarget(
firClassDesignation.firFile,
firClassDesignation.path,
firClassDesignation.file,
firClassDesignation.classPath,
firClass,
classMembersToResolve,
)
moduleComponents.firModuleLazyDeclarationResolver.lazyResolveTarget(
designationWithMembers,
FirResolvePhase.BODY_RESOLVE,
towerDataContextCollector = null
)
designationWithMembers.resolve(FirResolvePhase.BODY_RESOLVE)
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -46,7 +46,7 @@ import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
internal object FirLazyBodiesCalculator {
fun calculateBodies(designation: FirDesignation) {
designation.target.transform<FirElement, PersistentList<FirRegularClass>>(
designation.target.transformSingle(
FirTargetLazyBodiesCalculatorTransformer,
designation.path.toPersistentList(),
)
@@ -85,8 +85,10 @@ internal object FirLazyBodiesCalculator {
return newAnnotationCall.argumentList
}
fun createDeclarationsForScript(script: FirScript): List<FirDeclaration> {
val newScript = revive<FirScript>(FirDesignation(emptyList(), script))
fun createDeclarationsForScript(designation: FirDesignation): List<FirDeclaration> {
designation.target as FirScript
val newScript = revive<FirScript>(designation)
return newScript.declarations
}
@@ -747,7 +749,7 @@ private abstract class FirLazyAnnotationTransformer : FirTransformer<FirLazyAnno
}
private object FirAllLazyBodiesCalculatorTransformer : FirLazyBodiesCalculatorTransformer() {
override fun transformFile(file: FirFile, data: PersistentList<FirRegularClass>): FirFile {
override fun transformFile(file: FirFile, data: PersistentList<FirDeclaration>): FirFile {
file.declarations.forEach {
it.transformSingle(this, data)
}
@@ -755,7 +757,7 @@ private object FirAllLazyBodiesCalculatorTransformer : FirLazyBodiesCalculatorTr
return file
}
override fun <E : FirElement> transformElement(element: E, data: PersistentList<FirRegularClass>): E {
override fun <E : FirElement> transformElement(element: E, data: PersistentList<FirDeclaration>): E {
if (element is FirRegularClass) {
val newList = data.add(element)
element.declarations.forEach {
@@ -770,10 +772,10 @@ private object FirAllLazyBodiesCalculatorTransformer : FirLazyBodiesCalculatorTr
private object FirTargetLazyBodiesCalculatorTransformer : FirLazyBodiesCalculatorTransformer()
private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentList<FirRegularClass>>() {
override fun <E : FirElement> transformElement(element: E, data: PersistentList<FirRegularClass>): E = element
private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentList<FirDeclaration>>() {
override fun <E : FirElement> transformElement(element: E, data: PersistentList<FirDeclaration>): E = element
override fun transformField(field: FirField, data: PersistentList<FirRegularClass>): FirStatement {
override fun transformField(field: FirField, data: PersistentList<FirDeclaration>): FirStatement {
if (field.initializer is FirLazyExpression) {
val designation = FirDesignation(data, field)
calculateLazyBodiesForField(designation)
@@ -784,7 +786,7 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
data: PersistentList<FirRegularClass>,
data: PersistentList<FirDeclaration>,
): FirSimpleFunction {
if (needCalculatingLazyBodyForFunction(simpleFunction)) {
val designation = FirDesignation(data, simpleFunction)
@@ -796,7 +798,7 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
override fun transformConstructor(
constructor: FirConstructor,
data: PersistentList<FirRegularClass>,
data: PersistentList<FirDeclaration>,
): FirConstructor {
if (needCalculatingLazyBodyForConstructor(constructor)) {
val designation = FirDesignation(data, constructor)
@@ -808,10 +810,10 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
override fun transformErrorPrimaryConstructor(
errorPrimaryConstructor: FirErrorPrimaryConstructor,
data: PersistentList<FirRegularClass>,
data: PersistentList<FirDeclaration>,
) = transformConstructor(errorPrimaryConstructor, data)
override fun transformProperty(property: FirProperty, data: PersistentList<FirRegularClass>): FirProperty {
override fun transformProperty(property: FirProperty, data: PersistentList<FirDeclaration>): FirProperty {
if (needCalculatingLazyBodyForProperty(property)) {
val designation = FirDesignation(data, property)
calculateLazyBodyForProperty(designation)
@@ -820,11 +822,11 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
return property
}
override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: PersistentList<FirRegularClass>): FirStatement {
override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: PersistentList<FirDeclaration>): FirStatement {
return propertyAccessor.also { transformProperty(it.propertySymbol.fir, data) }
}
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: PersistentList<FirRegularClass>): FirStatement {
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: PersistentList<FirDeclaration>): FirStatement {
if (enumEntry.initializer is FirLazyExpression) {
val designation = FirDesignation(data, enumEntry)
calculateLazyInitializerForEnumEntry(designation)
@@ -834,7 +836,7 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
}
override fun transformAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer, data: PersistentList<FirRegularClass>,
anonymousInitializer: FirAnonymousInitializer, data: PersistentList<FirDeclaration>,
): FirAnonymousInitializer {
if (anonymousInitializer.body is FirLazyBlock) {
val designation = FirDesignation(data, anonymousInitializer)
@@ -844,7 +846,7 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
return anonymousInitializer
}
override fun transformCodeFragment(codeFragment: FirCodeFragment, data: PersistentList<FirRegularClass>): FirCodeFragment {
override fun transformCodeFragment(codeFragment: FirCodeFragment, data: PersistentList<FirDeclaration>): FirCodeFragment {
if (codeFragment.block is FirLazyBlock) {
val designation = FirDesignation(data, codeFragment)
calculateLazyBodyForCodeFragment(designation)
@@ -853,7 +855,7 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer<Persi
return codeFragment
}
override fun transformScript(script: FirScript, data: PersistentList<FirRegularClass>): FirScript {
override fun transformScript(script: FirScript, data: PersistentList<FirDeclaration>): FirScript {
for (declaration in script.declarations) {
if (declaration !is FirAnonymousInitializer) continue
declaration.accept(this, data)
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -29,7 +29,7 @@ internal object LLFirResolveMultiDesignationCollector {
fun getDesignationsToResolveWithCallableMembers(target: FirRegularClass): List<LLFirResolveTarget> {
val designation = target.tryCollectDesignationWithFile() ?: return emptyList()
val resolveTarget = LLFirClassWithAllCallablesResolveTarget(designation.firFile, designation.path, target)
val resolveTarget = LLFirClassWithAllCallablesResolveTarget(designation.file, designation.classPath, target)
return listOf(resolveTarget)
}
@@ -42,7 +42,7 @@ internal object LLFirResolveMultiDesignationCollector {
}
val designation = target.tryCollectDesignationWithFile() ?: return emptyList()
val resolveTarget = LLFirWholeElementResolveTarget(designation.firFile, designation.path, target)
val resolveTarget = LLFirWholeElementResolveTarget(designation.file, designation.classPath, target)
return listOf(resolveTarget)
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -105,7 +105,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
builder.context.forcedContainerSymbol = designation.target.symbol
}
return builder.moveNext(designation.path.iterator(), containingClass = null)
return builder.moveNext(designation.classPath.iterator(), containingClass = null)
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -358,7 +358,7 @@ internal object BodyStateKeepers {
lastProperty.bodyResolveState != FirPropertyBodyResolveState.ALL_BODIES_RESOLVED
) {
add(RESULT_PROPERTY, designation)
val recreatedDeclarations = FirLazyBodiesCalculator.createDeclarationsForScript(script)
val recreatedDeclarations = FirLazyBodiesCalculator.createDeclarationsForScript(designation)
requireSameSize(oldDeclarations, recreatedDeclarations)
lastProperty.replaceInitializer((recreatedDeclarations.last() as FirProperty).initializer)
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -8,11 +8,10 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util
import com.intellij.openapi.progress.ProgressManager
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignationWithScript
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration
import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.isAutonomousDeclaration
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.ContextKind
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.Context
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.ContextKind
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector.FilterResponse
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
@@ -42,7 +41,6 @@ import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.psiUtil.isPropertyParameter
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.utils.yieldIfNotNull
import java.util.ArrayList
object ContextCollector {
@@ -126,11 +124,10 @@ object ContextCollector {
val designationPath = FirElementFinder.collectDesignationPath(file, contextKtDeclaration)
if (designationPath != null) {
val script = file.declarations.singleOrNull() as? FirScript
return if (script == null || script === designationPath.target) {
FirDesignation(designationPath.path, designationPath.target)
} else {
FirDesignationWithScript(designationPath.path, designationPath.target, script)
FirDesignation(listOf(script) + designationPath.path, designationPath.target)
}
}
}
@@ -177,7 +174,6 @@ object ContextCollector {
private class DesignationInterceptor(private val designation: FirDesignation) : () -> FirElement? {
private val targetIterator = iterator {
yieldIfNotNull((designation as? FirDesignationWithScript)?.firScript)
yieldAll(designation.path)
yield(designation.target)
}
@@ -1,20 +1,15 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.low.level.api.fir.util
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDesignation
import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment
import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess
import org.jetbrains.kotlin.fir.declarations.resolvePhase
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment
internal fun FirElementWithResolveState.checkPhase(requiredResolvePhase: FirResolvePhase) {
@OptIn(ResolveStateAccess::class)
@@ -26,27 +21,3 @@ internal fun FirElementWithResolveState.checkPhase(requiredResolvePhase: FirReso
withFirEntry("firDeclaration", this@checkPhase)
}
}
internal fun FirDesignation.checkPathPhase(firResolvePhase: FirResolvePhase) =
path.forEach { it.checkPhase(firResolvePhase) }
internal fun FirDesignation.checkDesignationPhase(firResolvePhase: FirResolvePhase) {
checkPathPhase(firResolvePhase)
target.checkPhase(firResolvePhase)
}
internal fun FirDesignation.checkDesignationPhaseForClasses(firResolvePhase: FirResolvePhase) {
checkPathPhase(firResolvePhase)
if (target is FirClassLikeDeclaration) {
@OptIn(ResolveStateAccess::class)
val resolveState = target.resolveState
check(resolveState.resolvePhase >= firResolvePhase) {
"Expected $firResolvePhase but found $resolveState"
}
}
}
internal fun FirDesignation.isTargetCallableDeclarationAndInPhase(firResolvePhase: FirResolvePhase): Boolean =
(target as? FirCallableDeclaration)?.let { it.resolvePhase >= firResolvePhase } ?: false
internal fun FirDesignation.targetContainingDeclaration(): FirDeclaration? = path.lastOrNull()