FIR IDE: fix completion on parenthesized expression
This commit is contained in:
+1
-1
@@ -32,7 +32,7 @@ internal class FirModuleResolveStateForCompletion(
|
||||
originalState.getSessionFor(moduleInfo)
|
||||
|
||||
override fun getOrBuildFirFor(element: KtElement, toPhase: FirResolvePhase): FirElement {
|
||||
completionMapping[element]?.let { return it }
|
||||
completionMapping[originalState.elementBuilder.getPsiAsFirElementSource(element)]?.let { return it }
|
||||
return originalState.elementBuilder.getOrBuildFirFor(
|
||||
element,
|
||||
originalState.rootModuleSession.cache,
|
||||
|
||||
+18
-11
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureC
|
||||
import org.jetbrains.kotlin.idea.util.getElementTextInContext
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
import org.jetbrains.kotlin.psi2ir.deparenthesize
|
||||
|
||||
/**
|
||||
* Maps [KtElement] to [FirElement]
|
||||
@@ -23,6 +24,22 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
*/
|
||||
@ThreadSafe
|
||||
internal class FirElementBuilder {
|
||||
fun getPsiAsFirElementSource(element: KtElement): KtElement {
|
||||
val deparenthesized = if (element is KtPropertyDelegate) element.deparenthesize() else element
|
||||
return when {
|
||||
deparenthesized is KtParenthesizedExpression -> deparenthesized.deparenthesize()
|
||||
deparenthesized is KtPropertyDelegate -> deparenthesized.expression ?: element
|
||||
deparenthesized is KtQualifiedExpression && deparenthesized.selectorExpression is KtCallExpression -> {
|
||||
/*
|
||||
KtQualifiedExpression with KtCallExpression in selector transformed in FIR to FirFunctionCall expression
|
||||
Which will have a receiver as qualifier
|
||||
*/
|
||||
deparenthesized.selectorExpression ?: error("Incomplete code:\n${element.getElementTextInContext()}")
|
||||
}
|
||||
else -> deparenthesized
|
||||
}
|
||||
}
|
||||
|
||||
fun getOrBuildFirFor(
|
||||
element: KtElement,
|
||||
moduleFileCache: ModuleFileCache,
|
||||
@@ -31,17 +48,7 @@ internal class FirElementBuilder {
|
||||
val fileStructure = fileStructureCache.getFileStructure(element.containingKtFile, moduleFileCache)
|
||||
val mappings = fileStructure.getStructureElementFor(element).mappings
|
||||
|
||||
val psi = when {
|
||||
element is KtPropertyDelegate -> element.expression ?: element
|
||||
element is KtQualifiedExpression && element.selectorExpression is KtCallExpression -> {
|
||||
/*
|
||||
KtQualifiedExpression with KtCallExpression in selector transformed in FIR to FirFunctionCall expression
|
||||
Which will have a receiver as qualifier
|
||||
*/
|
||||
element.selectorExpression ?: error("Incomplete code:\n${element.getElementTextInContext()}")
|
||||
}
|
||||
else -> element
|
||||
}
|
||||
val psi = getPsiAsFirElementSource(element)
|
||||
mappings[psi]?.let { return it }
|
||||
return psi.getFirOfClosestParent(mappings)?.second
|
||||
?: error("FirElement is not found for:\n${element.getElementTextInContext()}")
|
||||
|
||||
Reference in New Issue
Block a user