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(
|
override fun transformQualifiedAccessExpression(
|
||||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||||
data: Any?
|
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)
|
override fun transformVariableAssignment(
|
||||||
|
variableAssignment: FirVariableAssignment,
|
||||||
val info = CallInfo(CallKind.VariableAccess, receiver, emptyList(), emptyList()) { it.resultType }
|
data: Any?
|
||||||
val resolver = CallResolver(jump, session)
|
): CompositeTransformResult<FirStatement> {
|
||||||
resolver.callInfo = info
|
val variableAssignment = variableAssignment.transformRValue(this, null)
|
||||||
resolver.scopes = (scopes + localScopes).asReversed()
|
return transformCallee(variableAssignment).compose()
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?): FirFunctionCall {
|
private fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, expectedTypeRef: FirTypeRef?): FirFunctionCall {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ FILE: noPrimaryConstructor.kt
|
|||||||
|
|
||||||
public constructor(x: R|kotlin/String|): R|NoPrimary| {
|
public constructor(x: R|kotlin/String|): R|NoPrimary| {
|
||||||
super<R|kotlin/Any|>()
|
super<R|kotlin/Any|>()
|
||||||
this#.x# = R|<local>/x|
|
this#.R|/NoPrimary.x| = R|<local>/x|
|
||||||
}
|
}
|
||||||
|
|
||||||
public constructor(): R|NoPrimary| {
|
public constructor(): R|NoPrimary| {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.expressions
|
package org.jetbrains.kotlin.fir.expressions
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirReference
|
import org.jetbrains.kotlin.fir.FirReference
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
|
|
||||||
interface FirAssignment : FirQualifiedAccess {
|
interface FirAssignment : FirQualifiedAccess {
|
||||||
@@ -15,6 +16,8 @@ interface FirAssignment : FirQualifiedAccess {
|
|||||||
|
|
||||||
val operation: FirOperation
|
val operation: FirOperation
|
||||||
|
|
||||||
|
fun <D> transformRValue(transformer: FirTransformer<D>, data: D): FirAssignment
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||||
visitor.visitAssignment(this, data)
|
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.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirReference
|
import org.jetbrains.kotlin.fir.FirReference
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirOperation
|
import org.jetbrains.kotlin.fir.expressions.FirOperation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
||||||
@@ -29,6 +30,11 @@ abstract class FirAbstractAssignment(
|
|||||||
calleeReference = value
|
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 {
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||||
rValue = rValue.transformSingle(transformer, data)
|
rValue = rValue.transformSingle(transformer, data)
|
||||||
return super<FirAbstractQualifiedAccess>.transformChildren(transformer, data)
|
return super<FirAbstractQualifiedAccess>.transformChildren(transformer, data)
|
||||||
|
|||||||
Reference in New Issue
Block a user