HL API: fix super declarations search for local classes
This commit is contained in:
committed by
TeamCityServer
parent
0e2d765a2d
commit
767af0dae0
+9
-9
@@ -15,22 +15,22 @@ import org.jetbrains.kotlin.fir.originalForIntersectionOverrideAttr
|
||||
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtOverrideInfoProvider
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.fir.components.KtFirAnalysisSessionComponent
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.util.ImplementationStatus
|
||||
|
||||
class KtFirOverrideInfoProvider(
|
||||
override val analysisSession: KtAnalysisSession,
|
||||
internal class KtFirOverrideInfoProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
override val token: ValidityToken,
|
||||
) : KtOverrideInfoProvider() {
|
||||
|
||||
private val firAnalysisSession = analysisSession as KtFirAnalysisSession
|
||||
) : KtOverrideInfoProvider(), KtFirAnalysisSessionComponent {
|
||||
|
||||
override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean {
|
||||
require(memberSymbol is KtFirSymbol<*>)
|
||||
@@ -60,7 +60,7 @@ class KtFirOverrideInfoProvider(
|
||||
if (parentClassFir !is FirClass) return@inner null
|
||||
|
||||
memberFir.symbol.getImplementationStatus(
|
||||
SessionHolderImpl(firAnalysisSession.rootModuleSession, ScopeSession()),
|
||||
SessionHolderImpl(rootModuleSession, ScopeSession()),
|
||||
parentClassFir.symbol
|
||||
)
|
||||
}
|
||||
@@ -71,9 +71,9 @@ class KtFirOverrideInfoProvider(
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir(FirResolvePhase.STATUS) { firDeclaration ->
|
||||
if (firDeclaration !is FirCallableDeclaration) return@withFir null
|
||||
with(analysisSession) {
|
||||
getOriginalOverriddenSymbol(firDeclaration)?.containingClass()?.classId?.getCorrespondingToplevelClassOrObjectSymbol()
|
||||
}
|
||||
val containingClass =
|
||||
getOriginalOverriddenSymbol(firDeclaration)?.containingClass()?.toSymbol(rootModuleSession) ?: return@withFir null
|
||||
analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(containingClass.fir) as? KtClassOrObjectSymbol
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
fun foo() {
|
||||
open class A {
|
||||
open fun foo() {}
|
||||
}
|
||||
|
||||
class B : A() {
|
||||
override fun fo<caret>o() {}
|
||||
}
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
ALL:
|
||||
foo.A.foo(): Unit
|
||||
DIRECT:
|
||||
foo.A.foo(): Unit
|
||||
+6
@@ -24,6 +24,12 @@ public class OverriddenDeclarationProviderTestGenerated extends AbstractOverridd
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/testData/components/overridenDeclarations"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("inLocalClass.kt")
|
||||
public void testInLocalClass() throws Exception {
|
||||
runTest("idea/idea-frontend-fir/testData/components/overridenDeclarations/inLocalClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("inOtherFile.kt")
|
||||
public void testInOtherFile() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user