[AA FIR] add symbol restoring for $$result declaration

^KT-61431 Fixed
^KT-61451
This commit is contained in:
Dmitrii Gridin
2023-08-24 16:51:30 +02:00
committed by Space Team
parent 99510ca42b
commit 5aae053785
3 changed files with 61 additions and 6 deletions
@@ -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<KtFirFileSymbol>())
} else {
KtFirTopLevelPropertySymbolPointer(
firSymbol.callableId,
FirCallableSignature.createSignature(firSymbol),
)
}
}
KtSymbolKind.CLASS_MEMBER ->
KtFirMemberPropertySymbolPointer(
@@ -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<KtFirFileSymbol>) :
KtSymbolPointer<KtKotlinPropertySymbol>() {
@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<KtSymbol>): Boolean = this === other ||
other is KtFirResultPropertySymbolPointer &&
other.filePointer.pointsToTheSameSymbolAs(filePointer)
}
@@ -1,4 +1,4 @@
// DO_NOT_CHECK_SYMBOL_RESTORE
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE
// script
fun foo(action: () -> Int) {
action()