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 80886e0a806..193cc87ee41 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isScriptStatement import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.declarations.* @@ -19,7 +20,7 @@ internal object LLFirPhaseUpdater { ) { updatePhaseForNonLocals(target, newPhase, isTargetDeclaration = true) - if (updateForLocalDeclarations && target is FirCallableDeclaration) { + if (updateForLocalDeclarations) { when (target) { is FirFunction -> target.body?.accept(PhaseUpdatingTransformer, newPhase) is FirVariable -> { @@ -28,6 +29,14 @@ internal object LLFirPhaseUpdater { target.setter?.body?.accept(PhaseUpdatingTransformer, newPhase) target.backingField?.accept(PhaseUpdatingTransformer, newPhase) } + + is FirScript -> { + target.parameters.forEach { it.accept(PhaseUpdatingTransformer, newPhase) } + for (statement in target.statements) { + if (!statement.isScriptStatement) continue + statement.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 c474a60bf0e..2999c1d6fda 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 @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.builder.buildExplicitSuperReference import org.jetbrains.kotlin.fir.references.builder.buildExplicitThisReference +import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.dfa.FirControlFlowGraphReferenceImpl import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer @@ -37,6 +38,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.contracts.FirContractsDslNa import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isUsedInControlFlowGraphBuilderForClass +import org.jetbrains.kotlin.fir.visitors.transformSingle internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_RESOLVE) { override fun resolve( @@ -142,7 +144,7 @@ private class LLFirBodyTargetResolver( is FirField -> resolve(target, BodyStateKeepers.FIELD) is FirVariable -> resolve(target, BodyStateKeepers.VARIABLE) is FirAnonymousInitializer -> resolve(target, BodyStateKeepers.ANONYMOUS_INITIALIZER) - is FirScript, + is FirScript -> resolve(target, BodyStateKeepers.SCRIPT) is FirDanglingModifierList, is FirFileAnnotationsContainer, is FirTypeAlias, @@ -152,6 +154,22 @@ private class LLFirBodyTargetResolver( else -> throwUnexpectedFirElementError(target) } } + + override fun rawResolve(target: FirElementWithResolveState) { + if (target !is FirScript) return super.rawResolve(target) + + transformer.declarationsTransformer.withScript(target) { + target.parameters.forEach { it.transformSingle(transformer, ResolutionMode.ContextIndependent) } + target.statements.forEach { + if (it.isScriptStatement) { + transformer.firResolveContextCollector?.addStatementContext(it, transformer.context) + it.transformSingle(transformer, ResolutionMode.ContextIndependent) + } + } + + target + } + } } internal object BodyStateKeepers { 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 d8d929c38c8..5766d1aa1b4 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 @@ -196,7 +196,9 @@ val FirDeclaration.isGeneratedDeclaration internal inline fun FirScript.forEachDeclaration(action: (FirDeclaration) -> Unit) { for (statement in statements) { - if (statement !is FirDeclaration || statement.origin is FirDeclarationOrigin.ScriptCustomization) continue - action(statement) + if (statement.isScriptStatement) continue + action(statement as FirDeclaration) } } + +internal val FirStatement.isScriptStatement: Boolean get() = this !is FirDeclaration || origin is FirDeclarationOrigin.ScriptCustomization \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/fileStructure/classMemberPropertyScript.lazy.resolve.txt b/analysis/low-level-api-fir/testdata/fileStructure/classMemberPropertyScript.lazy.resolve.txt index e2487372a0c..72b4a297fd1 100644 --- a/analysis/low-level-api-fir/testdata/fileStructure/classMemberPropertyScript.lazy.resolve.txt +++ b/analysis/low-level-api-fir/testdata/fileStructure/classMemberPropertyScript.lazy.resolve.txt @@ -1,7 +1,7 @@ FILE: [ResolvedTo(IMPORTS)] classMemberPropertyScript.kts context(