Reformat FirExpressionsResolveTransformer

This commit is contained in:
Kirill Rakhman
2023-01-20 12:40:45 +01:00
committed by Space Team
parent a084bcbbb5
commit 4e9ae3b5e3
@@ -52,7 +52,9 @@ import org.jetbrains.kotlin.types.ConstantValueKind
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveTransformerDispatcher) : FirPartialBodyResolveTransformer(transformer) { open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveTransformerDispatcher) :
FirPartialBodyResolveTransformer(transformer) {
private inline val builtinTypes: BuiltinTypes get() = session.builtinTypes private inline val builtinTypes: BuiltinTypes get() = session.builtinTypes
private val arrayOfCallTransformer = FirArrayOfCallTransformer() private val arrayOfCallTransformer = FirArrayOfCallTransformer()
var enableArrayOfCallTransformation = false var enableArrayOfCallTransformation = false
@@ -376,61 +378,62 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
return checkedSafeCallSubject return checkedSafeCallSubject
} }
override fun transformFunctionCall(functionCall: FirFunctionCall, data: ResolutionMode): FirStatement = whileAnalysing(session, functionCall) { override fun transformFunctionCall(functionCall: FirFunctionCall, data: ResolutionMode): FirStatement =
val calleeReference = functionCall.calleeReference whileAnalysing(session, functionCall) {
if ( val calleeReference = functionCall.calleeReference
(calleeReference is FirResolvedNamedReference || calleeReference is FirErrorNamedReference) && if (
functionCall.resultType is FirImplicitTypeRef (calleeReference is FirResolvedNamedReference || calleeReference is FirErrorNamedReference) &&
) { functionCall.resultType is FirImplicitTypeRef
storeTypeFromCallee(functionCall) ) {
} storeTypeFromCallee(functionCall)
if (calleeReference is FirNamedReferenceWithCandidate) return functionCall
if (calleeReference !is FirSimpleNamedReference) {
// The callee reference can be resolved as an error very early, e.g., `super` as a callee during raw FIR creation.
// We still need to visit/transform other parts, e.g., call arguments, to check if any other errors are there.
if (calleeReference !is FirResolvedNamedReference) {
functionCall.transformChildren(transformer, data)
} }
return functionCall if (calleeReference is FirNamedReferenceWithCandidate) return functionCall
} if (calleeReference !is FirSimpleNamedReference) {
functionCall.transformAnnotations(transformer, data) // The callee reference can be resolved as an error very early, e.g., `super` as a callee during raw FIR creation.
functionCall.replaceLambdaArgumentInvocationKinds(session) // We still need to visit/transform other parts, e.g., call arguments, to check if any other errors are there.
functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent) if (calleeReference !is FirResolvedNamedReference) {
val (completeInference, callCompleted) = functionCall.transformChildren(transformer, data)
run { }
val initialExplicitReceiver = functionCall.explicitReceiver return functionCall
val withTransformedArguments = if (!resolvingAugmentedAssignment) { }
dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments) functionCall.transformAnnotations(transformer, data)
transformExplicitReceiver(functionCall).also { functionCall.replaceLambdaArgumentInvocationKinds(session)
it.replaceArgumentList(it.argumentList.transform(this, ResolutionMode.ContextDependent)) functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent)
dataFlowAnalyzer.exitCallArguments() val (completeInference, callCompleted) =
run {
val initialExplicitReceiver = functionCall.explicitReceiver
val withTransformedArguments = if (!resolvingAugmentedAssignment) {
dataFlowAnalyzer.enterCallArguments(functionCall, functionCall.arguments)
transformExplicitReceiver(functionCall).also {
it.replaceArgumentList(it.argumentList.transform(this, ResolutionMode.ContextDependent))
dataFlowAnalyzer.exitCallArguments()
}
} else {
functionCall
} }
} else { val resultExpression = callResolver.resolveCallAndSelectCandidate(withTransformedArguments)
functionCall val resultExplicitReceiver = resultExpression.explicitReceiver?.unwrapSmartcastExpression()
if (initialExplicitReceiver !== resultExplicitReceiver && resultExplicitReceiver is FirQualifiedAccess) {
// name.invoke() case
callCompleter.completeCall(resultExplicitReceiver, noExpectedType)
}
callCompleter.completeCall(resultExpression, data)
} }
val resultExpression = callResolver.resolveCallAndSelectCandidate(withTransformedArguments) val result = completeInference.transformToIntegerOperatorCallOrApproximateItIfNeeded(data)
val resultExplicitReceiver = resultExpression.explicitReceiver?.unwrapSmartcastExpression() if (!resolvingAugmentedAssignment) {
if (initialExplicitReceiver !== resultExplicitReceiver && resultExplicitReceiver is FirQualifiedAccess) { dataFlowAnalyzer.exitFunctionCall(result, callCompleted)
// name.invoke() case }
callCompleter.completeCall(resultExplicitReceiver, noExpectedType)
addReceiversFromExtensions(result)
if (callCompleted) {
if (enableArrayOfCallTransformation) {
return arrayOfCallTransformer.transformFunctionCall(result, null)
} }
callCompleter.completeCall(resultExpression, data)
} }
val result = completeInference.transformToIntegerOperatorCallOrApproximateItIfNeeded(data) return result
if (!resolvingAugmentedAssignment) {
dataFlowAnalyzer.exitFunctionCall(result, callCompleted)
} }
addReceiversFromExtensions(result)
if (callCompleted) {
if (enableArrayOfCallTransformation) {
return arrayOfCallTransformer.transformFunctionCall(result, null)
}
}
return result
}
@OptIn(PrivateForInline::class) @OptIn(PrivateForInline::class)
private fun addReceiversFromExtensions(functionCall: FirFunctionCall) { private fun addReceiversFromExtensions(functionCall: FirFunctionCall) {
val extensions = expressionResolutionExtensions ?: return val extensions = expressionResolutionExtensions ?: return
@@ -468,7 +471,8 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
ConeNullability.NOT_NULL ConeNullability.NOT_NULL
) )
val approximationIsNeeded = resolutionMode !is ResolutionMode.ReceiverResolution && resolutionMode !is ResolutionMode.ContextDependent val approximationIsNeeded =
resolutionMode !is ResolutionMode.ReceiverResolution && resolutionMode !is ResolutionMode.ContextDependent
val integerOperatorCall = buildIntegerLiteralOperatorCall { val integerOperatorCall = buildIntegerLiteralOperatorCall {
source = originalCall.source source = originalCall.source
@@ -1057,7 +1061,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
expectedTypeRef != null -> { expectedTypeRef != null -> {
require(expressionType is ConeIntegerLiteralConstantTypeImpl) require(expressionType is ConeIntegerLiteralConstantTypeImpl)
val coneType = expectedTypeRef.coneTypeSafe<ConeKotlinType>()?.fullyExpandedType(session) val coneType = expectedTypeRef.coneTypeSafe<ConeKotlinType>()?.fullyExpandedType(session)
val approximatedType= expressionType.getApproximatedType(coneType) val approximatedType = expressionType.getApproximatedType(coneType)
constExpression.replaceKind(approximatedType.toConstKind() as ConstantValueKind<T>) constExpression.replaceKind(approximatedType.toConstKind() as ConstantValueKind<T>)
approximatedType approximatedType
} }
@@ -1203,7 +1207,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
): FirFunctionCall = buildFunctionCall { ): FirFunctionCall = buildFunctionCall {
this.source = source this.source = source
explicitReceiver = receiver explicitReceiver = receiver
argumentList = when(arguments.size) { argumentList = when (arguments.size) {
0 -> FirEmptyArgumentList 0 -> FirEmptyArgumentList
1 -> buildUnaryArgumentList(arguments.first()) 1 -> buildUnaryArgumentList(arguments.first())
else -> buildArgumentList { else -> buildArgumentList {
@@ -1466,16 +1470,17 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
) )
} }
override fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: ResolutionMode): FirStatement = whileAnalysing(session, arrayOfCall) { override fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: ResolutionMode): FirStatement =
if (data is ResolutionMode.ContextDependent) { whileAnalysing(session, arrayOfCall) {
arrayOfCall.transformChildren(transformer, data) if (data is ResolutionMode.ContextDependent) {
arrayOfCall.transformChildren(transformer, data)
return arrayOfCall
}
val syntheticIdCall = components.syntheticCallGenerator.generateSyntheticCallForArrayOfCall(arrayOfCall, resolutionContext)
arrayOfCall.transformChildren(transformer, ResolutionMode.ContextDependent)
callCompleter.completeCall(syntheticIdCall, data.expectedType ?: components.noExpectedType)
return arrayOfCall return arrayOfCall
} }
val syntheticIdCall = components.syntheticCallGenerator.generateSyntheticCallForArrayOfCall(arrayOfCall, resolutionContext)
arrayOfCall.transformChildren(transformer, ResolutionMode.ContextDependent)
callCompleter.completeCall(syntheticIdCall, data.expectedType ?: components.noExpectedType)
return arrayOfCall
}
override fun transformStringConcatenationCall( override fun transformStringConcatenationCall(
stringConcatenationCall: FirStringConcatenationCall, stringConcatenationCall: FirStringConcatenationCall,