Return "FIR resolve: support variable assignments" with full completion

This commit is contained in:
Simon Ogorodnik
2019-04-11 14:34:18 +03:00
committed by Mikhail Glukhikh
parent c6aff9380b
commit 95011b1076
4 changed files with 47 additions and 26 deletions
@@ -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)
@@ -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)