FIR LL: fix searching logic for enum entry

KtEnumEntry, a subtype of KtClass, has been handled by
findNonLocalClass. Since KtEnumEntry doesn't have class id, that util
always throws an error while retrieving class id.

Instead, we should use containing class (i.e., enum class) id.
Also, once the enum class is resolved, we should search for matching
enum entry inside the enum class.
This commit is contained in:
Jinseong Jeon
2021-11-09 22:01:46 -08:00
committed by Roman Golyshev
parent 140b8d6ddf
commit cf886c5975
5 changed files with 29 additions and 4 deletions
@@ -129,6 +129,7 @@ internal class FirModuleResolveStateImpl(
val searcher = FirDeclarationForCompiledElementSearcher(rootModuleSession.symbolProvider) val searcher = FirDeclarationForCompiledElementSearcher(rootModuleSession.symbolProvider)
return when (ktDeclaration) { return when (ktDeclaration) {
is KtEnumEntry -> searcher.findNonLocalEnumEntry(ktDeclaration)
is KtClassOrObject -> searcher.findNonLocalClass(ktDeclaration) is KtClassOrObject -> searcher.findNonLocalClass(ktDeclaration)
is KtConstructor<*> -> searcher.findConstructorOfNonLocalClass(ktDeclaration) is KtConstructor<*> -> searcher.findConstructorOfNonLocalClass(ktDeclaration)
is KtNamedFunction -> searcher.findNonLocalFunction(ktDeclaration) is KtNamedFunction -> searcher.findNonLocalFunction(ktDeclaration)
@@ -6,10 +6,7 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.util package org.jetbrains.kotlin.analysis.low.level.api.fir.util
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.KtDeclarationAndFirDeclarationEqualityChecker import org.jetbrains.kotlin.analysis.low.level.api.fir.api.KtDeclarationAndFirDeclarationEqualityChecker
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredConstructors import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredConstructors
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredFunctionSymbols import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredFunctionSymbols
@@ -24,6 +21,20 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
* Allows to search for FIR declarations by compiled [KtDeclaration]s. * Allows to search for FIR declarations by compiled [KtDeclaration]s.
*/ */
internal class FirDeclarationForCompiledElementSearcher(private val symbolProvider: FirSymbolProvider) { internal class FirDeclarationForCompiledElementSearcher(private val symbolProvider: FirSymbolProvider) {
fun findNonLocalEnumEntry(declaration: KtEnumEntry): FirEnumEntry {
require(!declaration.isLocal)
val classId = declaration.containingClassOrObject?.getClassId()
?: error("Non-local class should have classId. The class is ${declaration.getElementTextInContext()}")
val classCandidate = symbolProvider.getClassLikeSymbolByClassId(classId)
?: error("We should be able to find a symbol for $classId")
return (classCandidate.fir as? FirRegularClass)?.declarations?.first {
it is FirEnumEntry && it.name == declaration.nameAsName
} as FirEnumEntry
}
fun findNonLocalClass(declaration: KtClassOrObject): FirClassLikeDeclaration { fun findNonLocalClass(declaration: KtClassOrObject): FirClassLikeDeclaration {
require(!declaration.isLocal) require(!declaration.isLocal)
val classId = declaration.getClassId() val classId = declaration.getClassId()
@@ -0,0 +1,2 @@
@Retention(AnnotationRetention.<expr>SOURCE</expr>)
annotation class Anno
@@ -0,0 +1,5 @@
KT element: KtNameReferenceExpression
FIR element: FirResolvedNamedReferenceImpl
FIR element rendered:
R|kotlin/annotation/AnnotationRetention.SOURCE|
@@ -68,6 +68,12 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest {
public void testFileAnnotation() throws Exception { public void testFileAnnotation() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/fileAnnotation.kt"); runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/fileAnnotation.kt");
} }
@Test
@TestMetadata("retentionValue.kt")
public void testRetentionValue() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/annotations/retentionValue.kt");
}
} }
@Nested @Nested