FIR body resolve: support variable assignments
This commit is contained in:
+32
-18
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user