Return "FIR resolve: support variable assignments" with full completion
This commit is contained in:
committed by
Mikhail Glukhikh
parent
c6aff9380b
commit
95011b1076
+37
-25
@@ -182,6 +182,35 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
|
||||
}
|
||||
})
|
||||
|
||||
private fun <T : FirQualifiedAccess> transformCallee(qualifiedAccess: T): T {
|
||||
val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess
|
||||
|
||||
val receiver = qualifiedAccess.explicitReceiver?.transformSingle(this, noExpectedType)
|
||||
|
||||
val info = CallInfo(CallKind.VariableAccess, receiver, emptyList(), emptyList()) { it.resultType }
|
||||
val resolver = CallResolver(jump, session)
|
||||
resolver.callInfo = info
|
||||
resolver.scopes = (scopes + localScopes).asReversed()
|
||||
|
||||
val consumer = createVariableAndObjectConsumer(
|
||||
session,
|
||||
callee.name,
|
||||
info, inferenceComponents
|
||||
)
|
||||
val result = resolver.runTowerResolver(consumer)
|
||||
|
||||
val nameReference = createResolvedNamedReference(
|
||||
callee,
|
||||
result.bestCandidates(),
|
||||
result.currentApplicability
|
||||
)
|
||||
|
||||
val resultExpression =
|
||||
qualifiedAccess.transformCalleeReference(StoreNameReference, nameReference) as T
|
||||
if (resultExpression is FirExpression) storeTypeFromCallee(resultExpression)
|
||||
return resultExpression
|
||||
}
|
||||
|
||||
override fun transformQualifiedAccessExpression(
|
||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||
data: Any?
|
||||
@@ -207,32 +236,15 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
|
||||
}
|
||||
}
|
||||
}
|
||||
val callee = qualifiedAccessExpression.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccessExpression.compose()
|
||||
return transformCallee(qualifiedAccessExpression).compose()
|
||||
}
|
||||
|
||||
val receiver = qualifiedAccessExpression.explicitReceiver?.transformSingle(this, null)
|
||||
|
||||
val info = CallInfo(CallKind.VariableAccess, receiver, emptyList(), emptyList()) { it.resultType }
|
||||
val resolver = CallResolver(jump, session)
|
||||
resolver.callInfo = info
|
||||
resolver.scopes = (scopes + localScopes).asReversed()
|
||||
|
||||
val consumer = createVariableAndObjectConsumer(
|
||||
session,
|
||||
callee.name,
|
||||
info, inferenceComponents
|
||||
)
|
||||
val result = resolver.runTowerResolver(consumer)
|
||||
|
||||
val nameReference = createResolvedNamedReference(
|
||||
callee,
|
||||
result.bestCandidates(),
|
||||
result.currentApplicability
|
||||
)
|
||||
|
||||
val resultExpression =
|
||||
qualifiedAccessExpression.transformCalleeReference(StoreNameReference, nameReference)
|
||||
storeTypeFromCallee(resultExpression as FirQualifiedAccessExpression)
|
||||
return resultExpression.compose()
|
||||
override fun transformVariableAssignment(
|
||||
variableAssignment: FirVariableAssignment,
|
||||
data: Any?
|
||||
): CompositeTransformResult<FirStatement> {
|
||||
val variableAssignment = variableAssignment.transformRValue(this, null)
|
||||
return transformCallee(variableAssignment).compose()
|
||||
}
|
||||
|
||||
private fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?): FirFunctionCall {
|
||||
|
||||
@@ -5,7 +5,7 @@ FILE: noPrimaryConstructor.kt
|
||||
|
||||
public constructor(x: R|kotlin/String|): R|NoPrimary| {
|
||||
super<R|kotlin/Any|>()
|
||||
this#.x# = R|<local>/x|
|
||||
this#.R|/NoPrimary.x| = R|<local>/x|
|
||||
}
|
||||
|
||||
public constructor(): R|NoPrimary| {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirReference
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||
|
||||
interface FirAssignment : FirQualifiedAccess {
|
||||
@@ -15,6 +16,8 @@ interface FirAssignment : FirQualifiedAccess {
|
||||
|
||||
val operation: FirOperation
|
||||
|
||||
fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirAssignment
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||
visitor.visitAssignment(this, data)
|
||||
|
||||
|
||||
+6
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.FirReference
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAssignment
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirOperation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||
@@ -29,6 +30,11 @@ abstract class FirAbstractAssignment(
|
||||
calleeReference = value
|
||||
}
|
||||
|
||||
override fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirAssignment {
|
||||
rValue = rValue.transformSingle(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||
rValue = rValue.transformSingle(transformer, data)
|
||||
return super<FirAbstractQualifiedAccess>.transformChildren(transformer, data)
|
||||
|
||||
Reference in New Issue
Block a user