From 5aae0537852cdfe5b6a6a1374312154045e7226c Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 24 Aug 2023 16:51:30 +0200 Subject: [PATCH] [AA FIR] add symbol restoring for $$result declaration ^KT-61431 Fixed ^KT-61451 --- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 29 ++++++++++++--- .../KtFirResultPropertySymbolPointer.kt | 36 +++++++++++++++++++ .../simpleScriptWithResultDeclaration.kts | 2 +- 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirResultPropertySymbolPointer.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt index d23fad5c691..abbde4f2220 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 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. */ @@ -21,10 +21,13 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.UnsupportedSymbolKind +import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointerOfType import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClassLookupTag +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.* @@ -34,6 +37,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.isExtension import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtFile internal class KtFirKotlinPropertySymbol( override val firSymbol: FirPropertySymbol, @@ -130,10 +134,25 @@ internal class KtFirKotlinPropertySymbol( } return when (val kind = symbolKind) { - KtSymbolKind.TOP_LEVEL -> KtFirTopLevelPropertySymbolPointer( - firSymbol.callableId, - FirCallableSignature.createSignature(firSymbol), - ) + KtSymbolKind.TOP_LEVEL -> { + if (firSymbol.fir.origin is FirDeclarationOrigin.ScriptCustomization.ResultProperty) { + val file = psi?.containingFile as? KtFile + if (file == null) { + errorWithFirSpecificEntries( + "ResultProperty restoring supported only for psi-based symbols yet", + fir = firSymbol.fir, + psi = psi, + ) + } + + KtFirResultPropertySymbolPointer(file.symbolPointerOfType()) + } else { + KtFirTopLevelPropertySymbolPointer( + firSymbol.callableId, + FirCallableSignature.createSignature(firSymbol), + ) + } + } KtSymbolKind.CLASS_MEMBER -> KtFirMemberPropertySymbolPointer( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirResultPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirResultPropertySymbolPointer.kt new file mode 100644 index 00000000000..33a05fbd9d4 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirResultPropertySymbolPointer.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirScript + +internal class KtFirResultPropertySymbolPointer(private val filePointer: KtSymbolPointer) : + KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtKotlinPropertySymbol? { + require(analysisSession is KtFirAnalysisSession) + val file = with(analysisSession) { + filePointer.restoreSymbol()?.firSymbol + } ?: return null + + val script = file.fir.declarations.singleOrNull() as? FirScript ?: return null + val lastProperty = script.statements.lastOrNull() as? FirProperty ?: return null + if (lastProperty.origin !is FirDeclarationOrigin.ScriptCustomization.ResultProperty) return null + return analysisSession.firSymbolBuilder.variableLikeBuilder.buildPropertySymbol(lastProperty.symbol) as? KtKotlinPropertySymbol + } + + override fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other || + other is KtFirResultPropertySymbolPointer && + other.filePointer.pointsToTheSameSymbolAs(filePointer) +} diff --git a/analysis/analysis-api/testData/components/scopeProvider/declaredMemberScope/simpleScriptWithResultDeclaration.kts b/analysis/analysis-api/testData/components/scopeProvider/declaredMemberScope/simpleScriptWithResultDeclaration.kts index e9d2fd8a6fe..c9b60645e35 100644 --- a/analysis/analysis-api/testData/components/scopeProvider/declaredMemberScope/simpleScriptWithResultDeclaration.kts +++ b/analysis/analysis-api/testData/components/scopeProvider/declaredMemberScope/simpleScriptWithResultDeclaration.kts @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE // script fun foo(action: () -> Int) { action()