FIR IDE: allow get overriding symbols of members in anonymous object

This commit is contained in:
Tianyu Geng
2021-08-25 21:31:27 -07:00
committed by Ilya Kirillov
parent 50166c776c
commit 54b32f6911
4 changed files with 26 additions and 4 deletions
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverridePropertySymb
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationOverridesProvider 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.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.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
@@ -97,13 +98,15 @@ internal class KtFirSymbolDeclarationOverridesProvider(
val containingDeclaration = with(analysisSession) { val containingDeclaration = with(analysisSession) {
(callableSymbol as? KtCallableSymbol)?.originalContainingClassForOverride (callableSymbol as? KtCallableSymbol)?.originalContainingClassForOverride
} ?: return } ?: return
check(containingDeclaration is KtFirNamedClassOrObjectSymbol) when (containingDeclaration) {
is KtFirNamedClassOrObjectSymbol -> processOverrides(containingDeclaration, callableSymbol, process)
processOverrides(containingDeclaration, callableSymbol, process) is KtFirAnonymousObjectSymbol -> processOverrides(containingDeclaration, callableSymbol, process)
else -> throw IllegalStateException("Expected $containingDeclaration to be a KtFirNamedClassOrObjectSymbol or KtFirAnonymousObjectSymbol")
}
} }
private inline fun processOverrides( private inline fun processOverrides(
containingDeclaration: KtFirNamedClassOrObjectSymbol, containingDeclaration: KtFirSymbol<FirClass>,
callableSymbol: KtFirSymbol<*>, callableSymbol: KtFirSymbol<*>,
crossinline process: (FirTypeScope, FirDeclaration) -> Unit crossinline process: (FirTypeScope, FirDeclaration) -> Unit
) { ) {
@@ -24,6 +24,12 @@ public class OverriddenDeclarationProviderTestGenerated extends AbstractOverridd
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/overridenDeclarations"), Pattern.compile("^(.+)\\.kt$"), null, true); KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/overridenDeclarations"), Pattern.compile("^(.+)\\.kt$"), null, true);
} }
@Test
@TestMetadata("inAnonymousClass.kt")
public void testInAnonymousClass() throws Exception {
runTest("analysis/analysis-api/testData/components/overridenDeclarations/inAnonymousClass.kt");
}
@Test @Test
@TestMetadata("inLocalClass.kt") @TestMetadata("inLocalClass.kt")
public void testInLocalClass() throws Exception { public void testInLocalClass() throws Exception {
@@ -0,0 +1,9 @@
fun foo() {
open class A {
open fun foo() {}
}
object : A() {
override fun fo<caret>o() {}
}
}
@@ -0,0 +1,4 @@
ALL:
foo.A.foo(): Unit
DIRECT:
foo.A.foo(): Unit