diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortenerWholeFile/scriptFileWithoutImportStatements.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortenerWholeFile/scriptFileWithoutImportStatements.txt index 51823200b2f..99fd1d5116c 100644 --- a/analysis/analysis-api/testData/components/referenceShortener/referenceShortenerWholeFile/scriptFileWithoutImportStatements.txt +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortenerWholeFile/scriptFileWithoutImportStatements.txt @@ -1,6 +1,4 @@ with DO_NOT_SHORTEN: with SHORTEN_IF_ALREADY_IMPORTED: with SHORTEN_AND_IMPORT: -[type] a.b.c.dependency.Foo with SHORTEN_AND_STAR_IMPORT: -[type] a.b.c.dependency.Foo diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTarget.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTarget.kt index da165d5a4b3..3f7818ef2ab 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTarget.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTarget.kt @@ -7,10 +7,13 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets 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.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.fir.FirElementWithResolveState +import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.FirScript import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment @@ -27,9 +30,9 @@ sealed class LLFirResolveTarget( 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 [FirScript] and [FirRegularClass] which are the required to go from file to target declarations in the top-down order. * - * If resolve target is [FirRegularClass] itself, it's not included into the [path] + * If resolve target is [FirRegularClass] or [FirScript] itself, it's not included into the [path] */ val path: List, ) { @@ -43,7 +46,14 @@ sealed class LLFirResolveTarget( append("(") buildList { add(firFile.name) - path.mapTo(this) { it.name.asString() } + path.mapTo(this) { + when (it) { + is FirRegularClass -> it.name + is FirScript -> it.name + else -> errorWithFirSpecificEntries("Unsupported path declaration: ${it::class.simpleName}", fir = it) + } + } + add(toStringForTarget()) }.joinTo(this, separator = " -> ") append(")") diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTargetWithDedicatedElement.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTargetWithDedicatedElement.kt index d7a51ab7bb0..aaf18c7698e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTargetWithDedicatedElement.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirResolveTargetWithDedicatedElement.kt @@ -6,8 +6,11 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets import org.jetbrains.kotlin.fir.FirElementWithResolveState +import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer +import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirScript /** * [LLFirResolveTarget] representing a target with a dedicated main element. @@ -19,5 +22,11 @@ sealed class LLFirResolveTargetWithDedicatedElement, target: FirElementWithResolveState): List { + if (target is FirFile || target is FirFileAnnotationsContainer || target is FirScript) return path + val firScript = firFile.declarations.singleOrNull() as? FirScript ?: return path + return listOf(firScript) + path +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirSingleResolveTarget.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirSingleResolveTarget.kt index c35d73fb6a4..a2c8a71bff6 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirSingleResolveTarget.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirSingleResolveTarget.kt @@ -27,6 +27,7 @@ class LLFirSingleResolveTarget( is FirCallableDeclaration -> target.symbol.name.asString() is FirAnonymousInitializer -> ("") is FirFileAnnotationsContainer -> "" + is FirScript -> target.name.asString() else -> "???" } } \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirWholeFileResolveTarget.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirWholeFileResolveTarget.kt index c4f41d6bbbb..89dc36c34e3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirWholeFileResolveTarget.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/targets/LLFirWholeFileResolveTarget.kt @@ -6,10 +6,10 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api.targets import org.jetbrains.kotlin.analysis.low.level.api.fir.util.forEachDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isDeclarationContainer import org.jetbrains.kotlin.fir.FirElementWithResolveState +import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.FirScript /** * [LLFirResolveTarget] representing all declarations in file. All of them are going to be resolved. @@ -18,9 +18,8 @@ class LLFirWholeFileResolveTarget(firFile: FirFile) : LLFirResolveTarget(firFile override fun forEachTarget(action: (FirElementWithResolveState) -> Unit) { fun goInside(target: FirElementWithResolveState) { action(target) - when (target) { - is FirRegularClass -> target.declarations.forEach(::goInside) - is FirScript -> target.forEachDeclaration(::goInside) + if (target is FirDeclaration && target.isDeclarationContainer) { + target.forEachDeclaration(::goInside) } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt index 71b2f6cd3fb..30ae63adc2f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAbstractBodyTargetResolver.kt @@ -45,6 +45,16 @@ internal abstract class LLFirAbstractBodyTargetResolver( } } + override fun withScript(firScript: FirScript, action: () -> Unit) { + transformer.context.withScopesForScript(firScript, transformer.components) { + transformer.firResolveContextCollector?.let { collector -> + collector.addDeclarationContext(firScript, transformer.context) + } + + action() + } + } + override fun withFile(firFile: FirFile, action: () -> Unit) { transformer.context.withFile(firFile, transformer.components) { transformer.firResolveContextCollector?.addFileContext(firFile, transformer.context.towerDataContext) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt index 11d806381a1..60ac7c337f9 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirAnnotationArgumentsLazyResolver.kt @@ -76,14 +76,16 @@ private class LLFirAnnotationArgumentsTargetResolver( contextCollector.addDeclarationContext(target, bodyResolveContext) } + is FirScript -> {} + else -> contextCollector.addDeclarationContext(target, bodyResolveContext) } } - if (target is FirRegularClass) { - withRegularClass(target) { - contextCollector.addDeclarationContext(target, bodyResolveContext) - } + when (target) { + is FirRegularClass -> withRegularClass(target) { contextCollector.addDeclarationContext(target, bodyResolveContext) } + is FirScript -> withScript(target) { contextCollector.addDeclarationContext(target, bodyResolveContext) } + else -> {} } } 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 ec6ba56d098..890262f6180 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 @@ -8,7 +8,9 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers 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.util.checkPhase +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.analysis.low.level.api.fir.util.forEachDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isDeclarationContainer import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile @@ -28,6 +30,10 @@ internal abstract class LLFirTargetResolver( protected abstract fun withFile(firFile: FirFile, action: () -> Unit) + protected open fun withScript(firScript: FirScript, action: () -> Unit) { + action() + } + @Deprecated("Should never be called directly, only for override purposes, please use withRegularClass", level = DeprecationLevel.ERROR) protected abstract fun withRegularClassImpl(firClass: FirRegularClass, action: () -> Unit) @@ -50,11 +56,15 @@ internal abstract class LLFirTargetResolver( } } - private fun goToTargets(iterator: Iterator) { - if (iterator.hasNext()) { - val firClass = iterator.next() - withRegularClass(firClass) { - goToTargets(iterator) + private fun goToTargets(path: Iterator) { + if (path.hasNext()) { + when (val firDeclaration = path.next()) { + is FirRegularClass -> withRegularClass(firDeclaration) { goToTargets(path) } + is FirScript -> withScript(firDeclaration) { goToTargets(path) } + else -> errorWithFirSpecificEntries( + "Unexpected declaration in path: ${firDeclaration::class.simpleName}", + fir = firDeclaration, + ) } } else { when (resolveTarget) { @@ -94,14 +104,18 @@ internal abstract class LLFirTargetResolver( private fun resolveTargetWithNestedDeclarations(target: FirElementWithResolveState) { performResolve(target) - when (target) { - is FirRegularClass -> withRegularClass(target) { - for (member in target.declarations) { - resolveTargetWithNestedDeclarations(member) - } + when { + target !is FirDeclaration || !target.isDeclarationContainer -> {} + + target is FirRegularClass -> withRegularClass(target) { + target.forEachDeclaration(::resolveTargetWithNestedDeclarations) } - is FirScript -> target.forEachDeclaration(::resolveTargetWithNestedDeclarations) + target is FirScript -> withScript(target) { + target.forEachDeclaration(::resolveTargetWithNestedDeclarations) + } + + else -> errorWithFirSpecificEntries("Unexpected declaration: ${target::class.simpleName}", fir = target) } } 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 23ae7482e0d..5f15644c943 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 @@ -206,4 +206,18 @@ internal inline fun FirScript.forEachDeclaration(action: (FirDeclaration) -> Uni } } +internal inline fun FirRegularClass.forEachDeclaration(action: (FirDeclaration) -> Unit) { + declarations.forEach(action) +} + +internal val FirDeclaration.isDeclarationContainer: Boolean get() = this is FirRegularClass || this is FirScript + +internal inline fun FirDeclaration.forEachDeclaration(action: (FirDeclaration) -> Unit) { + when (this) { + is FirRegularClass -> forEachDeclaration(action) + is FirScript -> forEachDeclaration(action) + else -> errorWithFirSpecificEntries("Unsupported declarations container", fir = this) + } +} + 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/script.lazy.resolve.txt b/analysis/low-level-api-fir/testdata/fileStructure/script.lazy.resolve.txt index 0f4487af87f..d94a515ff82 100644 --- a/analysis/low-level-api-fir/testdata/fileStructure/script.lazy.resolve.txt +++ b/analysis/low-level-api-fir/testdata/fileStructure/script.lazy.resolve.txt @@ -41,12 +41,12 @@ FILE: [ResolvedTo(IMPORTS)] script.kts this@R|special/anonymous|.R|/Builder.execute|() } ) - public final [ResolvedTo(BODY_RESOLVE)] val builder: = #( = [ResolvedTo(BODY_RESOLVE)] build@fun (): R|kotlin/Unit| { - # = String(321) + public final [ResolvedTo(BODY_RESOLVE)] val builder: R|Builder| = R|/build|( = [ResolvedTo(BODY_RESOLVE)] build@fun R|Builder|.(): R|kotlin/Unit| { + this@R|special/anonymous|.R|/Builder.version| = String(321) } ) - public [ResolvedTo(BODY_RESOLVE)] get(): + public [ResolvedTo(BODY_RESOLVE)] get(): R|Builder| - public final [ResolvedTo(BODY_RESOLVE)] val $$result: = R|/builder|.#() - public [ResolvedTo(BODY_RESOLVE)] get(): + public final [ResolvedTo(BODY_RESOLVE)] val $$result: R|kotlin/Unit| = R|/builder|.R|/Builder.execute|() + public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/Unit| diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/annotationApplicationArgumentScript.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/annotationApplicationArgumentScript.txt index e864c22e563..67f20e8658b 100644 --- a/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/annotationApplicationArgumentScript.txt +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/annotationApplicationArgumentScript.txt @@ -7,8 +7,8 @@ String(y) FIR FILE: FILE: [ResolvedTo(IMPORTS)] annotationApplicationArgumentScript.kts - context(