From edd60cd204ef6b89c85e517ad8fa94f24afc1e29 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 17 Nov 2022 17:09:31 +0100 Subject: [PATCH] [AA] improve symbol pointers for property accessors Fe10: * supported default setter * support default getter * support parameter from default setter Fir: * support java synthetic properties * support parameter from default setter ^KT-54051 --- .../KtFe10PsiDefaultPropertyGetterSymbol.kt | 14 ++++--- .../KtFe10PsiDefaultPropertySetterSymbol.kt | 21 ++++++---- .../KtFe10PsiDefaultSetterParameterSymbol.kt | 10 +++-- ...tFirSymbolContainingDeclarationProvider.kt | 2 +- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 16 ++++++-- .../fir/symbols/KtFirPropertySetterSymbol.kt | 6 ++- .../fir/symbols/KtFirValueParameterSymbol.kt | 29 ++++++++----- .../KtPropertyAccessorSymbolPointer.kt} | 14 +++---- ...ParameterFromDefaultSetterSymbolPointer.kt | 25 +++++++++++ ....kt => AbstractMemberScopeByFqNameTest.kt} | 1 - .../test/cases/symbols/AbstractSymbolTest.kt | 41 +++++++++++++++---- 11 files changed, 129 insertions(+), 50 deletions(-) rename analysis/{analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt => analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt} (63%) create mode 100644 analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt rename analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/{AbstractMemberScopeTest.kt => AbstractMemberScopeByFqNameTest.kt} (94%) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt index cc1cda45e66..2b44194b896 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertyGetterSymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade @@ -24,11 +25,10 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktSym import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList +import org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers.KtPropertyAccessorSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin -import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.descriptors.* @@ -97,8 +97,12 @@ internal class KtFe10PsiDefaultPropertyGetterSymbol( descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token) } + @OptIn(KtAnalysisApiInternals::class) override fun createPointer(): KtSymbolPointer = withValidityAssertion { - return KtFe10NeverRestoringSymbolPointer() + KtPsiBasedSymbolPointer.createForSymbolFromPsi(propertyPsi)?.let { + @Suppress("UNCHECKED_CAST") + KtPropertyAccessorSymbolPointer(it, isGetter = true) as KtSymbolPointer + } ?: KtFe10NeverRestoringSymbolPointer() } override fun equals(other: Any?): Boolean = isEqualTo(other) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt index 349a3c3d672..068d4b878cf 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade @@ -24,11 +25,11 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktSym import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList +import org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers.KtPropertyAccessorSymbolPointer +import org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers.KtValueParameterFromDefaultSetterSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin -import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.descriptors.* @@ -104,11 +105,14 @@ internal class KtFe10PsiDefaultPropertySetterSymbol( descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token) } + @OptIn(KtAnalysisApiInternals::class) override fun createPointer(): KtSymbolPointer = withValidityAssertion { - return KtFe10NeverRestoringSymbolPointer() + KtPsiBasedSymbolPointer.createForSymbolFromPsi(propertyPsi)?.let { + @Suppress("UNCHECKED_CAST") + KtPropertyAccessorSymbolPointer(it, isGetter = false) as KtSymbolPointer + } ?: KtFe10NeverRestoringSymbolPointer() } - override fun equals(other: Any?): Boolean = isEqualTo(other) override fun hashCode(): Int = calculateHashCode() @@ -149,8 +153,11 @@ internal class KtFe10PsiDefaultPropertySetterSymbol( descriptor?.let { KtFe10AnnotationsList.create(it.annotations, token) } ?: KtEmptyAnnotationsList(token) } + @OptIn(KtAnalysisApiInternals::class) override fun createPointer(): KtSymbolPointer = withValidityAssertion { - return KtFe10NeverRestoringSymbolPointer() + KtPsiBasedSymbolPointer.createForSymbolFromPsi(propertyPsi)?.let { + KtValueParameterFromDefaultSetterSymbolPointer(it) + } ?: KtFe10NeverRestoringSymbolPointer() } override fun equals(other: Any?): Boolean = isEqualTo(other) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt index 13ad867f235..97bf7e073b8 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt @@ -1,5 +1,5 @@ /* - * 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. */ @@ -18,9 +18,12 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.creat import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +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.symbolPointerDelegator import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.name.Name @@ -67,10 +70,11 @@ internal class KtFe10PsiDefaultSetterParameterSymbol( get() = withValidityAssertion { KtEmptyAnnotationsList(token) } override fun createPointer(): KtSymbolPointer = withValidityAssertion { - return KtFe10NeverRestoringSymbolPointer() + KtPsiBasedSymbolPointer.createForSymbolFromPsi(accessorPsi)?.let { symbolPointer -> + symbolPointerDelegator(symbolPointer) { it.parameter } + } ?: KtFe10NeverRestoringSymbolPointer() } - override fun equals(other: Any?): Boolean = isEqualTo(other) override fun hashCode(): Int = calculateHashCode() } 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 9181db0e229..e06a6a3c86c 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 @@ -88,7 +88,7 @@ internal class KtFirSymbolContainingDeclarationProvider( KtFakeSourceElementKind.ImplicitConstructor -> return source.psi as KtDeclaration KtFakeSourceElementKind.PropertyFromParameter -> return source.psi?.parentOfType()!! - KtFakeSourceElementKind.DefaultAccessor -> return source.psi as KtProperty + KtFakeSourceElementKind.DefaultAccessor -> return source.psi as KtDeclaration KtFakeSourceElementKind.ItLambdaParameter -> return source.psi as KtFunctionLiteral KtFakeSourceElementKind.EnumInitializer -> return source.psi as KtEnumEntry KtRealSourceElementKind -> source.psi!! 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 8591134e3bb..4bdc066ac52 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 @@ -6,12 +6,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals 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.impl.base.symbols.pointers.KtPropertyAccessorSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol @@ -57,8 +58,14 @@ internal class KtFirPropertyGetterSymbol( override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } override val receiverParameter: KtReceiverParameterSymbol? get() = withValidityAssertion { firSymbol.fir.propertySymbol.receiver(builder) } - - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } + + override val annotationsList by cached { + KtFirAnnotationListForDeclaration.create( + firSymbol, + firResolveSession.useSiteFirSession, + token, + ) + } /** * Returns [CallableId] of the delegated Java method if the corresponding property of this setter is a synthetic Java property. @@ -76,11 +83,12 @@ internal class KtFirPropertyGetterSymbol( override val hasStableParameterNames: Boolean get() = withValidityAssertion { true } + @OptIn(KtAnalysisApiInternals::class) override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } @Suppress("UNCHECKED_CAST") - KtFirPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = true) as KtSymbolPointer + KtPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = 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 8d3c2f3eaaf..bed29f2e605 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 @@ -6,12 +6,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals 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.impl.base.symbols.pointers.KtPropertyAccessorSymbolPointer import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol @@ -99,11 +100,12 @@ internal class KtFirPropertySetterSymbol( override val hasStableParameterNames: Boolean get() = withValidityAssertion { true } + @OptIn(KtAnalysisApiInternals::class) override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } @Suppress("UNCHECKED_CAST") - KtFirPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = false) as KtSymbolPointer + KtPropertyAccessorSymbolPointer(requireOwnerPointer(), isGetter = false) 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/KtFirValueParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt index 79358a19bae..ce4180c5634 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt @@ -46,9 +46,9 @@ internal class KtFirValueParameterSymbol( firSymbol.source?.kind == KtFakeSourceElementKind.ItLambdaParameter } - override val isCrossinline: Boolean get() = withValidityAssertion { firSymbol.isCrossinline} + override val isCrossinline: Boolean get() = withValidityAssertion { firSymbol.isCrossinline } - override val isNoinline: Boolean get() = withValidityAssertion { firSymbol.isNoinline} + override val isNoinline: Boolean get() = withValidityAssertion { firSymbol.isNoinline } override val returnType by cached { val returnType = firSymbol.resolvedReturnType @@ -64,7 +64,13 @@ internal class KtFirValueParameterSymbol( override val hasDefaultValue: Boolean get() = withValidityAssertion { firSymbol.hasDefaultValue } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } + override val annotationsList by cached { + KtFirAnnotationListForDeclaration.create( + firSymbol, + firResolveSession.useSiteFirSession, + token, + ) + } override val generatedPrimaryConstructorProperty: KtKotlinPropertySymbol? by cached { val propertySymbol = firSymbol.fir.correspondingProperty?.symbol ?: return@cached null @@ -72,6 +78,7 @@ internal class KtFirValueParameterSymbol( check(ktPropertySymbol is KtKotlinPropertySymbol) { "Unexpected symbol for primary constructor property ${ktPropertySymbol.javaClass} for fir: ${firSymbol.fir.renderWithType()}" } + ktPropertySymbol } @@ -79,14 +86,16 @@ internal class KtFirValueParameterSymbol( KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } analyze(firResolveSession.useSiteKtModule) { - val owner = getContainingSymbol() as KtFunctionLikeSymbol - val firFunction = owner.firSymbol.fir as FirFunction + when (val owner = getContainingSymbol()) { + is KtFunctionLikeSymbol -> + KtFirValueParameterSymbolPointer( + owner.createPointer(), + name, + (owner.firSymbol.fir as FirFunction).valueParameters.indexOf(firSymbol.fir), + ) - KtFirValueParameterSymbolPointer( - owner.createPointer(), - name, - firFunction.valueParameters.indexOf(firSymbol.fir), - ) + else -> error("${requireNotNull(owner)::class}") + } } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt similarity index 63% rename from analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt rename to analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt index f2472f64f8d..ecbae13d0a2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirPropertyAccessorSymbolPointer.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtPropertyAccessorSymbolPointer.kt @@ -3,27 +3,25 @@ * 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 +package org.jetbrains.kotlin.analysis.api.impl.base.symbols.pointers +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals 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.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -internal class KtFirPropertyAccessorSymbolPointer( - private val propertySymbolPointer: KtSymbolPointer, +@KtAnalysisApiInternals +class KtPropertyAccessorSymbolPointer( + 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-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt new file mode 100644 index 00000000000..5ff88d97df1 --- /dev/null +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/symbols/pointers/KtValueParameterFromDefaultSetterSymbolPointer.kt @@ -0,0 +1,25 @@ +/* + * 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.impl.base.symbols.pointers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer + +@KtAnalysisApiInternals +class KtValueParameterFromDefaultSetterSymbolPointer( + private val ownerPointer: KtSymbolPointer, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtValueParameterSymbol? { + val ownerSymbol = with(analysisSession) { + ownerPointer.restoreSymbol() + } + + return ownerSymbol?.setter?.parameter + } +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/AbstractMemberScopeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/AbstractMemberScopeByFqNameTest.kt similarity index 94% rename from analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/AbstractMemberScopeTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/AbstractMemberScopeByFqNameTest.kt index 58f085de2db..64218ab9477 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/AbstractMemberScopeTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/scopes/AbstractMemberScopeByFqNameTest.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.impl.base.test.SymbolByFqName import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByFqNameTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.SymbolsData -import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.services.TestServices diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt index 9290b4fcc23..5acf3db23d8 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolTest.kt @@ -85,11 +85,19 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { analyseForTest(ktFile) { val (symbols, symbolForPrettyRendering) = collectSymbols(ktFile, testServices) - val pointerWithRenderedSymbol = symbols.map { symbol -> - PointerWithRenderedSymbol( - symbol.safePointer(), - renderSymbolForComparison(symbol), - ) + val pointerWithRenderedSymbol = symbols.flatMap { symbol -> + listOf( + PointerWithRenderedSymbol( + symbol.safePointer(), + renderSymbolForComparison(symbol), + ) + ) + symbol.withImplicitSymbols().map { implicitSymbol -> + PointerWithRenderedSymbol( + implicitSymbol.safePointer(), + renderSymbolForComparison(implicitSymbol), + shouldBeRendered = false, + ) + } } val pointerWithPrettyRenderedSymbol = symbolForPrettyRendering.map { symbol -> @@ -105,7 +113,7 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { is KtReceiverParameterSymbol -> DebugSymbolRenderer().render(symbol) else -> error(symbol::class.toString()) - } + }, ) } @@ -168,7 +176,7 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { } private fun List.renderDeclarations(): String = - map { it.rendered }.renderAsDeclarations() + mapNotNull { it.rendered.takeIf { _ -> it.shouldBeRendered } }.renderAsDeclarations() private fun List.renderAsDeclarations(): String = if (isEmpty()) "NO_SYMBOLS" @@ -184,10 +192,16 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() { var failed = false try { val restored = analyseForTest(ktFile) { - pointersWithRendered.map { (pointerWrapper, expectedRender) -> + pointersWithRendered.mapNotNull { (pointerWrapper, expectedRender, shouldBeRendered) -> val pointer = pointerWrapper?.let(pointerAccessor) ?: error("Symbol pointer for $expectedRender was not created") val restored = pointer.restoreSymbol() ?: error("Symbol $expectedRender was not restored") - renderSymbolForComparison(restored) + val actualRender = renderSymbolForComparison(restored) + if (shouldBeRendered) { + actualRender + } else { + testServices.assertions.assertEquals(expectedRender, actualRender) { "${restored::class}" } + null + } } } @@ -259,9 +273,18 @@ private data class SymbolPointersData( private data class PointerWithRenderedSymbol( val pointer: PointerWrapper?, val rendered: String, + val shouldBeRendered: Boolean = true, ) private data class PointerWrapper( val regularPointer: KtSymbolPointer<*>, val pointerWithoutPsiAnchor: KtSymbolPointer<*>?, ) + +private fun KtSymbol?.withImplicitSymbols(): List = when (this) { + null -> emptyList() + is KtPropertySymbol -> listOf(this) + setter.withImplicitSymbols() + getter.withImplicitSymbols() + is KtPropertySetterSymbol -> listOf(this) + parameter + is KtValueParameterSymbol -> listOf(this) + generatedPrimaryConstructorProperty.withImplicitSymbols() + else -> listOf(this) +}