FIR body resolve: support variable assignments

This commit is contained in:
Mikhail Glukhikh
2019-03-28 20:21:41 +03:00
parent c56b471b71
commit 141e8d553e
2 changed files with 33 additions and 19 deletions
@@ -153,6 +153,30 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
}
}
private fun <T : FirQualifiedAccess> transformCallee(qualifiedAccess: T): T {
val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess
qualifiedAccess.explicitReceiver?.visitNoTransform(this, null)
val receiver = qualifiedAccess.explicitReceiver
//val checkers = listOf(VariableApplicabilityChecker(callee.name))
val info = CallInfo(true, receiver, 0)
val resolver = CallResolver(jump, session)
resolver.callInfo = info
resolver.scopes = (scopes + localScopes).asReversed()
val consumer = createVariableConsumer(
session, callee.name, qualifiedAccess.explicitReceiver, qualifiedAccess.explicitReceiver?.resultType
)
val result = resolver.runTowerResolver(consumer)
val successCandidates = result.successCandidates()
val resultExpression = qualifiedAccess.transformCalleeReference(this, successCandidates) as T
if (resultExpression is FirExpression) storeTypeFromCallee(resultExpression)
return resultExpression
}
override fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression,
data: Any?
@@ -178,25 +202,15 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn
}
}
}
val callee = qualifiedAccessExpression.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccessExpression.compose()
return transformCallee(qualifiedAccessExpression).compose()
}
qualifiedAccessExpression.explicitReceiver?.visitNoTransform(this, null)
val receiver = qualifiedAccessExpression.explicitReceiver
//val checkers = listOf(VariableApplicabilityChecker(callee.name))
val info = CallInfo(true, receiver, 0)
val resolver = CallResolver(jump, session)
resolver.callInfo = info
resolver.scopes = (scopes + localScopes).asReversed()
val consumer = createVariableConsumer(session, callee.name, qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.explicitReceiver?.resultType)
val result = resolver.runTowerResolver(consumer)
val successCandidates = result.successCandidates()
val resultExpression = qualifiedAccessExpression.transformCalleeReference(this, successCandidates)
storeTypeFromCallee(resultExpression as FirQualifiedAccessExpression)
return resultExpression.compose()
override fun transformVariableAssignment(
variableAssignment: FirVariableAssignment,
data: Any?
): CompositeTransformResult<FirStatement> {
variableAssignment.rValue.visitNoTransform(this, null)
return transformCallee(variableAssignment).compose()
}
override fun transformFunctionCall(functionCall: FirFunctionCall, data: Any?): CompositeTransformResult<FirStatement> {
@@ -4,7 +4,7 @@ FILE: noPrimaryConstructor.kt
public get(): R|kotlin/String|
public constructor(x: R|kotlin/String|): super<R|kotlin/Any|>() {
this#.x# = R|<local>/x|
this#.R|/NoPrimary.x| = R|<local>/x|
}
public constructor(): this<R|NoPrimary|>(String())