From 1a3b0fa9d58e8c47873fe553bdc0ae102f2055dc Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Sat, 29 Jul 2023 23:44:37 +0200 Subject: [PATCH] [LL FIR] provide script scopes to declarations All transformations inside a script should be under the script context for proper resolution ^KT-60728 --- .../scriptFileWithoutImportStatements.txt | 2 - .../api/fir/api/targets/LLFirResolveTarget.kt | 16 +- .../LLFirResolveTargetWithDedicatedElement.kt | 11 +- .../api/targets/LLFirSingleResolveTarget.kt | 1 + .../targets/LLFirWholeFileResolveTarget.kt | 9 +- .../LLFirAbstractBodyTargetResolver.kt | 10 + .../LLFirAnnotationArgumentsLazyResolver.kt | 10 +- .../fir/transformers/LLFirTargetResolver.kt | 36 +- .../level/api/fir/util/declarationUtils.kt | 14 + .../fileStructure/script.lazy.resolve.txt | 10 +- .../annotationApplicationArgumentScript.txt | 4 +- ...otationApplicationCallExpressionScript.txt | 4 +- .../annotationOnReturnTypeScript.txt | 4 +- .../annotations/retentionValueScript.txt | 4 +- .../annotations/superCallAnnotationScript.txt | 4 +- ...OnConstructorParameterExpressionScript.txt | 4 +- ...AnnotationOnConstructorParameterScript.txt | 6 +- ...nAnnotationOnConstructorPropertyScript.txt | 6 +- ...ConstructorPropertyWithArgumentsScript.txt | 6 +- ...eOnAnnotationOnFunctionParameterScript.txt | 4 +- ...OnFunctionParameterWithArgumentsScript.txt | 4 +- ...peOnAnnotationOnReceiverFunctionScript.txt | 4 +- ...eOnAnnotationOnReceiverParameterScript.txt | 4 +- ...AnnotationOnReceiverPropertyCallScript.txt | 4 +- ...peOnAnnotationOnReceiverPropertyScript.txt | 4 +- ...typeOnAnnotationOnReturnFunctionScript.txt | 4 +- ...typeOnAnnotationOnReturnPropertyScript.txt | 4 +- .../annotations/useSite/delegateScript.txt | 4 +- .../annotations/useSite/fieldScript.txt | 4 +- .../annotations/useSite/getterScript.txt | 4 +- .../annotations/useSite/paramScript.txt | 4 +- .../annotations/useSite/propertyScript.txt | 4 +- .../annotations/useSite/setParamScript.txt | 4 +- .../annotations/useSite/setterScript.txt | 4 +- .../getOrBuildFir/calls/argsFromFunction.txt | 12 +- .../getOrBuildFir/calls/argsFromInit.txt | 12 +- .../calls/argsFromMemberFunction.txt | 10 +- .../calls/argsFromMemberProperty.txt | 10 +- .../getOrBuildFir/calls/argsFromProperty.txt | 10 +- .../calls/callArgumentScript.txt | 8 +- ...eSuperCallAndExplicitConstructorScript.txt | 12 +- .../calls/callOnePropertyFromAnother.txt | 14 +- .../calls/calllTypeArgumentsScript.txt | 8 +- ...dAssignWithArrayAccessConventionScript.txt | 4 +- ...oundAssignWithArrayGetConventionScript.txt | 4 +- .../constructorDelegationSuperCallScript.txt | 4 +- .../calls/functionCallArgumentListScript.txt | 10 +- .../calls/invokeCallArgumentListScript.txt | 4 +- .../qualifiedCallInsideSuperCallScript.txt | 4 +- .../getOrBuildFir/calls/superTypeScript.txt | 4 +- .../constructorParameterScript.txt | 4 +- .../constructorPropertyScript.txt | 4 +- .../declarations/destructuringEntryScript.txt | 4 +- .../objectLiteralExpressionScript.txt | 4 +- .../declarations/objectLiteralScript.txt | 4 +- .../declarations/propertyDelegateScript.txt | 4 +- .../declarations/whereClause1Script.txt | 4 +- .../declarations/whereClause2Script.txt | 4 +- .../arrayAccessExpressionScript.txt | 4 +- .../arrayIndexExpressionWithIncScript.txt | 4 +- .../getOrBuildFir/expressions/assignment.txt | 10 +- .../binaryExpressionOperatorScript.txt | 4 +- .../expressions/binaryExpressionScript.txt | 4 +- .../expressions/blockExpressionScript.txt | 4 +- .../expressions/boolLiteralScript.txt | 4 +- .../expressions/callInsideFunction.txt | 4 +- .../expressions/callInsideStatement.txt | 10 +- .../expressions/forExpressionRangeScript.txt | 4 +- .../expressions/forExpressionScript.txt | 4 +- .../forExpressionVariableScript.txt | 4 +- .../expressions/ifExpressionScript.txt | 4 +- .../expressions/incExpressionScript.txt | 4 +- .../insidePlusAssignTargetScript.txt | 4 +- .../expressions/intLiteralScript.txt | 4 +- .../expressions/isExpressionScript.txt | 4 +- .../objectLiteralExpressionScript.txt | 4 +- .../parenthesizedExpressionScript.txt | 4 +- .../expressions/stringLiteralScript.txt | 4 +- .../stringTemplateExpressionEntryScript.txt | 4 +- .../expressions/throwExpressionScript.txt | 4 +- .../expressions/tryExpressionScript.txt | 4 +- .../expressions/whenExpressionScript.txt | 4 +- .../expressions/whileExpressionScript.txt | 4 +- .../expressions/wholeStringTemplateScript.txt | 4 +- ...OfQualifiedCallWithNestedClassesScript.txt | 4 +- ...iedPartOfQualifiedCallUnresolvedScript.txt | 4 +- .../types/functionalTypeScript.txt | 4 +- .../types/nestedClassTypeScript.txt | 4 +- .../types/nullableTypeScript.txt | 4 +- .../types/receiverTypeScript.txt | 4 +- .../getOrBuildFir/types/wholeTypeScript.txt | 4 +- .../wholeDeclaration/assignmentStatement.txt | 12 +- .../getOrBuildFir/wholeDeclaration/class.txt | 4 +- .../classTypeParemeterScript.txt | 4 +- .../wholeDeclaration/enumEntryScript.txt | 4 +- .../wholeDeclaration/function.txt | 4 +- .../wholeDeclaration/getterScript.txt | 4 +- .../wholeDeclaration/localClassScript.txt | 4 +- .../wholeDeclaration/localFunctionScript.txt | 4 +- .../wholeDeclaration/localPropertyScript.txt | 4 +- .../wholeDeclaration/memberFunctionScript.txt | 4 +- .../wholeDeclaration/memberPropertyScript.txt | 4 +- .../memberTypeAliasScript.txt | 4 +- .../wholeDeclaration/nestedClassScript.txt | 4 +- ...primaryConstructorValueParameterScript.txt | 4 +- .../wholeDeclaration/scriptInitializer.txt | 20 +- ...condaryConstructorValueParameterScript.txt | 4 +- .../wholeDeclaration/setterScript.txt | 4 +- .../wholeDeclaration/statement.txt | 20 +- .../topLevelPropertyScript.txt | 4 +- .../topLevelTypelTypeAliasScript.txt | 4 +- .../functionWithDefaultParametersScript.txt | 4 +- .../memberFunWithBodyWithContractScript.txt | 2 +- ...emberFunWithBodyWithFakeContractScript.txt | 2 +- .../memberFunWithBodyWithTypeScript.txt | 2 +- .../memberFunWithBodyWithoutTypeScript.txt | 2 +- ...unWithBodyWithoutTypeWithoutNameScript.txt | 2 +- .../memberFunWithTypeWithoutBodyScript.txt | 2 +- ...unWithoutBodyWithTypeWithoutNameScript.txt | 2 +- .../memberGetterWithTypeWithoutBodyScript.txt | 2 +- ...erWithTypeWithoutBodyWithoutNameScript.txt | 2 +- .../memberGetterWithoutTypeWithBodyScript.txt | 10 +- .../memberSetterWithTypeWithBodyScript.txt | 2 +- ...etterWithTypeWithBodyWithoutNameScript.txt | 2 +- .../memberSetterWithTypeWithoutBodyScript.txt | 2 +- ...erWithTypeWithoutBodyWithoutNameScript.txt | 2 +- .../memberSetterWithoutTypeWithBodyScript.txt | 2 +- ...mberSetterWithoutTypeWithoutBodyScript.txt | 2 +- ...onWithBodyWithoutTypeWithoutNameScript.txt | 2 +- ...topLevelFunctionWithTypeWithBodyScript.txt | 2 +- ...LevelFunctionWithTypeWithoutBodyScript.txt | 2 +- ...onWithoutBodyWithTypeWithoutNameScript.txt | 2 +- ...LevelFunctionWithoutTypeWithBodyScript.txt | 2 +- ...opLevelGetterWithTypeWithoutBodyScript.txt | 2 +- ...erWithTypeWithoutBodyWithoutNameScript.txt | 2 +- ...opLevelGetterWithoutTypeWithBodyScript.txt | 10 +- .../topLevelSetterWithTypeWithBodyScript.txt | 2 +- ...etterWithTypeWithBodyWithoutNameScript.txt | 2 +- ...opLevelSetterWithTypeWithoutBodyScript.txt | 2 +- ...erWithTypeWithoutBodyWithoutNameScript.txt | 2 +- .../annotationArgumentsMixScript.txt | 20 +- .../annotationClassWithJavaTargetScript.txt | 20 +- .../annotationOnLocalClassScript.txt | 20 +- .../annotationParametersScript.txt | 20 +- .../annotationWithTypeArgumentScript.txt | 20 +- .../lazyResolve/annotationsScript.txt | 20 +- ...sFunctionWithAnnotatedParameter2Script.txt | 36 +- ...atedParameterOnImplicitTypePhaseScript.txt | 80 ++-- ...usFunctionWithAnnotatedParameterScript.txt | 36 +- .../lazyResolve/classMembersScript.txt | 20 +- .../classes/annotationWithTargetScript.txt | 20 +- .../classes/classWithTypeParametersScript.txt | 20 +- .../classes/functionInValueClassScript.txt | 20 +- ...archyWithOverrideAndNestedClass2Script.txt | 20 +- ...archyWithOverrideAndNestedClass3Script.txt | 20 +- ...archyWithOverrideAndNestedClass4Script.txt | 20 +- ...rarchyWithOverrideAndNestedClassScript.txt | 20 +- .../classes/hierarchyWithOverrideScript.txt | 20 +- .../lazyResolve/classes/nestedClassScript.txt | 20 +- ...stedClassWithPropertiesOverridesScript.txt | 20 +- .../classes/simpleLoopInOverride2Script.txt | 20 +- .../classes/simpleLoopInOverrideScript.txt | 20 +- ...erRequiredAnnotationOnLocalClassScript.txt | 20 +- ...AnnotationsOnConstructorPropertyScript.txt | 20 +- ...RequiredAnnotationsOnConstructorScript.txt | 20 +- ...lerRequiredAnnotationsOnFunctionScript.txt | 20 +- ...redAnnotationsOnPropertyDelegateScript.txt | 20 +- ...lerRequiredAnnotationsOnPropertyScript.txt | 20 +- .../complexLocalHierarchyScript.txt | 20 +- .../complexRedeclarationScript.txt | 20 +- .../lazyResolve/cyclicHierarchy2Script.txt | 20 +- .../lazyResolve/cyclicHierarchy3Script.txt | 20 +- .../lazyResolve/cyclicHierarchyScript.txt | 20 +- .../cyclicNestedHierarchy2Script.txt | 20 +- .../cyclicNestedHierarchyScript.txt | 20 +- .../lazyResolve/dataClassCopyScript.txt | 20 +- .../lazyResolve/dataComponent2Script.txt | 20 +- .../delegateWithImplicitTypeScript.txt | 20 +- .../lazyResolve/delegatedFieldScript.txt | 20 +- .../testdata/lazyResolve/delegatesScript.txt | 102 ++--- .../lazyResolve/enumEntriesScript.txt | 20 +- .../testdata/lazyResolve/enumEntryScript.txt | 20 +- .../lazyResolve/enumValueOfScript.txt | 20 +- .../testdata/lazyResolve/enumValuesScript.txt | 20 +- .../lazyResolve/fakeOverrideScript.txt | 20 +- .../fakePrimaryConstructorScript.txt | 20 +- .../fromLocalHierarchyToOuterScript.txt | 20 +- .../functionWithParameterScript.txt | 20 +- .../lazyResolve/functions/contractScript.txt | 20 +- .../functionCallWithGenericResultScript.txt | 26 +- .../functions/functionParameterScript.txt | 20 +- ...ionWithGenericExpectedTypeInsideScript.txt | 36 +- .../functionWithTypeParametersScript.txt | 20 +- ...archyWithOverrideAndNestedClass2Script.txt | 20 +- ...archyWithOverrideAndNestedClass3Script.txt | 20 +- ...rarchyWithOverrideAndNestedClassScript.txt | 20 +- .../functions/hierarchyWithOverrideScript.txt | 20 +- .../functions/simpleLoopInOverride2Script.txt | 20 +- .../functions/simpleLoopInOverrideScript.txt | 20 +- .../lambdaAsSAMInterfaceScript.txt | 34 +- .../lazyResolve/lazyPropertyScript.txt | 88 ++--- .../lazyResolve/localConstructorScript.txt | 50 +-- ...ocalFunctionInsideAnnotationCallScript.txt | 52 +-- ...calFunctionInsideFunctionLiteralScript.txt | 52 +-- ...deLambdaCallInsideStringTemplateScript.txt | 52 +-- ...ocalFunctionInsideStringTemplateScript.txt | 52 +-- ...ocalFunctionInsideSuperEntryCallScript.txt | 52 +-- .../lazyResolve/localNestedClassScript.txt | 20 +- ...calParameterInsideSuperEntryCallScript.txt | 52 +-- ...ilerRequiredAnnotationsForMemberScript.txt | 20 +- ...lerRequiredAnnotationsInsideBodyScript.txt | 20 +- ...estedCompilerRequiredAnnotationsScript.txt | 20 +- .../lazyResolve/nestedTypeAlias2Script.txt | 20 +- .../lazyResolve/nestedTypeAliasScript.txt | 20 +- .../parameterOfNonLocalSetterScript.txt | 20 +- .../parameterOfTopSetterScript.txt | 20 +- .../primaryConstructorParameterScript.txt | 20 +- .../primaryConstructorPropertyScript.txt | 20 +- .../lazyResolve/primaryConstructorScript.txt | 20 +- .../properties/getterWithDelegationScript.txt | 20 +- ...archyWithOverrideAndNestedClass2Script.txt | 20 +- ...archyWithOverrideAndNestedClass3Script.txt | 20 +- ...archyWithOverrideAndNestedClass4Script.txt | 20 +- ...rarchyWithOverrideAndNestedClassScript.txt | 20 +- .../hierarchyWithOverrideScript.txt | 20 +- ...rtyGetterWithExplicitTypeAndBodyScript.txt | 20 +- .../propertyGetterWithExplicitTypeScript.txt | 20 +- .../propertyGetterWithImplicitTypeScript.txt | 20 +- .../properties/propertySetterScript.txt | 20 +- .../propertyWithTypeParametersScript.txt | 20 +- .../simpleLoopInOverride2Script.txt | 20 +- .../properties/simpleLoopInOverrideScript.txt | 20 +- .../propertyWithGetterAndSetterScript.txt | 36 +- .../lazyResolve/propertyWithGetterScript.txt | 30 +- .../propertyWithInitializerScript.txt | 28 +- .../lazyResolve/redeclarationScript.txt | 20 +- .../resolveSuperTypeFromLocalClassScript.txt | 20 +- ...lveTypeFromLocalClassConstructorScript.txt | 20 +- .../resolveTypeFromLocalFunctionScript.txt | 20 +- .../testdata/lazyResolve/script.txt | 20 +- .../testdata/lazyResolve/script2.txt | 24 +- .../testdata/lazyResolve/script4.txt | 26 +- .../secondaryConstructorParameterScript.txt | 26 +- .../secondaryConstructorScript.txt | 26 +- .../testdata/lazyResolve/statement.txt | 140 +++---- .../testdata/lazyResolve/statement2.txt | 348 +++++++++--------- .../substitutionFakeOverrideScript.txt | 20 +- ...tionFakeOverrideWithImplicitTypeScript.txt | 20 +- .../lazyResolve/superTypesLoopScript.txt | 20 +- .../testdata/lazyResolve/superTypesScript.txt | 20 +- .../lazyResolve/topLevelFunctionsScript.txt | 28 +- ...ithExpressionBodyAndExplicitTypeScript.txt | 28 +- ...opLevelFunctionsWithImplicitTypeScript.txt | 28 +- .../typeAliasWithTypeParametersScript.txt | 20 +- .../lazyResolve/typeParameterBoundsScript.txt | 28 +- .../typeParameterOfClass2Script.txt | 20 +- .../typeParameterOfClassScript.txt | 20 +- .../typeParameterOfNonLocalFunctionScript.txt | 20 +- .../typeParameterOfTopFunctionScript.txt | 20 +- .../typeParameterOfTopSetterScript.txt | 20 +- .../typeParameterOfTypeAliasScript.txt | 20 +- .../kotlin/fir/declarations/ScriptScopes.kt | 4 +- 262 files changed, 2121 insertions(+), 2062 deletions(-) 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(