From 04a2d6b61685bbc5c993596a41e0479ee7b115c8 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 13 Feb 2024 15:42:35 +0100 Subject: [PATCH] [LL FIR] FirElementBuilder: make getFirForNonBodyElement more abstract This is required for the next step ^KT-65780 --- .../fir/element/builder/FirElementBuilder.kt | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt index 4bbc18c7291..d61b804ff4b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt @@ -109,20 +109,20 @@ internal class FirElementBuilder( return mappings.getFir(psi) } - private inline fun getFirForNonBodyElement( + private inline fun getFirForNonBodyElement( element: KtElement, anchorElementProvider: (KtElement) -> T?, - annotatedElementProvider: (T) -> KtAnnotated?, - resolveAndFindFirForAnchor: (FirAnnotationContainer, T) -> FirElement?, + elementOwnerProvider: (T) -> E?, + resolveAndFindFirForAnchor: (FirElementWithResolveState, T) -> FirElement?, ): FirElement? { val anchorElement = anchorElementProvider(element) ?: return null - val annotationElement = annotatedElementProvider(anchorElement) ?: return null + val elementOwner = elementOwnerProvider(anchorElement) ?: return null - val firAnnotationContainer = if (annotationElement is KtFile) { - moduleComponents.firFileBuilder.buildRawFirFileWithCaching(annotationElement) + val firElementContainer = if (elementOwner is KtFile) { + moduleComponents.firFileBuilder.buildRawFirFileWithCaching(elementOwner) } else { - val nonLocalDeclaration = annotationElement.getNonLocalContainingOrThisDeclaration() - if (annotationElement != nonLocalDeclaration) return null + val nonLocalDeclaration = elementOwner.getNonLocalContainingOrThisDeclaration() + if (elementOwner != nonLocalDeclaration) return null nonLocalDeclaration.findSourceNonLocalFirDeclaration( firFileBuilder = moduleComponents.firFileBuilder, @@ -130,7 +130,7 @@ internal class FirElementBuilder( ) } - val anchorFir = resolveAndFindFirForAnchor(firAnnotationContainer, anchorElement) ?: return null + val anchorFir = resolveAndFindFirForAnchor(firElementContainer, anchorElement) ?: return null // We use identity comparison here intentionally to check that it is exactly the object we want to find if (element === anchorElement) return anchorFir @@ -148,17 +148,19 @@ internal class FirElementBuilder( return modifierList?.owner as? KtDeclaration } - private fun getFirForElementInsideAnnotations(element: KtElement): FirElement? = getFirForNonBodyElement( + private fun getFirForElementInsideAnnotations( + element: KtElement, + ): FirElement? = getFirForNonBodyElement( element = element, anchorElementProvider = { it.parentOfType(withSelf = true) }, - annotatedElementProvider = { it.owner() }, + elementOwnerProvider = { it.owner() }, resolveAndFindFirForAnchor = { declaration, anchor -> declaration.resolveAndFindAnnotation(anchor, goDeep = true) }, ) - private fun getFirForElementInsideTypes(element: KtElement): FirElement? = getFirForNonBodyElement( + private fun getFirForElementInsideTypes(element: KtElement): FirElement? = getFirForNonBodyElement( element = element, anchorElementProvider = { it.parentsOfType(withSelf = true).lastOrNull() }, - annotatedElementProvider = { + elementOwnerProvider = { when (val parent = it.parent) { is KtDeclaration -> parent is KtSuperTypeListEntry, is KtConstructorCalleeExpression, is KtTypeConstraint -> parent.parentOfType() @@ -190,8 +192,8 @@ internal class FirElementBuilder( return firElement } - private fun FirAnnotationContainer.resolveAndFindTypeRefAnchor(typeReference: KtTypeReference): FirElement? { - requireTypeIntersectionWith() + private fun FirElementWithResolveState.resolveAndFindTypeRefAnchor(typeReference: KtTypeReference): FirElement? { + requireTypeIntersectionWith() lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS) @@ -231,11 +233,11 @@ internal class FirElementBuilder( return null } - private fun FirAnnotationContainer.resolveAndFindAnnotation( + private fun FirElementWithResolveState.resolveAndFindAnnotation( annotationEntry: KtAnnotationEntry, goDeep: Boolean = false, ): FirAnnotation? { - requireTypeIntersectionWith() + requireTypeIntersectionWith() lazyResolveToPhase(FirResolvePhase.ANNOTATION_ARGUMENTS) findAnnotation(annotationEntry)?.let { return it }