diff --git a/analysis/analysis-api/testData/components/referenceShortener/shortenRange/callInsideScriptExpression.txt b/analysis/analysis-api/testData/components/referenceShortener/shortenRange/callInsideScriptExpression.txt index cc6d7017164..ee6b4ea2911 100644 --- a/analysis/analysis-api/testData/components/referenceShortener/shortenRange/callInsideScriptExpression.txt +++ b/analysis/analysis-api/testData/components/referenceShortener/shortenRange/callInsideScriptExpression.txt @@ -3,7 +3,6 @@ with default settings: [qualifier] one.A with DO_NOT_SHORTEN: with SHORTEN_IF_ALREADY_IMPORTED: -[qualifier] one.A with SHORTEN_AND_IMPORT: [qualifier] one.A with SHORTEN_AND_STAR_IMPORT: diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt index 2441e1a6f82..f9a9fc28c0d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDesignation.kt @@ -334,9 +334,6 @@ fun FirElementWithResolveState.tryCollectDesignationWithFile(): FirDesignation? return when (this) { is FirSyntheticProperty, is FirSyntheticPropertyAccessor -> unexpectedElementError(this) is FirFileAnnotationsContainer, is FirDeclaration -> { - val scriptDesignation = (this as? FirDeclaration)?.scriptDesignation() - if (scriptDesignation != null) return scriptDesignation - val path = collectDesignationPath(this) ?: return null val firFile = path.lastOrNull()?.getContainingFile() ?: getContainingFile() ?: return null FirDesignation(path = listOf(firFile) + path, target = this) @@ -346,17 +343,6 @@ fun FirElementWithResolveState.tryCollectDesignationWithFile(): FirDesignation? } } -private fun FirDeclaration.scriptDesignation(): FirDesignation? { - return when { - this is FirAnonymousInitializer -> { - val firScriptSymbol = (containingDeclarationSymbol as? FirScriptSymbol) ?: return null - val firFile = firScriptSymbol.fir.getContainingFile() ?: return null - FirDesignation(path = listOf(firFile), target = firScriptSymbol.fir) - } - else -> null - } -} - internal fun patchDesignationPathIfNeeded(target: FirElementWithResolveState, targetPath: List): List { return patchDesignationPathForCopy(target, targetPath) ?: targetPath } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt index 6e5747975f6..4925c2a3f24 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -302,12 +302,7 @@ internal fun getNonLocalContainingDeclaration( when (parent) { is KtScript -> propose(parent) is KtDestructuringDeclaration -> propose(parent) - is KtScriptInitializer -> { - val blockExpression = parent.parent as? KtBlockExpression - if (blockExpression?.statements?.lastOrNull() == parent && predicate(parent)) { - propose(parent) - } - } + is KtScriptInitializer -> propose(parent) is KtClassInitializer -> { val container = parent.containingDeclaration if (!container.isObjectLiteral() && diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt index 77b474dd37d..54840fba4df 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructure.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFi import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.declarations.FirDanglingModifierList -import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor @@ -142,15 +141,7 @@ internal class FileStructure private constructor( override fun visitDeclaration(dcl: KtDeclaration) { val structureElement = getStructureElementFor(dcl) - - // workaround to not duplicate diagnostics in the case of FirAnonymousInitializer in the last position - // will be dropped in the context of KT-65344 - if (dcl !is KtScriptInitializer || - structureElement is DeclarationBaseStructureElement<*> && - structureElement.declaration.origin == FirDeclarationOrigin.ScriptCustomization.ResultProperty - ) { - structureElements += structureElement - } + structureElements += structureElement // Go down only in the case of container declaration val canHaveInnerStructure = dcl is KtClassOrObject || dcl is KtScript diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt index 5a8a3ab12a9..44a695650e3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FileStructureElement.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.FileStructure import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.ScriptDiagnosticRetriever import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.SingleNonLocalDeclarationDiagnosticRetriever import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.isImplicitConstructor -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isElementWhichShouldBeResolvedAsPartOfScript import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.declarations.* @@ -141,11 +140,6 @@ internal class RootScriptStructureElement( internal fun visitScriptDependentElements(script: FirScript, visitor: FirVisitor, data: R) { script.annotations.forEach { it.accept(visitor, data) } script.contextReceivers.forEach { it.accept(visitor, data) } - script.declarations.forEach { - if (it.isElementWhichShouldBeResolvedAsPartOfScript) { - it.accept(visitor, data) - } - } } internal class ClassDeclarationStructureElement( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt index 9c93043f79d..a10405a789e 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt @@ -867,13 +867,4 @@ private abstract class FirLazyBodiesCalculatorTransformer : FirTransformer): FirScript { - for (declaration in script.declarations) { - if (declaration !is FirAnonymousInitializer) continue - declaration.accept(this, data) - } - - return script - } } 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 da7b45f9993..e218a4a9f34 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,7 +5,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isElementWhichShouldBeResolvedAsPartOfScript import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElementWithResolveState import org.jetbrains.kotlin.fir.declarations.* @@ -31,14 +30,7 @@ internal object LLFirPhaseUpdater { } is FirAnonymousInitializer -> target.body?.accept(PhaseUpdatingTransformer, newPhase) - is FirScript -> { - target.parameters.forEach { it.accept(PhaseUpdatingTransformer, newPhase) } - for (declaration in target.declarations) { - if (!declaration.isElementWhichShouldBeResolvedAsPartOfScript) continue - declaration.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 d3ea6b46038..8751c5deffd 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 @@ -44,7 +44,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.FirTransformer import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtFile @@ -72,7 +71,6 @@ internal object LLFirBodyLazyResolver : LLFirLazyResolver(FirResolvePhase.BODY_R checkBodyIsResolved(target) } is FirFunction -> checkBodyIsResolved(target) - is FirScript -> checkStatementsAreResolved(target) } } } @@ -133,6 +131,7 @@ private class LLFirBodyTargetResolver( return true } + is FirFile -> { if (target.resolvePhase >= resolverPhase) return true @@ -146,12 +145,19 @@ private class LLFirBodyTargetResolver( return true } + is FirScript -> { if (target.resolvePhase >= resolverPhase) return true + // resolve properties so they are available for CFG building in resolveScript resolveMembersForControlFlowGraph(target) - return false + performCustomResolveUnderLock(target) { + resolve(target, BodyStateKeepers.SCRIPT) + } + + return true } + is FirCodeFragment -> { resolveCodeFragmentContext(target) performCustomResolveUnderLock(target) { @@ -244,7 +250,7 @@ private class LLFirBodyTargetResolver( private fun resolveMembersForControlFlowGraph(target: FirScript) { withScript(target) { for (member in target.declarations) { - if (member is FirControlFlowGraphOwner && member.isUsedInControlFlowGraphBuilderForScript && member !is FirAnonymousInitializer) { + if (member is FirControlFlowGraphOwner && member.isUsedInControlFlowGraphBuilderForScript) { member.lazyResolveToPhase(resolverPhase.previous) performResolve(member) } @@ -293,14 +299,13 @@ private class LLFirBodyTargetResolver( if (target is FirCallableDeclaration && target.isCopyCreatedInScope) return when (target) { - is FirFile, is FirRegularClass, is FirCodeFragment -> error("Should have been resolved in ${::doResolveWithoutLock.name}") + is FirFile, is FirScript, is FirRegularClass, is FirCodeFragment -> error("Should have been resolved in ${::doResolveWithoutLock.name}") is FirConstructor -> resolve(target, BodyStateKeepers.CONSTRUCTOR) is FirFunction -> resolve(target, BodyStateKeepers.FUNCTION) is FirProperty -> resolve(target, BodyStateKeepers.PROPERTY) is FirField -> resolve(target, BodyStateKeepers.FIELD) is FirVariable -> resolve(target, BodyStateKeepers.VARIABLE) is FirAnonymousInitializer -> resolve(target, BodyStateKeepers.ANONYMOUS_INITIALIZER) - is FirScript -> resolve(target, BodyStateKeepers.SCRIPT) is FirDanglingModifierList, is FirFileAnnotationsContainer, is FirTypeAlias, @@ -327,29 +332,13 @@ private class LLFirBodyTargetResolver( private fun resolveScript(script: FirScript) { transformer.declarationsTransformer.withScript(script) { script.parameters.forEach { it.transformSingle(transformer, ResolutionMode.ContextIndependent) } - script.transformDeclarations( - transformer = object : FirTransformer() { - override fun transformElement(element: E, data: Any?): E { - if (element !is FirDeclaration || !element.isElementWhichShouldBeResolvedAsPartOfScript) return element - - transformer.firResolveContextCollector?.addDeclarationContext(element, transformer.context) - return element.transformSingle(transformer, ResolutionMode.ContextIndependent) - } - }, - data = null, - ) - script } } } internal object BodyStateKeepers { - val SCRIPT: StateKeeper = stateKeeper { script, designation -> - val oldDeclarations = script.declarations - if (oldDeclarations.none { it.isElementWhichShouldBeResolvedAsPartOfScript }) return@stateKeeper - - entityList(oldDeclarations.mapNotNull { it as? FirAnonymousInitializer }, ANONYMOUS_INITIALIZER, designation) + val SCRIPT: StateKeeper = stateKeeper { _, _ -> add(FirScript::controlFlowGraphReference, FirScript::replaceControlFlowGraphReference) } 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 f66b0eda9c5..b15755e2212 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 @@ -61,7 +61,7 @@ internal fun KtDeclaration.findSourceNonLocalFirDeclaration(firFile: FirFile, pr return@findSourceNonLocalFirDeclarationByProvider firScript?.takeIf { it.psi == declaration } } - firScript?.declarations?.filterNot { it is FirAnonymousInitializer } + firScript?.declarations } else { firFile.declarations } @@ -204,7 +204,6 @@ val FirDeclaration.isGeneratedDeclaration internal inline fun FirScript.forEachDeclaration(action: (FirDeclaration) -> Unit) { for (statement in declarations) { - if (statement.isElementWhichShouldBeResolvedAsPartOfScript) continue action(statement) } } @@ -228,8 +227,6 @@ internal inline fun FirDeclaration.forEachDeclaration(action: (FirDeclaration) - } } -internal val FirDeclaration.isElementWhichShouldBeResolvedAsPartOfScript: Boolean get() = this is FirAnonymousInitializer - /** * Some "local" declarations are not local from the lazy resolution perspective. */ diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt index 6bfb4d6713e..24fed335e12 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall -import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList @@ -107,19 +106,6 @@ internal fun checkBodyIsResolved(function: FirFunction) { } } -internal fun checkStatementsAreResolved(script: FirScript) { - fun checkExpression(expression: FirExpression) { - checkExpressionTypeIsResolved(expression.coneTypeOrNull, "script statement", script) { - withFirEntry("expression", expression) - } - } - for (declaration in script.declarations) { - if (declaration is FirAnonymousInitializer) { - declaration.body?.statements?.filterIsInstance()?.forEach(::checkExpression) - } - } -} - internal fun checkExpectForActualIsResolved(memberDeclaration: FirMemberDeclaration) { if (memberDeclaration.isExpect) return diff --git a/analysis/low-level-api-fir/testData/contextCollector/scripts/statement.copy.txt b/analysis/low-level-api-fir/testData/contextCollector/scripts/statement.copy.txt index 5b88a295615..3f8d1690ad2 100644 --- a/analysis/low-level-api-fir/testData/contextCollector/scripts/statement.copy.txt +++ b/analysis/low-level-api-fir/testData/contextCollector/scripts/statement.copy.txt @@ -14,21 +14,16 @@ Tower Data Context: Element 6 Scope: FirScriptDeclarationsScope Classifiers: - FirRegularClassSymbol public final class ScriptClass : R|kotlin/Any| + FirRegularClassSymbol public final? class ScriptClass : R|kotlin/Any| Functions FirNamedFunctionSymbol public final fun foo(i: R|kotlin/Int|, action: R|(kotlin/Int) -> kotlin/Unit|): R|kotlin/Unit| FirNamedFunctionSymbol public final fun scriptFunction(): R|kotlin/Int| - FirNamedFunctionSymbol public final fun unusedScriptFunction(p: R|kotlin/String|): R|kotlin/Int| + FirNamedFunctionSymbol public? final? fun unusedScriptFunction(p: String): Properties: FirPropertySymbol public final val $$result: R|kotlin/Unit| public get(): R|kotlin/Unit| Element 7 Scope: FirLocalScope - Classifiers: - FirRegularClassSymbol public final class ScriptClass : R|kotlin/Any| - Functions - FirNamedFunctionSymbol public final fun scriptFunction(): R|kotlin/Int| - FirNamedFunctionSymbol public final fun unusedScriptFunction(p: R|kotlin/String|): R|kotlin/Int| Properties: FirPropertySymbol lval args: R|kotlin/Array| Element 8 @@ -37,9 +32,9 @@ Tower Data Context: SCRIPT: lval args: R|kotlin/Array| - public final class ScriptClass : R|kotlin/Any| + public final? class ScriptClass : R|kotlin/Any| public final fun scriptFunction(): R|kotlin/Int| - public final fun unusedScriptFunction(p: R|kotlin/String|): R|kotlin/Int| + public? final? fun unusedScriptFunction(p: String): init public final fun foo(i: R|kotlin/Int|, action: R|(kotlin/Int) -> kotlin/Unit|): R|kotlin/Unit| public final val $$result: R|kotlin/Unit| @@ -53,37 +48,30 @@ Tower Data Context: FILE: [ResolvedTo(IMPORTS)] statement.kts context(