FIR: Get rid of the cycle in delegated properties resolution

^KT-32725 In Progress
This commit is contained in:
Denis Zharkov
2019-10-25 16:13:38 +03:00
parent f97f06a99a
commit 4233cf1bd6
2 changed files with 18 additions and 2 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.resolve.withNullability
import org.jetbrains.kotlin.fir.returnExpressions import org.jetbrains.kotlin.fir.returnExpressions
@@ -46,8 +47,19 @@ fun Candidate.resolveArgumentExpression(
isSafeCall, isSafeCall,
typeProvider typeProvider
) )
// TODO:! is FirCallableReferenceAccess ->
is FirCallableReferenceAccess -> preprocessCallableReference(argument, expectedType) if (argument.calleeReference is FirResolvedNamedReference)
resolvePlainExpressionArgument(
csBuilder,
argument,
expectedType,
sink,
isReceiver,
isSafeCall,
typeProvider
)
else
preprocessCallableReference(argument, expectedType)
// NB: FirCallableReferenceAccess should be checked earlier // NB: FirCallableReferenceAccess should be checked earlier
is FirQualifiedAccessExpression -> resolvePlainExpressionArgument( is FirQualifiedAccessExpression -> resolvePlainExpressionArgument(
csBuilder, csBuilder,
@@ -258,6 +258,10 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
data: Any? data: Any?
): CompositeTransformResult<FirStatement> { ): CompositeTransformResult<FirStatement> {
if (callableReferenceAccess.calleeReference is FirResolvedNamedReference) {
return callableReferenceAccess.compose()
}
val transformedLHS = val transformedLHS =
callableReferenceAccess.explicitReceiver?.transformSingle(this, noExpectedType) callableReferenceAccess.explicitReceiver?.transformSingle(this, noExpectedType)