From d60f3980b170ad85ed3c6390dc589f9c7d2b3ee2 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 28 Jul 2022 12:28:53 +0300 Subject: [PATCH] [AA LC] Correctly determine override status for accessor methods --- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 7 +++++- .../fir/symbols/KtFirPropertySetterSymbol.kt | 23 ++++++++++++++++--- .../symbols/symbolByPsi/enumValueMember.txt | 4 ++-- 3 files changed, 28 insertions(+), 6 deletions(-) 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 4fdba3c6ca8..cc7aa33ef23 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 @@ -44,7 +44,12 @@ internal class KtFirPropertyGetterSymbol( override val isDefault: Boolean get() = withValidityAssertion { firSymbol.fir is FirDefaultPropertyAccessor } override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline } - override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val isOverride: Boolean + get() = withValidityAssertion { + if (firSymbol.isOverride) return@withValidityAssertion true + return firSymbol.fir.propertySymbol?.isOverride == true + } + override val hasBody: Boolean get() = withValidityAssertion { firSymbol.fir.body != null } override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } 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 a6d00c07c95..af8f5fe13af 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 @@ -10,13 +10,13 @@ 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.utils.cached +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol 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.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility @@ -27,6 +27,9 @@ import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal import org.jetbrains.kotlin.fir.declarations.utils.visibility 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 import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.name.CallableId @@ -45,7 +48,21 @@ internal class KtFirPropertySetterSymbol( override val isDefault: Boolean get() = withValidityAssertion { firSymbol.fir is FirDefaultPropertyAccessor } override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline } - override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val isOverride: Boolean + get() = withValidityAssertion { + if (firSymbol.isOverride) return true + val propertySymbol = firSymbol.fir.propertySymbol ?: return@withValidityAssertion false + if (!propertySymbol.isOverride) return false + val session = firResolveSession.useSiteFirSession + val containingClassScope = firSymbol.dispatchReceiverType?.scope( + session, + firResolveSession.getScopeSessionFor(session), + FakeOverrideTypeCalculator.DoNothing + ) ?: return false + val overriddenProperties = containingClassScope.getDirectOverriddenProperties(propertySymbol) + overriddenProperties.any { it.isVar } + } + override val hasBody: Boolean get() = withValidityAssertion { firSymbol.fir.body != null } override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt index 9d6fec2deb5..feebe4b8b58 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt @@ -47,7 +47,7 @@ KtPropertyGetterSymbol: isDefault: false isExtension: false isInline: false - isOverride: false + isOverride: true modality: FINAL origin: SOURCE receiverType: null @@ -163,4 +163,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null