[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:
+9
-2
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+9
-2
@@ -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 ->
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+6
@@ -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 {
|
||||||
|
|||||||
+22
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -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 {
|
||||||
|
|||||||
+13
@@ -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
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
ALL:
|
||||||
|
B.B.p: String
|
||||||
|
DIRECT:
|
||||||
|
B.B.p: String
|
||||||
Reference in New Issue
Block a user