[LL FIR] LLFirResolveTarget: make firFile property optional
Not all targets belonged to any files (e.g., fake overrides), so we should be able to resolve them without a provided file ^KT-64243
This commit is contained in:
committed by
Space Team
parent
a7cfbe6d50
commit
6ffa8e6e98
+21
-9
@@ -25,9 +25,12 @@ import org.jetbrains.kotlin.fir.declarations.FirScript
|
|||||||
*/
|
*/
|
||||||
internal sealed class LLFirResolveTarget(
|
internal sealed class LLFirResolveTarget(
|
||||||
/**
|
/**
|
||||||
* [FirFile] where the targets are located
|
* [FirFile] where the targets are located.
|
||||||
|
* Can be null if [target] does not belong to any file.
|
||||||
|
* E.g., fake overrides.
|
||||||
|
* @see org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator
|
||||||
*/
|
*/
|
||||||
val firFile: FirFile,
|
val firFile: FirFile?,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of [FirRegularClass] which are the required to go from file to target declarations in the top-down order.
|
* The list of [FirRegularClass] which are the required to go from file to target declarations in the top-down order.
|
||||||
@@ -48,19 +51,28 @@ internal sealed class LLFirResolveTarget(
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Visit [path], [target] and optionally its subgraph.
|
* Visit [path], [target] and optionally its subgraph.
|
||||||
* Each nested declaration will be wrapped with corresponding [withFile], [withClass] and [withScript] recursively.
|
* Each nested declaration will be wrapped with corresponding [LLFirResolveTargetVisitor.withFile],
|
||||||
|
* [LLFirResolveTargetVisitor.withRegularClass] and [LLFirResolveTargetVisitor.withScript] recursively.
|
||||||
*/
|
*/
|
||||||
fun visit(visitor: LLFirResolveTargetVisitor) {
|
fun visit(visitor: LLFirResolveTargetVisitor) {
|
||||||
if (target is FirFile) {
|
if (target is FirFile) {
|
||||||
visitor.performAction(target)
|
visitor.performAction(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor.withFile(firFile) {
|
if (firFile != null) {
|
||||||
val pathIterator = path.iterator()
|
visitor.withFile(firFile) {
|
||||||
goToTarget(pathIterator, visitor)
|
goToTarget(visitor)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goToTarget(visitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun goToTarget(visitor: LLFirResolveTargetVisitor) {
|
||||||
|
val pathIterator = path.iterator()
|
||||||
|
goToTarget(pathIterator, visitor)
|
||||||
|
}
|
||||||
|
|
||||||
private fun goToTarget(
|
private fun goToTarget(
|
||||||
pathIterator: Iterator<FirDeclaration>,
|
pathIterator: Iterator<FirDeclaration>,
|
||||||
visitor: LLFirResolveTargetVisitor,
|
visitor: LLFirResolveTargetVisitor,
|
||||||
@@ -102,7 +114,7 @@ internal sealed class LLFirResolveTarget(
|
|||||||
append(this@LLFirResolveTarget::class.simpleName)
|
append(this@LLFirResolveTarget::class.simpleName)
|
||||||
append("(")
|
append("(")
|
||||||
buildList {
|
buildList {
|
||||||
add(firFile.name)
|
firFile?.name?.let(::add)
|
||||||
path.mapTo(this) {
|
path.mapTo(this) {
|
||||||
when (it) {
|
when (it) {
|
||||||
is FirRegularClass -> it.name
|
is FirRegularClass -> it.name
|
||||||
@@ -130,8 +142,8 @@ internal sealed class LLFirResolveTarget(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun pathWithScript(firFile: FirFile, path: List<FirRegularClass>, target: FirElementWithResolveState): List<FirDeclaration> {
|
private fun pathWithScript(firFile: FirFile?, path: List<FirRegularClass>, target: FirElementWithResolveState): List<FirDeclaration> {
|
||||||
if (target is FirFile || target is FirFileAnnotationsContainer || target is FirScript) return path
|
if (firFile == null || target is FirFile || target is FirFileAnnotationsContainer || target is FirScript) return path
|
||||||
val firScript = firFile.declarations.singleOrNull() as? FirScript ?: return path
|
val firScript = firFile.declarations.singleOrNull() as? FirScript ?: return path
|
||||||
return listOf(firScript) + path
|
return listOf(firScript) + path
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-6
@@ -11,12 +11,16 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
/**
|
/**
|
||||||
* [LLFirResolveTarget] representing single target to resolve. The [target] can be any of [FirElementWithResolveState]
|
* [LLFirResolveTarget] representing single target to resolve. The [target] can be any of [FirElementWithResolveState]
|
||||||
*/
|
*/
|
||||||
internal class LLFirSingleResolveTarget(
|
internal class LLFirSingleResolveTarget : LLFirResolveTarget {
|
||||||
firFile: FirFile,
|
constructor(firFile: FirFile) : super(firFile, emptyList(), firFile)
|
||||||
containerClasses: List<FirRegularClass>,
|
|
||||||
target: FirElementWithResolveState,
|
constructor(
|
||||||
) : LLFirResolveTarget(firFile, containerClasses, target) {
|
firFile: FirFile,
|
||||||
constructor(firFile: FirFile) : this(firFile, emptyList(), firFile)
|
containerClasses: List<FirRegularClass>,
|
||||||
|
target: FirElementWithResolveState,
|
||||||
|
) : super(firFile, containerClasses, target)
|
||||||
|
|
||||||
|
constructor(target: FirElementWithResolveState) : super(null, emptyList(), target)
|
||||||
|
|
||||||
override fun visitTargetElement(
|
override fun visitTargetElement(
|
||||||
element: FirElementWithResolveState,
|
element: FirElementWithResolveState,
|
||||||
|
|||||||
+1
-1
@@ -116,7 +116,7 @@ internal class LLFirModuleLazyDeclarationResolver(val moduleComponents: LLFirMod
|
|||||||
towerDataContextCollector: FirResolveContextCollector?,
|
towerDataContextCollector: FirResolveContextCollector?,
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
resolveFileToImportsWithLock(target.firFile)
|
target.firFile?.let(::resolveFileToImportsWithLock)
|
||||||
if (toPhase == FirResolvePhase.IMPORTS) return
|
if (toPhase == FirResolvePhase.IMPORTS) return
|
||||||
|
|
||||||
lazyResolveTargets(
|
lazyResolveTargets(
|
||||||
|
|||||||
+1
-1
@@ -73,7 +73,7 @@ internal abstract class LLFirTargetResolver(
|
|||||||
*/
|
*/
|
||||||
private fun resolveDependencies(target: FirElementWithResolveState) {
|
private fun resolveDependencies(target: FirElementWithResolveState) {
|
||||||
if (skipDependencyTargetResolutionStep || target is FirFileAnnotationsContainer) return
|
if (skipDependencyTargetResolutionStep || target is FirFileAnnotationsContainer) return
|
||||||
resolveTarget.firFile.annotationsContainer?.lazyResolveToPhase(resolverPhase)
|
resolveTarget.firFile?.annotationsContainer?.lazyResolveToPhase(resolverPhase)
|
||||||
|
|
||||||
val originalDeclaration = (target as? FirCallableDeclaration)?.originalIfFakeOverrideOrDelegated()
|
val originalDeclaration = (target as? FirCallableDeclaration)?.originalIfFakeOverrideOrDelegated()
|
||||||
when {
|
when {
|
||||||
|
|||||||
+1
-2
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
|||||||
import org.jetbrains.kotlin.fir.declarations.resolvePhase
|
import org.jetbrains.kotlin.fir.declarations.resolvePhase
|
||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhaseRecursively
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhaseRecursively
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.test.services.TestModuleStructure
|
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
import org.jetbrains.kotlin.test.services.assertions
|
import org.jetbrains.kotlin.test.services.assertions
|
||||||
|
|
||||||
@@ -42,7 +41,7 @@ abstract class AbstractFirLazyDeclarationResolveOverAllPhasesTest : AbstractFirL
|
|||||||
} else {
|
} else {
|
||||||
val firFile = firResolveSession.getOrBuildFirFile(ktFile)
|
val firFile = firResolveSession.getOrBuildFirFile(ktFile)
|
||||||
val designations = LLFirResolveMultiDesignationCollector.getDesignationsToResolve(elementToResolve)
|
val designations = LLFirResolveMultiDesignationCollector.getDesignationsToResolve(elementToResolve)
|
||||||
listOf(firFile).plus(designations.map { it.firFile }).distinct()
|
listOf(firFile).plus(designations.mapNotNull { it.firFile }).distinct()
|
||||||
}
|
}
|
||||||
|
|
||||||
val basePhase = elementToResolve.resolvePhase
|
val basePhase = elementToResolve.resolvePhase
|
||||||
|
|||||||
Reference in New Issue
Block a user