FIR IDE: allow getting overridden symbols on any callable symbols

This way caller don't need to first check if the symbol is allowed to
override. The current API throws for cases like Java field, or enum
entry, which is not very user-friendly.
This commit is contained in:
Tianyu Geng
2021-08-25 23:17:47 -07:00
committed by Ilya Kirillov
parent 54b32f6911
commit 18a23f26f5
4 changed files with 15 additions and 3 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.components
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
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.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -57,7 +58,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) { private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) {
is FirSimpleFunction -> processFunctionsByName(declaration.name) { } is FirSimpleFunction -> processFunctionsByName(declaration.name) { }
is FirProperty -> processPropertiesByName(declaration.name) { } is FirProperty -> processPropertiesByName(declaration.name) { }
else -> error { "Invalid FIR symbol to process: ${declaration::class}" } else -> Unit
} }
private fun FirTypeScope.processAllOverriddenDeclarations( private fun FirTypeScope.processAllOverriddenDeclarations(
@@ -72,7 +73,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
processor.invoke(symbol.fir) processor.invoke(symbol.fir)
ProcessorAction.NEXT ProcessorAction.NEXT
} }
else -> error { "Invalid FIR symbol to process: ${declaration::class}" } else -> ProcessorAction.STOP
} }
private fun FirTypeScope.processDirectOverriddenDeclarations( private fun FirTypeScope.processDirectOverriddenDeclarations(
@@ -87,7 +88,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
processor.invoke(symbol.fir) processor.invoke(symbol.fir)
ProcessorAction.NEXT ProcessorAction.NEXT
} }
else -> error { "Invalid FIR symbol to process: ${declaration::class}" } else -> ProcessorAction.STOP
} }
private inline fun <T : KtSymbol> processOverrides( private inline fun <T : KtSymbol> processOverrides(
@@ -66,6 +66,12 @@ public class OverriddenDeclarationProviderTestGenerated extends AbstractOverridd
runTest("analysis/analysis-api/testData/components/overridenDeclarations/multipleInterfaces.kt"); runTest("analysis/analysis-api/testData/components/overridenDeclarations/multipleInterfaces.kt");
} }
@Test
@TestMetadata("onEnumEntry.kt")
public void testOnEnumEntry() throws Exception {
runTest("analysis/analysis-api/testData/components/overridenDeclarations/onEnumEntry.kt");
}
@Test @Test
@TestMetadata("sequenceOfOverrides.kt") @TestMetadata("sequenceOfOverrides.kt")
public void testSequenceOfOverrides() throws Exception { public void testSequenceOfOverrides() throws Exception {
@@ -0,0 +1,3 @@
enum class MyEnum {
My<caret>Entry
}
@@ -0,0 +1,2 @@
ALL:
DIRECT: