diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirPhaseUpdater.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirPhaseUpdater.kt index e218a4a9f34..d7431e57648 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirPhaseUpdater.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/LLFirPhaseUpdater.kt @@ -30,7 +30,6 @@ internal object LLFirPhaseUpdater { } is FirAnonymousInitializer -> target.body?.accept(PhaseUpdatingTransformer, newPhase) - is FirScript -> target.parameters.forEach { it.accept(PhaseUpdatingTransformer, newPhase) } is FirCodeFragment -> target.block.accept(PhaseUpdatingTransformer, newPhase) } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt index 3a19c6af47b..94cdc2b192f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirBodyLazyResolver.kt @@ -42,7 +42,6 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.isResolved import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry -import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.utils.exceptions.checkWithAttachment @@ -154,7 +153,7 @@ private class LLFirBodyTargetResolver(target: LLFirResolveTarget) : LLFirAbstrac // resolve properties so they are available for CFG building in resolveScript resolveMembersForControlFlowGraph(target) performCustomResolveUnderLock(target) { - resolve(target, BodyStateKeepers.SCRIPT) + calculateControlFlowGraph(target) } return true @@ -318,31 +317,13 @@ private class LLFirBodyTargetResolver(target: LLFirResolveTarget) : LLFirAbstrac } override fun rawResolve(target: FirElementWithResolveState) { - when (target) { - is FirScript -> { - resolveScript(target) - calculateControlFlowGraph(target) - } - - else -> super.rawResolve(target) - } + super.rawResolve(target) LLFirDeclarationModificationService.bodyResolved(target, resolverPhase) } - - private fun resolveScript(script: FirScript) { - transformer.declarationsTransformer.withScript(script) { - script.parameters.forEach { it.transformSingle(transformer, ResolutionMode.ContextIndependent) } - script - } - } } internal object BodyStateKeepers { - val SCRIPT: StateKeeper = stateKeeper { _, _ -> - add(FirScript::controlFlowGraphReference, FirScript::replaceControlFlowGraphReference) - } - val CODE_FRAGMENT: StateKeeper = stateKeeper { _, _ -> add(FirCodeFragment::block, FirCodeFragment::replaceBlock, ::blockGuard) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt index 0fa02b68d0c..874a4e348c1 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTargetResolver.kt @@ -164,6 +164,9 @@ internal sealed class LLFirTargetResolver( target is FirField && target.origin == FirDeclarationOrigin.Synthetic.DelegateField || target is FirConstructor -> { containingClass(target).lazyResolveToPhase(resolverPhase) } + + // We should resolve all script parameters for consistency as they are part of the script and visible from the beginning + target is FirScript -> target.parameters.forEach { it.lazyResolveToPhase(resolverPhase) } } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt index e307aa9228b..01fdd82e40a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirTypeLazyResolver.kt @@ -175,8 +175,8 @@ private class LLFirTypeTargetResolver(target: LLFirResolveTarget) : LLFirTargetR } private fun resolveScriptTypes(firScript: FirScript) { - firScript.annotations.forEach { it.accept(transformer, null) } - firScript.contextReceivers.forEach { it.accept(transformer, null) } + firScript.transformAnnotations(transformer, null) + firScript.transformContextReceivers(transformer, null) } private fun resolveClassTypes(firClass: FirRegularClass) { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirElementFinder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirElementFinder.kt index 8dd87706309..a084c10b847 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirElementFinder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirElementFinder.kt @@ -104,6 +104,11 @@ internal object FirElementFinder { subDeclaration is FirScript -> { path += subDeclaration + val scriptParameters = subDeclaration.parameters + if (find(scriptParameters, classIdPathIndex)) { + return true + } + val scriptDeclarations = subDeclaration.declarations if (find(scriptDeclarations, classIdPathIndex)) { return true diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt index bf4795cb365..95e5a37d8f1 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/declarationUtils.kt @@ -204,6 +204,10 @@ val FirDeclaration.isGeneratedDeclaration get() = realPsi == null internal inline fun FirScript.forEachDeclaration(action: (FirDeclaration) -> Unit) { + for (property in parameters) { + action(property) + } + for (statement in declarations) { action(statement) } @@ -240,6 +244,9 @@ internal val FirCallableSymbol<*>.isLocalForLazyResolutionPurposes: Boolean // Destructuring declaration container should be treated as a non-local as it is a top-level script declaration fir.origin == FirDeclarationOrigin.Synthetic.ScriptTopLevelDestructuringDeclarationContainer -> false + // Script parameters should be treated as non-locals as they are visible from FirScript + fir.origin == FirDeclarationOrigin.ScriptCustomization.Parameter || fir.origin == FirDeclarationOrigin.ScriptCustomization.ParameterFromBaseClass -> false + // We should treat destructuring declaration entries as non-local explicitly as its CallableId is local // TODO: can be dropped after KT-65727 (fir as? FirProperty)?.destructuringDeclarationContainerVariable != null -> false diff --git a/analysis/low-level-api-fir/testData/contextCollector/scripts/insideClassBody.txt b/analysis/low-level-api-fir/testData/contextCollector/scripts/insideClassBody.txt index 6d6061db3ac..db1d918d5c1 100644 --- a/analysis/low-level-api-fir/testData/contextCollector/scripts/insideClassBody.txt +++ b/analysis/low-level-api-fir/testData/contextCollector/scripts/insideClassBody.txt @@ -42,7 +42,7 @@ Tower Data Context: FILE: [ResolvedTo(IMPORTS)] insideClassBody.kts context(