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(
|
override fun transformQualifiedAccessExpression(
|
||||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||||
data: Any?
|
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)
|
override fun transformVariableAssignment(
|
||||||
|
variableAssignment: FirVariableAssignment,
|
||||||
val receiver = qualifiedAccessExpression.explicitReceiver
|
data: Any?
|
||||||
|
): CompositeTransformResult<FirStatement> {
|
||||||
//val checkers = listOf(VariableApplicabilityChecker(callee.name))
|
variableAssignment.rValue.visitNoTransform(this, null)
|
||||||
|
return transformCallee(variableAssignment).compose()
|
||||||
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 transformFunctionCall(functionCall: FirFunctionCall, data: Any?): CompositeTransformResult<FirStatement> {
|
override fun transformFunctionCall(functionCall: FirFunctionCall, data: Any?): CompositeTransformResult<FirStatement> {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ FILE: noPrimaryConstructor.kt
|
|||||||
public get(): R|kotlin/String|
|
public get(): R|kotlin/String|
|
||||||
|
|
||||||
public constructor(x: R|kotlin/String|): super<R|kotlin/Any|>() {
|
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())
|
public constructor(): this<R|NoPrimary|>(String())
|
||||||
|
|||||||
Reference in New Issue
Block a user