[Analysis API] Use resolution components from the same session

In 'getFirForNonBodyElement()', a wrong 'FirProvider' was used for
elements from modules other than a use-site one, and it could lead to
"Modules are inconsistent" exceptions from 'LLFirFileBuilder'.
This commit is contained in:
Yan Zhulanow
2023-12-22 01:09:59 +09:00
committed by Space Team
parent 297920fde9
commit 432884fe84
2 changed files with 9 additions and 24 deletions
@@ -75,14 +75,11 @@ internal class FirElementBuilder(
else -> true else -> true
} }
fun getOrBuildFirFor( fun getOrBuildFirFor(element: KtElement): FirElement? {
element: KtElement,
firResolveSession: LLFirResolveSession,
): FirElement? {
return if (element is KtFile && element !is KtCodeFragment) { return if (element is KtFile && element !is KtCodeFragment) {
getOrBuildFirForKtFile(element) getOrBuildFirForKtFile(element)
} else { } else {
getFirForNonKtFileElement(element, firResolveSession) getFirForNonKtFileElement(element)
} }
} }
@@ -92,18 +89,15 @@ internal class FirElementBuilder(
return firFile return firFile
} }
private fun getFirForNonKtFileElement( private fun getFirForNonKtFileElement(element: KtElement): FirElement? {
element: KtElement,
firResolveSession: LLFirResolveSession,
): FirElement? {
require(element !is KtFile || element is KtCodeFragment) require(element !is KtFile || element is KtCodeFragment)
if (!doKtElementHasCorrespondingFirElement(element)) { if (!doKtElementHasCorrespondingFirElement(element)) {
return null return null
} }
getFirForElementInsideAnnotations(element, firResolveSession)?.let { return it } getFirForElementInsideAnnotations(element)?.let { return it }
getFirForElementInsideTypes(element, firResolveSession)?.let { return it } getFirForElementInsideTypes(element)?.let { return it }
val psi = getPsiAsFirElementSource(element) ?: return null val psi = getPsiAsFirElementSource(element) ?: return null
val firFile = element.containingKtFile val firFile = element.containingKtFile
@@ -116,7 +110,6 @@ internal class FirElementBuilder(
private inline fun <T : KtElement> getFirForNonBodyElement( private inline fun <T : KtElement> getFirForNonBodyElement(
element: KtElement, element: KtElement,
firResolveSession: LLFirResolveSession,
anchorElementProvider: (KtElement) -> T?, anchorElementProvider: (KtElement) -> T?,
declarationProvider: (T) -> KtDeclaration?, declarationProvider: (T) -> KtDeclaration?,
resolveAndFindFirForAnchor: (FirDeclaration, T) -> FirElement?, resolveAndFindFirForAnchor: (FirDeclaration, T) -> FirElement?,
@@ -128,7 +121,7 @@ internal class FirElementBuilder(
val firDeclaration = nonLocalDeclaration.findSourceNonLocalFirDeclaration( val firDeclaration = nonLocalDeclaration.findSourceNonLocalFirDeclaration(
firFileBuilder = moduleComponents.firFileBuilder, firFileBuilder = moduleComponents.firFileBuilder,
provider = firResolveSession.useSiteFirSession.firProvider, provider = moduleComponents.session.firProvider,
) )
val anchorFir = resolveAndFindFirForAnchor(firDeclaration, anchorElement) ?: return null val anchorFir = resolveAndFindFirForAnchor(firDeclaration, anchorElement) ?: return null
@@ -144,23 +137,15 @@ internal class FirElementBuilder(
return modifierList.owner as? KtDeclaration return modifierList.owner as? KtDeclaration
} }
private fun getFirForElementInsideAnnotations( private fun getFirForElementInsideAnnotations(element: KtElement): FirElement? = getFirForNonBodyElement(
element: KtElement,
firResolveSession: LLFirResolveSession,
): FirElement? = getFirForNonBodyElement(
element = element, element = element,
firResolveSession = firResolveSession,
anchorElementProvider = { it.parentOfType<KtAnnotationEntry>(withSelf = true) }, anchorElementProvider = { it.parentOfType<KtAnnotationEntry>(withSelf = true) },
declarationProvider = { it.owner() }, declarationProvider = { it.owner() },
resolveAndFindFirForAnchor = { declaration, anchor -> declaration.resolveAndFindAnnotation(anchor, goDeep = true) }, resolveAndFindFirForAnchor = { declaration, anchor -> declaration.resolveAndFindAnnotation(anchor, goDeep = true) },
) )
private fun getFirForElementInsideTypes( private fun getFirForElementInsideTypes(element: KtElement): FirElement? = getFirForNonBodyElement(
element: KtElement,
firResolveSession: LLFirResolveSession,
): FirElement? = getFirForNonBodyElement(
element = element, element = element,
firResolveSession = firResolveSession,
anchorElementProvider = { it.parentsOfType<KtTypeReference>(withSelf = true).lastOrNull() }, anchorElementProvider = { it.parentsOfType<KtTypeReference>(withSelf = true).lastOrNull() },
declarationProvider = { declarationProvider = {
when (val parent = it.parent) { when (val parent = it.parent) {
@@ -45,7 +45,7 @@ internal class LLFirResolvableResolveSession(
) { ) {
override fun getOrBuildFirFor(element: KtElement): FirElement? { override fun getOrBuildFirFor(element: KtElement): FirElement? {
val moduleComponents = getModuleComponentsForElement(element) val moduleComponents = getModuleComponentsForElement(element)
return moduleComponents.elementsBuilder.getOrBuildFirFor(element, this) return moduleComponents.elementsBuilder.getOrBuildFirFor(element)
} }
override fun getOrBuildFirFile(ktFile: KtFile): FirFile { override fun getOrBuildFirFile(ktFile: KtFile): FirFile {