From 3947ba57daba38b13ead244bbc8a82cbe1117546 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 9 Aug 2023 14:27:34 +0200 Subject: [PATCH] [LL FIR] support on-air resolve for scripts We should reanalyze only statements and leave declarations as they are ^KT-61013 Fixed --- .../LowLevelFirApiFacadeForResolveOnAir.kt | 22 +++++++- .../testdata/dependentCopy/script.context.txt | 45 ++++++++++++++++ .../testdata/dependentCopy/script.fir.txt | 35 +++++++++++++ .../testdata/dependentCopy/script.kts | 18 +++++++ .../dependentCopy/scriptFunction.context.txt | 51 +++++++++++++++++++ .../dependentCopy/scriptFunction.fir.txt | 8 +++ .../testdata/dependentCopy/scriptFunction.kts | 16 ++++++ .../scriptInsideLastStatement.context.txt | 51 +++++++++++++++++++ .../scriptInsideLastStatement.fir.txt | 6 +++ .../scriptInsideLastStatement.kts | 16 ++++++ .../scriptLastStatement.context.txt | 45 ++++++++++++++++ .../dependentCopy/scriptLastStatement.fir.txt | 6 +++ .../dependentCopy/scriptLastStatement.kts | 16 ++++++ .../scriptLastStatementCall.context.txt | 45 ++++++++++++++++ .../scriptLastStatementCall.fir.txt | 10 ++++ .../dependentCopy/scriptLastStatementCall.kts | 17 +++++++ .../dependentCopy/scriptStatement.context.txt | 45 ++++++++++++++++ .../dependentCopy/scriptStatement.fir.txt | 6 +++ .../dependentCopy/scriptStatement.kts | 16 ++++++ .../scriptStatementCall.context.txt | 45 ++++++++++++++++ .../dependentCopy/scriptStatementCall.fir.txt | 6 +++ .../dependentCopy/scriptStatementCall.kts | 17 +++++++ ...riptDependentCopyContextTestGenerated.java | 42 +++++++++++++++ .../ScriptDependentCopyFirTestGenerated.java | 42 +++++++++++++++ 24 files changed, 625 insertions(+), 1 deletion(-) create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/script.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/script.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/script.kts create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptFunction.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptFunction.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptFunction.kts create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptInsideLastStatement.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptInsideLastStatement.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptInsideLastStatement.kts create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptLastStatement.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptLastStatement.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptLastStatement.kts create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptLastStatementCall.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptLastStatementCall.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptLastStatementCall.kts create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptStatement.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptStatement.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptStatement.kts create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptStatementCall.context.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptStatementCall.fir.txt create mode 100644 analysis/low-level-api-fir/testdata/dependentCopy/scriptStatementCall.kts diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt index da7d59fab44..7a938b75cb3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerC import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerDataContextAllElementsCollector import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.canBePartOfParentDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.FirElementsRecorder import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.KtToFirMapping import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.RawFirNonLocalDeclarationBuilder import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.RawFirReplacement @@ -25,6 +24,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.state.LLFirResolvableReso import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirElementFinder import org.jetbrains.kotlin.analysis.low.level.api.fir.util.codeFragment import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isScriptStatement import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.analysis.utils.printer.parentOfType @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.builder.buildFileAnnotationsContainer import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector @@ -69,6 +70,14 @@ object LowLevelFirApiFacadeForResolveOnAir { originalDeclarationParents.zip(fakeDeclarationParents) { original, fake -> fake.originalDeclaration = original } + + if (targetDeclaration is KtScript && originalDeclaration is KtScript) { + originalDeclaration.blockExpression.statements.zip(targetDeclaration.blockExpression.statements) { original, fake -> + if (original is KtDeclaration && fake is KtDeclaration) { + fake.originalDeclaration = original + } + } + } } fun onAirResolveElement( @@ -322,6 +331,17 @@ object LowLevelFirApiFacadeForResolveOnAir { replacement = replacement, ) + /** + * We shouldn't touch script declarations because they're independent of a script + */ + if (newFirDeclaration is FirScript && originalFirDeclaration is FirScript) { + val newStatements = originalFirDeclaration.statements.zip(newFirDeclaration.statements).map { (original, copied) -> + original.takeUnless(FirStatement::isScriptStatement) ?: copied + } + + newFirDeclaration.replaceStatements(newStatements) + } + session.moduleComponents.firModuleLazyDeclarationResolver.runLazyDesignatedOnAirResolve( FirDesignationWithFile(originalDesignationPath.path, newFirDeclaration, originalFirFile), collector, diff --git a/analysis/low-level-api-fir/testdata/dependentCopy/script.context.txt b/analysis/low-level-api-fir/testdata/dependentCopy/script.context.txt new file mode 100644 index 00000000000..6e3739d6c9f --- /dev/null +++ b/analysis/low-level-api-fir/testdata/dependentCopy/script.context.txt @@ -0,0 +1,45 @@ +Tower Data Context: + Element 0 + Scope: FirDefaultStarImportingScope + Element 1 + Scope: FirDefaultSimpleImportingScope + Element 2 + Scope: FirExplicitStarImportingScope + Element 3 + Scope: FirDefaultSimpleImportingScope + Element 4 + Scope: FirDefaultSimpleImportingScope + Element 5 + Scope: FirPackageMemberScope + Element 6 + Scope: FirExplicitSimpleImportingScope + Element 7 + Scope: FirScriptDeclarationsScope + Classifiers: + 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: String): + Properties: + FirPropertySymbol public final val $$result: R|kotlin/Unit| + public get(): R|kotlin/Unit| + Element 8 + Scope: FirLocalScope + Properties: + FirPropertySymbol lval args: R|kotlin/Array| + Element 9 + Context receivers: + FirScriptSymbol context(