diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt index c63b697927b..79486b6b5de 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt @@ -27,12 +27,12 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverrideFunctionSymb import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverridePropertySymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.toRegularClassSymbol +import org.jetbrains.kotlin.fir.unwrapFakeOverrides internal class KtFirSymbolDeclarationOverridesProvider( override val analysisSession: KtFirAnalysisSession, override val token: KtLifetimeToken ) : KtSymbolDeclarationOverridesProviderBase(), KtFirAnalysisSessionComponent { - override fun getAllOverriddenSymbols( callableSymbol: T, ): List { @@ -40,13 +40,15 @@ internal class KtFirSymbolDeclarationOverridesProvider( if (callableSymbol is KtValueParameterSymbol) { return callableSymbol.getAllOverriddenSymbols() } + val overriddenElement = mutableSetOf>() processOverrides(callableSymbol) { firTypeScope, firCallableDeclaration -> firTypeScope.processAllOverriddenDeclarations(firCallableDeclaration) { overriddenDeclaration -> overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement) } } - return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) }.distinct() + + return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) } } override fun getDirectlyOverriddenSymbols(callableSymbol: T): List { @@ -54,13 +56,15 @@ internal class KtFirSymbolDeclarationOverridesProvider( if (callableSymbol is KtValueParameterSymbol) { return callableSymbol.getDirectlyOverriddenSymbols() } + val overriddenElement = mutableSetOf>() processOverrides(callableSymbol) { firTypeScope, firCallableDeclaration -> firTypeScope.processDirectOverriddenDeclarations(firCallableDeclaration) { overriddenDeclaration -> overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement) } } - return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) }.distinct() + + return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) } } private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) { @@ -144,7 +148,7 @@ internal class KtFirSymbolDeclarationOverridesProvider( intersections.forEach { it.collectIntersectionOverridesSymbolsTo(to) } } else -> { - to += this + to += this.fir.unwrapFakeOverrides().symbol } } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt index d6923640bf0..381d6bea3d1 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationOverridesProvider.kt @@ -22,11 +22,13 @@ public abstract class KtSymbolDeclarationOverridesProvider : KtAnalysisSessionCo public interface KtSymbolDeclarationOverridesProviderMixIn : KtAnalysisSessionMixIn { /** - * Return a list of **all** symbols which are overridden by symbol + * Return a list of **all** explicitly declared symbols that are overridden by symbol * - * E.g, if we have `A.foo` overrides `B.foo` overrides `C.foo`, all two super declarations `B.foo`, `C.foo` will be returned + * E.g., if we have `A.foo` overrides `B.foo` overrides `C.foo`, all two super declarations `B.foo`, `C.foo` will be returned * - * Unwraps substituted overridden symbols (see [org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin.INTERSECTION_OVERRIDE]) + * Unwraps substituted overridden symbols + * (see [INTERSECTION_OVERRIDE][org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin.INTERSECTION_OVERRIDE] and [SUBSTITUTION_OVERRIDE][org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin.SUBSTITUTION_OVERRIDE]), + * so such fake declaration won't be returned. * * @see getDirectlyOverriddenSymbols */ @@ -34,11 +36,13 @@ public interface KtSymbolDeclarationOverridesProviderMixIn : KtAnalysisSessionMi withValidityAssertion { analysisSession.symbolDeclarationOverridesProvider.getAllOverriddenSymbols(this) } /** - * Return a list of symbols which are **directly** overridden by symbol + * Return a list of explicitly declared symbols which are **directly** overridden by symbol ** - * E.g, if we have `A.foo` overrides `B.foo` overrides `C.foo`, only declarations directly overridden `B.foo` will be returned + * E.g., if we have `A.foo` overrides `B.foo` overrides `C.foo`, only declarations directly overridden `B.foo` will be returned * - * Unwraps substituted overridden symbols (see [org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin.INTERSECTION_OVERRIDE]) + * Unwraps substituted overridden symbols + * (see [INTERSECTION_OVERRIDE][org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin.INTERSECTION_OVERRIDE] and [SUBSTITUTION_OVERRIDE][org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin.SUBSTITUTION_OVERRIDE]), + * so such fake declaration won't be returned. * * @see getAllOverriddenSymbols */ diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.kt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.kt index f315af0203a..ffc59f84fde 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.kt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.kt @@ -2,14 +2,3 @@ class MyList : ArrayList() { override val size: Int = 0 override fun get(index: Int): Int = 0 } - -// RESULT -// ALL: -// java/util/ArrayList.size: Int -// java/util/AbstractList.size: Int -// java/util/AbstractCollection.size: Int -// List.size: Int -// Collection.size: Int - -// DIRECT: -// java/util/ArrayList.size: Int diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.standalone.fir.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.standalone.fir.txt index e432c065416..95c9cc3dddc 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.standalone.fir.txt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.standalone.fir.txt @@ -1,6 +1,5 @@ ALL: java/util/ArrayList.size: Int - java/util/AbstractList.size: Int java/util/AbstractCollection.size: Int kotlin/collections/List.size: Int kotlin/collections/Collection.size: Int diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.txt index 7b8d9d5d418..f01569da2f2 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.txt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/arraylistSubtype.txt @@ -1,6 +1,5 @@ ALL: java/util/ArrayList.size: Int - java/util/AbstractList.size: Int java/util/AbstractCollection.size: Int List.size: Int Collection.size: Int diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithImplicitTypeInsideAnonymousObject.kt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithImplicitTypeInsideAnonymousObject.kt index 3a9a9ef0450..96f58437c71 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithImplicitTypeInsideAnonymousObject.kt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithImplicitTypeInsideAnonymousObject.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR class MyClass { lateinit var d: IntermediateClass val prop = object : IntermediateClass by d { diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.descriptors.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.descriptors.txt deleted file mode 100644 index 34bb029eb25..00000000000 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.descriptors.txt +++ /dev/null @@ -1,4 +0,0 @@ -ALL: - BaseClass.isSchemeFile(name: CharSequence): Boolean -DIRECT: - BaseClass.isSchemeFile(name: CharSequence): Boolean diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.txt index 5baa0894aab..34bb029eb25 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.txt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/delegateOverrideWithoutImplicitTypeInsideAnonymousObject.txt @@ -1,5 +1,4 @@ ALL: BaseClass.isSchemeFile(name: CharSequence): Boolean - BaseClass.isSchemeFile(name: CharSequence): Boolean DIRECT: BaseClass.isSchemeFile(name: CharSequence): Boolean diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.descriptors.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.descriptors.txt new file mode 100644 index 00000000000..be9e7f5f5d6 --- /dev/null +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.descriptors.txt @@ -0,0 +1,2 @@ +ALL: +DIRECT: diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.kt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.kt index 4f574820ed5..f81ce1c59d6 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.kt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR package second class MyClass { diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.txt index be9e7f5f5d6..26a26282400 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.txt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithImplicitTypeInsideAnonymousObject.txt @@ -1,2 +1,5 @@ ALL: + C.foo(x: T): Unit + D.foo(x: F): Unit DIRECT: + C.foo(x: T): Unit diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.txt index 366e0d25560..26a26282400 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.txt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.txt @@ -1,8 +1,5 @@ ALL: - C.foo(x: String): Unit - C.foo(x: T): Unit - D.foo(x: T): Unit C.foo(x: T): Unit D.foo(x: F): Unit DIRECT: - C.foo(x: String): Unit + C.foo(x: T): Unit diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithImplicitTypeInsideAnonymousObject.kt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithImplicitTypeInsideAnonymousObject.kt index 684ccc01812..79c11d15159 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithImplicitTypeInsideAnonymousObject.kt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithImplicitTypeInsideAnonymousObject.kt @@ -1,4 +1,3 @@ -// IGNORE_FIR package second class MyClass { diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.descriptors.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.descriptors.txt deleted file mode 100644 index ebd51c7fd0f..00000000000 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.descriptors.txt +++ /dev/null @@ -1,4 +0,0 @@ -ALL: - LazySchemeProcessor.isSchemeFile(name: CharSequence): Boolean -DIRECT: - LazySchemeProcessor.isSchemeFile(name: CharSequence): Boolean diff --git a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.txt b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.txt index bdfa2b6a2fc..ebd51c7fd0f 100644 --- a/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.txt +++ b/analysis/analysis-api/testData/components/symbolDeclarationOverridesProvider/overriddenSymbols/substitutionOverrideWithoutImplicitTypeInsideAnonymousObject.txt @@ -1,5 +1,4 @@ ALL: LazySchemeProcessor.isSchemeFile(name: CharSequence): Boolean - LazySchemeProcessor.isSchemeFile(name: CharSequence): Boolean DIRECT: - LazySchemeProcessor.isSchemeFile(name: CharSequence): Boolean \ No newline at end of file + LazySchemeProcessor.isSchemeFile(name: CharSequence): Boolean