[LL FIR] encapsulate FileAnnotationContainer resolution logic

As a file annotation container is required for resolution,
it should be closer to the resolution logic. Now only LLFirTargetResolver
will operate this logic, so we can change the logic in the future without
a big refactoring.
E.g., as the next step, this resolution can be integrated to the file

^KT-63042
This commit is contained in:
Dmitrii Gridin
2023-11-20 17:12:32 +01:00
committed by Space Team
parent bc1e9fd2ea
commit d450c1e91f
2 changed files with 8 additions and 26 deletions
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirClassWithAllCallablesResolveTarget import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirClassWithAllCallablesResolveTarget
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirResolveTarget
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirSingleResolveTarget import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.LLFirSingleResolveTarget
@@ -24,13 +23,13 @@ internal object LLFirResolveMultiDesignationCollector {
is FirFile -> listOf(LLFirSingleResolveTarget(target)) is FirFile -> listOf(LLFirSingleResolveTarget(target))
is FirSyntheticPropertyAccessor -> getDesignationsToResolve(target.delegate) is FirSyntheticPropertyAccessor -> getDesignationsToResolve(target.delegate)
is FirSyntheticProperty -> getDesignationsToResolve(target.getter) + target.setter?.let(::getDesignationsToResolve).orEmpty() is FirSyntheticProperty -> getDesignationsToResolve(target.getter) + target.setter?.let(::getDesignationsToResolve).orEmpty()
else -> getMainDesignationToResolve(target)?.withAnnotationContainer() else -> listOfNotNull(getMainDesignationToResolve(target))
} ?: emptyList() }
fun getDesignationsToResolveWithCallableMembers(target: FirRegularClass): List<LLFirResolveTarget> { fun getDesignationsToResolveWithCallableMembers(target: FirRegularClass): List<LLFirResolveTarget> {
val designation = target.tryCollectDesignationWithFile() ?: return emptyList() val designation = target.tryCollectDesignationWithFile() ?: return emptyList()
val resolveTarget = LLFirClassWithAllCallablesResolveTarget(designation.firFile, designation.path, target) val resolveTarget = LLFirClassWithAllCallablesResolveTarget(designation.firFile, designation.path, target)
return resolveTarget.withAnnotationContainer() return listOf(resolveTarget)
} }
fun getDesignationsToResolveRecursively(target: FirElementWithResolveState): List<LLFirResolveTarget> { fun getDesignationsToResolveRecursively(target: FirElementWithResolveState): List<LLFirResolveTarget> {
@@ -39,16 +38,7 @@ internal object LLFirResolveMultiDesignationCollector {
if (!target.shouldBeResolved()) return emptyList() if (!target.shouldBeResolved()) return emptyList()
val designation = target.tryCollectDesignationWithFile() ?: return emptyList() val designation = target.tryCollectDesignationWithFile() ?: return emptyList()
val resolveTarget = LLFirWholeElementResolveTarget(designation.firFile, designation.path, target) val resolveTarget = LLFirWholeElementResolveTarget(designation.firFile, designation.path, target)
return resolveTarget.withAnnotationContainer() return listOf(resolveTarget)
}
private fun LLFirResolveTarget.withAnnotationContainer(): List<LLFirResolveTarget> {
val annotationsContainer = firFile.annotationsContainer
if (annotationsContainer?.shouldBeResolved() != true) return listOf(this)
return buildList {
add(annotationsContainer.collectDesignationWithFile().asResolveTarget())
add(this@withAnnotationContainer)
}
} }
private fun getMainDesignationToResolve(target: FirElementWithResolveState): LLFirResolveTarget? { private fun getMainDesignationToResolve(target: FirElementWithResolveState): LLFirResolveTarget? {
@@ -9,10 +9,12 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirLockProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkPhase import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkPhase
import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.FirElementWithResolveState
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirScript import org.jetbrains.kotlin.fir.declarations.FirScript
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
internal abstract class LLFirTargetResolver( internal abstract class LLFirTargetResolver(
protected val resolveTarget: LLFirResolveTarget, protected val resolveTarget: LLFirResolveTarget,
@@ -24,17 +26,6 @@ internal abstract class LLFirTargetResolver(
val nestedClassesStack: List<FirRegularClass> get() = _nestedClassesStack.toList() val nestedClassesStack: List<FirRegularClass> get() = _nestedClassesStack.toList()
/**
* Must be executed without a lock
*/
private fun resolveFileAnnotationContainerIfNeeded(elementWithResolveState: FirElementWithResolveState) {
if (elementWithResolveState !is FirFile) return
val annotationContainer = elementWithResolveState.annotationsContainer ?: return
withFile(elementWithResolveState) {
performResolve(annotationContainer)
}
}
/** /**
* @see resolveDependencyTarget * @see resolveDependencyTarget
*/ */
@@ -49,7 +40,8 @@ internal abstract class LLFirTargetResolver(
private fun resolveDependencyTarget(target: FirElementWithResolveState) { private fun resolveDependencyTarget(target: FirElementWithResolveState) {
if (skipDependencyTargetResolutionStep) return if (skipDependencyTargetResolutionStep) return
resolveFileAnnotationContainerIfNeeded(target) if (target is FirFileAnnotationsContainer) return
resolveTarget.firFile.annotationsContainer?.lazyResolveToPhase(resolverPhase)
} }
override fun withFile(firFile: FirFile, action: () -> Unit) { override fun withFile(firFile: FirFile, action: () -> Unit) {