diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt index 782f4f10c8b..4aadbe44820 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -9,6 +9,8 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirPropertyAccessorSymbolPointer +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.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion @@ -23,7 +25,6 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.* -import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.name.CallableId @@ -55,7 +56,7 @@ internal class KtFirPropertyGetterSymbol( override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } override val receiverType: KtType? get() = withValidityAssertion { firSymbol.fir.propertySymbol.receiverType(builder) } - + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } /** @@ -76,7 +77,9 @@ internal class KtFirPropertyGetterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } - TODO("Creating pointers for getters from library is not supported yet") + + @Suppress("UNCHECKED_CAST") + KtFirPropertyAccessorSymbolPointer(requireOwnerPointer(), true) as KtSymbolPointer } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt index 45246d465e9..53fab95f024 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -9,6 +9,8 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirPropertyAccessorSymbolPointer +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.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion @@ -23,7 +25,6 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.* -import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenProperties @@ -99,7 +100,9 @@ internal class KtFirPropertySetterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } - TODO("Creating pointers for setters from library is not supported yet") + + @Suppress("UNCHECKED_CAST") + KtFirPropertyAccessorSymbolPointer(requireOwnerPointer(), true) as KtSymbolPointer } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt new file mode 100644 index 00000000000..f2472f64f8d --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt @@ -0,0 +1,29 @@ +/* + * 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.symbols.KtFirKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer + +internal class KtFirPropertyAccessorSymbolPointer( + private val propertySymbolPointer: KtSymbolPointer, + private val isGetter: Boolean, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtPropertyAccessorSymbol? { + require(analysisSession is KtFirAnalysisSession) + val propertySymbol = with(analysisSession) { + propertySymbolPointer.restoreSymbol() + } ?: return null + + check(propertySymbol is KtFirKotlinPropertySymbol) + return if (isGetter) propertySymbol.getter else propertySymbol.setter + } +} diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithAnnotations.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithAnnotations.kt index c74a14bbed1..a0296bb1bd5 100644 --- a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithAnnotations.kt +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithAnnotations.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 annotation class PropertyAnnotation annotation class FieldAnnotation annotation class GetAnnotation diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt index 97b65d571bb..04645b481f4 100644 --- a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/getterWithReceiverAndAnnotations.kt @@ -1,4 +1,4 @@ -// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 annotation class PropertyAnnotation annotation class GetAnnotation annotation class ExplicitGetAnnotation