FIR: fix atomic qualified acess sharing the same PSI with callee ref
Consider an atomic reference `i`, it's FIR representation is - FirQualifiedAccessExpression - calleeReference : FirNamedReference Currently, both of the above FIR elements uses the same PSI element as the source. Such problems are not present with `this` or `super` because we manually mark them as `ExplicitThisOrSuperReference`. This change generalizes the previous `ExplicitThisOrSuperReference` as `ReferenceInAtomicQualifiedAccess` and fixes it for more cases.
This commit is contained in:
committed by
Ivan Kochurkin
parent
3bc0eaff59
commit
45d31fdba2
+1
@@ -41,6 +41,7 @@ internal class KtToFirMapping(firElement: FirElement, recorder: FirElementsRecor
|
||||
|
||||
private val userTypeMapping = ConcurrentHashMap<KtUserType, FirElement>()
|
||||
fun getElement(ktElement: KtElement, state: FirModuleResolveState): FirElement? {
|
||||
|
||||
mapping[ktElement]?.let { return it }
|
||||
|
||||
val userType = when (ktElement) {
|
||||
|
||||
+9
-4
@@ -6,8 +6,10 @@
|
||||
package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.fir.FirRealPsiSourceElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||
import org.jetbrains.kotlin.fir.realPsi
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.references.*
|
||||
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
@@ -90,9 +92,12 @@ internal open class FirElementsRecorder : FirVisitor<Unit, MutableMap<KtElement,
|
||||
}
|
||||
|
||||
private fun cacheElement(element: FirElement, cache: MutableMap<KtElement, FirElement>) {
|
||||
(element.realPsi as? KtElement)?.let { psi ->
|
||||
cache(psi, element, cache)
|
||||
}
|
||||
val psi = element.source
|
||||
?.takeIf {
|
||||
it.kind == FirFakeSourceElementKind.ReferenceInAtomicQualifiedAccess || it is FirRealPsiSourceElement
|
||||
}.psi as? KtElement
|
||||
?: return
|
||||
cache(psi, element, cache)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
Reference in New Issue
Block a user