[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:
+8
-23
@@ -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) {
|
||||||
|
|||||||
+1
-1
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user