From 043e3e68408f29bc80fc2ac684c24c7b145679c8 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Fri, 4 Nov 2022 16:24:09 +0100 Subject: [PATCH] [AA K2] implement symbol pointers for receiver parameter ^KT-54311 --- ...tFirSymbolContainingDeclarationProvider.kt | 4 +++ .../symbols/KtFirReceiverParameterSymbol.kt | 19 +++++++------ .../KtFirReceiverParameterSymbolPointer.kt | 27 +++++++++++++++++++ .../functionReceiverParameter.kt | 2 -- .../propertyReceiverParameter.kt | 4 +-- 5 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 109f0f64775..a4e3f239c2e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -31,6 +31,10 @@ internal class KtFirSymbolContainingDeclarationProvider( override val token: KtLifetimeToken ) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent { override fun getContainingDeclaration(symbol: KtSymbol): KtDeclarationSymbol? { + if (symbol is KtReceiverParameterSymbol) { + return symbol.owningCallableSymbol + } + if (symbol !is KtDeclarationSymbol) return null if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null fun getParentSymbolByPsi() = getContainingPsi(symbol).let { with(analysisSession) { it.getSymbol() } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt index 57307c49520..eca29ed37da 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -1,22 +1,25 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 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 import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirReceiverParameterSymbolPointer +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -41,7 +44,7 @@ internal class KtFirReceiverParameterSymbol( override val origin: KtSymbolOrigin = withValidityAssertion { firSymbol.fir.ktSymbolOrigin() } - override fun createPointer(): KtSymbolPointer = withValidityAssertion { - TODO("Probably just create a pointer based on the underlying declaration") + override fun createPointer(): KtSymbolPointer = withValidityAssertion { + KtFirReceiverParameterSymbolPointer(owningCallableSymbol.createPointer()) } -} \ No newline at end of file +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt new file mode 100644 index 00000000000..964aafb3278 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirReceiverParameterSymbolPointer.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2022 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.utils.firSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer + +internal class KtFirReceiverParameterSymbolPointer( + private val ownerPointer: KtSymbolPointer, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtReceiverParameterSymbol? { + require(analysisSession is KtFirAnalysisSession) + val callableSymbol = with(analysisSession) { + ownerPointer.restoreSymbol() + } ?: return null + + return analysisSession.firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(callableSymbol.firSymbol) + } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.kt index 72ebcf18bc7..dfe964a9793 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.kt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/functionReceiverParameter.kt @@ -1,5 +1,3 @@ -// DO_NOT_CHECK_SYMBOL_RESTORE_K2 - annotation class ReceiverAnnotation @Target(AnnotationTarget.TYPE) annotation class ReceiverTypeAnnotation diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.kt index b0735872852..23b53024a61 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.kt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/propertyReceiverParameter.kt @@ -1,8 +1,6 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 annotation class ReceiverAnnotation @Target(AnnotationTarget.TYPE) annotation class ReceiverTypeAnnotation val @receiver:ReceiverAnnotation @ReceiverTypeAnnotation Long.prop: Boolean get() = { this == 1 } - -// DO_NOT_CHECK_SYMBOL_RESTORE_K2 \ No newline at end of file