From 97e330997b1e753e08a37659ef10aba7bf8c9e19 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Sat, 29 Jul 2023 01:47:51 +0200 Subject: [PATCH] [LL FIR] support scripts in BODY_RESOLVE transformer ^KT-60728 --- .../api/fir/lazy/resolve/LLFirPhaseUpdater.kt | 11 +- .../fir/transformers/LLFirBodyLazyResolver.kt | 20 +- .../level/api/fir/util/declarationUtils.kt | 6 +- ...classMemberPropertyScript.lazy.resolve.txt | 2 +- .../classScript.lazy.resolve.txt | 2 +- .../constructorsScript.lazy.resolve.txt | 2 +- ...nnotationClassLevelScript.lazy.resolve.txt | 2 +- ...tionsInPropertyInitScript.lazy.resolve.txt | 2 +- .../enumClassScript.lazy.resolve.txt | 2 +- .../enumClassWithBodyScript.lazy.resolve.txt | 2 +- .../initBlockScript.lazy.resolve.txt | 2 +- .../localClassScript.lazy.resolve.txt | 2 +- .../localFunScript.lazy.resolve.txt | 2 +- .../localPropertyScript.lazy.resolve.txt | 2 +- .../memberTypeAliasScript.lazy.resolve.txt | 2 +- .../nestedClassesScript.lazy.resolve.txt | 2 +- .../propertyAccessorsScript.lazy.resolve.txt | 2 +- .../fileStructure/script.lazy.resolve.txt | 18 +- .../superClassCallScript.lazy.resolve.txt | 2 +- ...sionBodyFunWithTypeScript.lazy.resolve.txt | 2 +- ...nBodyFunWithoutTypeScript.lazy.resolve.txt | 2 +- ...topLevelFunWithTypeScript.lazy.resolve.txt | 2 +- .../topLevelPropertyScript.lazy.resolve.txt | 2 +- .../topLevelUnitFunScript.lazy.resolve.txt | 2 +- .../withoutNameScript.lazy.resolve.txt | 2 +- ...notationApplicationArgumentOnStatement.txt | 16 +- .../annotations/statementAnnotation.txt | 12 +- .../calls/compoundAssignOnVarScript.txt | 20 +- .../getOrBuildFir/calls/setOperatorScript.txt | 75 +- .../getOrBuildFir/expressions/assignment.txt | 40 +- .../expressions/callInsideStatement.txt | 44 +- .../wholeDeclaration/assignmentStatement.txt | 44 +- .../wholeDeclaration/scriptInitializer.txt | 82 +- .../wholeDeclaration/statement.txt | 82 +- .../annotationArgumentsMixScript.txt | 2 +- .../annotationClassWithJavaTargetScript.txt | 2 +- .../annotationOnLocalClassScript.txt | 2 +- .../annotationParametersScript.txt | 2 +- .../annotationWithTypeArgumentScript.txt | 2 +- .../lazyResolve/annotationsScript.txt | 2 +- ...sFunctionWithAnnotatedParameter2Script.txt | 2 +- ...atedParameterOnImplicitTypePhaseScript.txt | 2 +- ...usFunctionWithAnnotatedParameterScript.txt | 2 +- .../lazyResolve/classMembersScript.txt | 2 +- .../classes/annotationWithTargetScript.txt | 2 +- .../classes/classWithTypeParametersScript.txt | 2 +- .../classes/functionInValueClassScript.txt | 2 +- ...archyWithOverrideAndNestedClass2Script.txt | 2 +- ...archyWithOverrideAndNestedClass3Script.txt | 2 +- ...archyWithOverrideAndNestedClass4Script.txt | 2 +- ...rarchyWithOverrideAndNestedClassScript.txt | 2 +- .../classes/hierarchyWithOverrideScript.txt | 2 +- .../lazyResolve/classes/nestedClassScript.txt | 2 +- ...stedClassWithPropertiesOverridesScript.txt | 2 +- .../classes/simpleLoopInOverride2Script.txt | 2 +- .../classes/simpleLoopInOverrideScript.txt | 2 +- ...erRequiredAnnotationOnLocalClassScript.txt | 2 +- ...AnnotationsOnConstructorPropertyScript.txt | 2 +- ...RequiredAnnotationsOnConstructorScript.txt | 2 +- ...lerRequiredAnnotationsOnFunctionScript.txt | 2 +- ...redAnnotationsOnPropertyDelegateScript.txt | 2 +- ...lerRequiredAnnotationsOnPropertyScript.txt | 2 +- .../complexLocalHierarchyScript.txt | 2 +- .../complexRedeclarationScript.txt | 2 +- .../lazyResolve/cyclicHierarchy2Script.txt | 2 +- .../lazyResolve/cyclicHierarchy3Script.txt | 2 +- .../lazyResolve/cyclicHierarchyScript.txt | 2 +- .../cyclicNestedHierarchy2Script.txt | 2 +- .../cyclicNestedHierarchyScript.txt | 2 +- .../lazyResolve/dataClassCopyScript.txt | 2 +- .../lazyResolve/dataComponent2Script.txt | 2 +- .../delegateWithImplicitTypeScript.txt | 2 +- .../lazyResolve/delegatedFieldScript.txt | 2 +- .../testdata/lazyResolve/delegatesScript.txt | 2 +- .../lazyResolve/enumEntriesScript.txt | 2 +- .../testdata/lazyResolve/enumEntryScript.txt | 2 +- .../lazyResolve/enumValueOfScript.txt | 2 +- .../testdata/lazyResolve/enumValuesScript.txt | 2 +- .../lazyResolve/fakeOverrideScript.txt | 2 +- .../fakePrimaryConstructorScript.txt | 2 +- .../lazyResolve/fileAnnotationsScript.txt | 2 +- .../fromLocalHierarchyToOuterScript.txt | 2 +- .../functionWithParameterScript.txt | 2 +- .../lazyResolve/functions/contractScript.txt | 2 +- .../lazyResolve/functions/contractScript2.txt | 4 +- .../functionCallWithGenericResultScript.txt | 2 +- .../functions/functionParameterScript.txt | 2 +- ...ionWithGenericExpectedTypeInsideScript.txt | 2 +- .../functionWithTypeParametersScript.txt | 2 +- ...archyWithOverrideAndNestedClass2Script.txt | 2 +- ...archyWithOverrideAndNestedClass3Script.txt | 2 +- ...rarchyWithOverrideAndNestedClassScript.txt | 2 +- .../functions/hierarchyWithOverrideScript.txt | 2 +- .../functions/simpleLoopInOverride2Script.txt | 2 +- .../functions/simpleLoopInOverrideScript.txt | 2 +- .../lambdaAsSAMInterfaceScript.txt | 2 +- .../lazyResolve/lazyPropertyScript.txt | 2 +- .../lazyResolve/localConstructorScript.txt | 2 +- ...ocalFunctionInsideAnnotationCallScript.txt | 2 +- ...calFunctionInsideFunctionLiteralScript.txt | 2 +- ...deLambdaCallInsideStringTemplateScript.txt | 2 +- .../localFunctionInsideStatement.txt | 456 +++++------ ...ocalFunctionInsideStringTemplateScript.txt | 2 +- ...ocalFunctionInsideSuperEntryCallScript.txt | 2 +- .../lazyResolve/localNestedClassScript.txt | 2 +- ...calParameterInsideSuperEntryCallScript.txt | 2 +- ...ilerRequiredAnnotationsForMemberScript.txt | 2 +- ...lerRequiredAnnotationsInsideBodyScript.txt | 2 +- ...estedCompilerRequiredAnnotationsScript.txt | 2 +- .../lazyResolve/nestedTypeAlias2Script.txt | 2 +- .../lazyResolve/nestedTypeAliasScript.txt | 2 +- .../parameterOfNonLocalSetterScript.txt | 2 +- .../parameterOfTopSetterScript.txt | 2 +- .../primaryConstructorParameterScript.txt | 2 +- .../primaryConstructorPropertyScript.txt | 2 +- .../lazyResolve/primaryConstructorScript.txt | 2 +- .../properties/getterWithDelegationScript.txt | 2 +- ...archyWithOverrideAndNestedClass2Script.txt | 2 +- ...archyWithOverrideAndNestedClass3Script.txt | 2 +- ...archyWithOverrideAndNestedClass4Script.txt | 2 +- ...rarchyWithOverrideAndNestedClassScript.txt | 2 +- .../hierarchyWithOverrideScript.txt | 2 +- ...rtyGetterWithExplicitTypeAndBodyScript.txt | 2 +- .../propertyGetterWithExplicitTypeScript.txt | 2 +- .../propertyGetterWithImplicitTypeScript.txt | 2 +- .../properties/propertySetterScript.txt | 2 +- .../propertyWithTypeParametersScript.txt | 2 +- .../simpleLoopInOverride2Script.txt | 2 +- .../properties/simpleLoopInOverrideScript.txt | 2 +- .../propertyWithGetterAndSetterScript.txt | 2 +- .../lazyResolve/propertyWithGetterScript.txt | 2 +- .../propertyWithInitializerScript.txt | 2 +- .../lazyResolve/redeclarationScript.txt | 2 +- .../resolveSuperTypeFromLocalClassScript.txt | 2 +- ...lveTypeFromLocalClassConstructorScript.txt | 2 +- .../resolveTypeFromLocalFunctionScript.txt | 2 +- .../testdata/lazyResolve/script.txt | 82 +- .../testdata/lazyResolve/script2.txt | 24 +- .../testdata/lazyResolve/script3.kts | 24 + .../testdata/lazyResolve/script3.txt | 713 ++++++++++++++++++ .../secondaryConstructorParameterScript.txt | 2 +- .../secondaryConstructorScript.txt | 2 +- .../testdata/lazyResolve/statement.txt | 540 ++++++------- .../testdata/lazyResolve/statement2.txt | 188 ++--- .../substitutionFakeOverrideScript.txt | 2 +- ...tionFakeOverrideWithImplicitTypeScript.txt | 2 +- .../lazyResolve/superTypesLoopScript.txt | 2 +- .../testdata/lazyResolve/superTypesScript.txt | 2 +- .../lazyResolve/topLevelFunctionsScript.txt | 2 +- ...ithExpressionBodyAndExplicitTypeScript.txt | 2 +- ...opLevelFunctionsWithImplicitTypeScript.txt | 2 +- .../typeAliasWithTypeParametersScript.txt | 2 +- .../lazyResolve/typeParameterBoundsScript.txt | 2 +- .../typeParameterOfClass2Script.txt | 2 +- .../typeParameterOfClassScript.txt | 2 +- .../typeParameterOfNonLocalFunctionScript.txt | 2 +- .../typeParameterOfTopFunctionScript.txt | 2 +- .../typeParameterOfTopSetterScript.txt | 2 +- .../typeParameterOfTypeAliasScript.txt | 2 +- ...ptLazyDeclarationResolveTestGenerated.java | 6 + .../FirDeclarationsResolveTransformer.kt | 8 +- 161 files changed, 1766 insertions(+), 1025 deletions(-) create mode 100644 analysis/low-level-api-fir/testdata/lazyResolve/script3.kts create mode 100644 analysis/low-level-api-fir/testdata/lazyResolve/script3.txt 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(