[AA] retrieve overridden symbols for parameter from generated property

Merge-request: KT-MR-11215
Merged-by: Anna Kozlova <Anna.Kozlova@jetbrains.com>
This commit is contained in:
Anna Kozlova
2023-07-24 11:09:56 +00:00
committed by Space Team
parent 53aa8eddfe
commit 40a6c81d97
9 changed files with 81 additions and 4 deletions
@@ -5,15 +5,16 @@
package org.jetbrains.kotlin.analysis.api.descriptors.components package org.jetbrains.kotlin.analysis.api.descriptors.components
import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationOverridesProvider
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
import org.jetbrains.kotlin.analysis.api.impl.base.components.KtSymbolDeclarationOverridesProviderBase
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
@@ -21,16 +22,22 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf
internal class KtFe10SymbolDeclarationOverridesProvider( internal class KtFe10SymbolDeclarationOverridesProvider(
override val analysisSession: KtFe10AnalysisSession override val analysisSession: KtFe10AnalysisSession
) : KtSymbolDeclarationOverridesProvider(), Fe10KtAnalysisSessionComponent { ) : KtSymbolDeclarationOverridesProviderBase(), Fe10KtAnalysisSessionComponent {
override val token: KtLifetimeToken override val token: KtLifetimeToken
get() = analysisSession.token get() = analysisSession.token
override fun <T : KtSymbol> getAllOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> { override fun <T : KtSymbol> getAllOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
if (callableSymbol is KtValueParameterSymbol) {
return callableSymbol.getAllOverriddenSymbols()
}
val descriptor = getSymbolDescriptor(callableSymbol) as? CallableMemberDescriptor ?: return emptyList() val descriptor = getSymbolDescriptor(callableSymbol) as? CallableMemberDescriptor ?: return emptyList()
return getOverriddenDescriptors(descriptor, true).mapNotNull { it.toKtCallableSymbol(analysisContext) }.distinct() return getOverriddenDescriptors(descriptor, true).mapNotNull { it.toKtCallableSymbol(analysisContext) }.distinct()
} }
override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> { override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
if (callableSymbol is KtValueParameterSymbol) {
return callableSymbol.getDirectlyOverriddenSymbols()
}
val descriptor = getSymbolDescriptor(callableSymbol) as? CallableMemberDescriptor ?: return emptyList() val descriptor = getSymbolDescriptor(callableSymbol) as? CallableMemberDescriptor ?: return emptyList()
return getOverriddenDescriptors(descriptor, false).mapNotNull { it.toKtCallableSymbol(analysisContext) }.distinct() return getOverriddenDescriptors(descriptor, false).mapNotNull { it.toKtCallableSymbol(analysisContext) }.distinct()
} }
@@ -106,6 +106,12 @@ public class Fe10IdeNormalAnalysisSourceModuleOverriddenDeclarationProviderTestG
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt"); runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt");
} }
@Test
@TestMetadata("parameterWithGeneratedProperty.kt")
public void testParameterWithGeneratedProperty() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/parameterWithGeneratedProperty.kt");
}
@Test @Test
@TestMetadata("sequenceOfOverrides.kt") @TestMetadata("sequenceOfOverrides.kt")
public void testSequenceOfOverrides() throws Exception { public void testSequenceOfOverrides() throws Exception {
@@ -5,17 +5,18 @@
package org.jetbrains.kotlin.analysis.api.fir.components package org.jetbrains.kotlin.analysis.api.fir.components
import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationOverridesProvider
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirAnonymousObjectSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirAnonymousObjectSymbol
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.analysis.api.impl.base.components.KtSymbolDeclarationOverridesProviderBase
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
@@ -30,12 +31,15 @@ import org.jetbrains.kotlin.fir.types.toRegularClassSymbol
internal class KtFirSymbolDeclarationOverridesProvider( internal class KtFirSymbolDeclarationOverridesProvider(
override val analysisSession: KtFirAnalysisSession, override val analysisSession: KtFirAnalysisSession,
override val token: KtLifetimeToken override val token: KtLifetimeToken
) : KtSymbolDeclarationOverridesProvider(), KtFirAnalysisSessionComponent { ) : KtSymbolDeclarationOverridesProviderBase(), KtFirAnalysisSessionComponent {
override fun <T : KtSymbol> getAllOverriddenSymbols( override fun <T : KtSymbol> getAllOverriddenSymbols(
callableSymbol: T, callableSymbol: T,
): List<KtCallableSymbol> { ): List<KtCallableSymbol> {
if (callableSymbol is KtFirBackingFieldSymbol) return emptyList() if (callableSymbol is KtFirBackingFieldSymbol) return emptyList()
if (callableSymbol is KtValueParameterSymbol) {
return callableSymbol.getAllOverriddenSymbols()
}
val overriddenElement = mutableSetOf<FirCallableSymbol<*>>() val overriddenElement = mutableSetOf<FirCallableSymbol<*>>()
processOverrides(callableSymbol) { firTypeScope, firCallableDeclaration -> processOverrides(callableSymbol) { firTypeScope, firCallableDeclaration ->
firTypeScope.processAllOverriddenDeclarations(firCallableDeclaration) { overriddenDeclaration -> firTypeScope.processAllOverriddenDeclarations(firCallableDeclaration) { overriddenDeclaration ->
@@ -47,6 +51,9 @@ internal class KtFirSymbolDeclarationOverridesProvider(
override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> { override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
if (callableSymbol is KtFirBackingFieldSymbol) return emptyList() if (callableSymbol is KtFirBackingFieldSymbol) return emptyList()
if (callableSymbol is KtValueParameterSymbol) {
return callableSymbol.getDirectlyOverriddenSymbols()
}
val overriddenElement = mutableSetOf<FirCallableSymbol<*>>() val overriddenElement = mutableSetOf<FirCallableSymbol<*>>()
processOverrides(callableSymbol) { firTypeScope, firCallableDeclaration -> processOverrides(callableSymbol) { firTypeScope, firCallableDeclaration ->
firTypeScope.processDirectOverriddenDeclarations(firCallableDeclaration) { overriddenDeclaration -> firTypeScope.processDirectOverriddenDeclarations(firCallableDeclaration) { overriddenDeclaration ->
@@ -106,6 +106,12 @@ public class FirIdeDependentAnalysisSourceModuleOverriddenDeclarationProviderTes
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt"); runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt");
} }
@Test
@TestMetadata("parameterWithGeneratedProperty.kt")
public void testParameterWithGeneratedProperty() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/parameterWithGeneratedProperty.kt");
}
@Test @Test
@TestMetadata("sequenceOfOverrides.kt") @TestMetadata("sequenceOfOverrides.kt")
public void testSequenceOfOverrides() throws Exception { public void testSequenceOfOverrides() throws Exception {
@@ -106,6 +106,12 @@ public class FirIdeNormalAnalysisSourceModuleOverriddenDeclarationProviderTestGe
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt"); runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt");
} }
@Test
@TestMetadata("parameterWithGeneratedProperty.kt")
public void testParameterWithGeneratedProperty() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/parameterWithGeneratedProperty.kt");
}
@Test @Test
@TestMetadata("sequenceOfOverrides.kt") @TestMetadata("sequenceOfOverrides.kt")
public void testSequenceOfOverrides() throws Exception { public void testSequenceOfOverrides() throws Exception {
@@ -0,0 +1,22 @@
/*
* 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.impl.base.components
import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationOverridesProvider
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
abstract class KtSymbolDeclarationOverridesProviderBase : KtSymbolDeclarationOverridesProvider() {
protected fun KtValueParameterSymbol.getAllOverriddenSymbols(): List<KtCallableSymbol> {
generatedPrimaryConstructorProperty?.let { return getAllOverriddenSymbols(it) }
return emptyList()
}
protected fun KtValueParameterSymbol.getDirectlyOverriddenSymbols(): List<KtCallableSymbol> {
generatedPrimaryConstructorProperty?.let { return getDirectlyOverriddenSymbols(it) }
return emptyList()
}
}
@@ -106,6 +106,12 @@ public class FirStandaloneNormalAnalysisSourceModuleOverriddenDeclarationProvide
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt"); runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/onEnumEntry.kt");
} }
@Test
@TestMetadata("parameterWithGeneratedProperty.kt")
public void testParameterWithGeneratedProperty() throws Exception {
runTest("analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/parameterWithGeneratedProperty.kt");
}
@Test @Test
@TestMetadata("sequenceOfOverrides.kt") @TestMetadata("sequenceOfOverrides.kt")
public void testSequenceOfOverrides() throws Exception { public void testSequenceOfOverrides() throws Exception {
@@ -0,0 +1,13 @@
// FILE: main.kt
class A(override val <caret>p: String): B(p)
// FILE: B.kt
open class B(val p: String)
// RESULT
// ALL:
// B.p: String
// DIRECT:
// B.p: String
@@ -0,0 +1,4 @@
ALL:
B.B.p: String
DIRECT:
B.B.p: String