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)
return when (ktDeclaration) {
is KtEnumEntry -> searcher.findNonLocalEnumEntry(ktDeclaration)
is KtClassOrObject -> searcher.findNonLocalClass(ktDeclaration)
is KtConstructor<*> -> searcher.findConstructorOfNonLocalClass(ktDeclaration)
is KtNamedFunction -> searcher.findNonLocalFunction(ktDeclaration)
@@ -6,10 +6,7 @@
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.fir.declarations.FirClassLikeDeclaration
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.declarations.*
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredConstructors
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.
*/
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 {
require(!declaration.isLocal)
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 {
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