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:
committed by
Roman Golyshev
parent
140b8d6ddf
commit
cf886c5975
+1
@@ -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)
|
||||
|
||||
+15
-4
@@ -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()
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
@Retention(AnnotationRetention.<expr>SOURCE</expr>)
|
||||
annotation class Anno
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
KT element: KtNameReferenceExpression
|
||||
FIR element: FirResolvedNamedReferenceImpl
|
||||
|
||||
FIR element rendered:
|
||||
R|kotlin/annotation/AnnotationRetention.SOURCE|
|
||||
+6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user