FIR CFG: move the argument reordering hack to the expression transformer
This commit is contained in:
@@ -77,7 +77,7 @@ class FirCallResolver(
|
|||||||
val functionCall = if (needTransformArguments) {
|
val functionCall = if (needTransformArguments) {
|
||||||
functionCall.transformExplicitReceiver().also {
|
functionCall.transformExplicitReceiver().also {
|
||||||
components.dataFlowAnalyzer.enterQualifiedAccessExpression()
|
components.dataFlowAnalyzer.enterQualifiedAccessExpression()
|
||||||
functionCall.argumentList.transformArguments(transformer, ResolutionMode.ContextDependent)
|
functionCall.replaceArgumentList(functionCall.argumentList.transform(transformer, ResolutionMode.ContextDependent))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
functionCall
|
functionCall
|
||||||
@@ -539,7 +539,7 @@ class FirCallResolver(
|
|||||||
|
|
||||||
fun resolveAnnotationCall(annotation: FirAnnotationCall): FirAnnotationCall? {
|
fun resolveAnnotationCall(annotation: FirAnnotationCall): FirAnnotationCall? {
|
||||||
val reference = annotation.calleeReference as? FirSimpleNamedReference ?: return null
|
val reference = annotation.calleeReference as? FirSimpleNamedReference ?: return null
|
||||||
annotation.argumentList.transformArguments(transformer, ResolutionMode.ContextDependent)
|
annotation.replaceArgumentList(annotation.argumentList.transform(transformer, ResolutionMode.ContextDependent))
|
||||||
|
|
||||||
val callInfo = CallInfo(
|
val callInfo = CallInfo(
|
||||||
annotation,
|
annotation,
|
||||||
|
|||||||
+33
-4
@@ -662,8 +662,9 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
// In FE1.0, it's only used for the right
|
// In FE1.0, it's only used for the right
|
||||||
// But it seems a bit inconsistent (see KT-47409)
|
// But it seems a bit inconsistent (see KT-47409)
|
||||||
// Also it's kind of complicated to transform different arguments with different expectType considering current FIR structure
|
// Also it's kind of complicated to transform different arguments with different expectType considering current FIR structure
|
||||||
equalityOperatorCall.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
|
equalityOperatorCall
|
||||||
equalityOperatorCall.argumentList.transformArguments(transformer, withExpectedType(builtinTypes.nullableAnyType))
|
.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
|
||||||
|
.replaceArgumentList(equalityOperatorCall.argumentList.transform(transformer, withExpectedType(builtinTypes.nullableAnyType)))
|
||||||
equalityOperatorCall.resultType = equalityOperatorCall.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type)
|
equalityOperatorCall.resultType = equalityOperatorCall.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type)
|
||||||
|
|
||||||
dataFlowAnalyzer.exitEqualityOperatorCall(equalityOperatorCall)
|
dataFlowAnalyzer.exitEqualityOperatorCall(equalityOperatorCall)
|
||||||
@@ -799,8 +800,9 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
}
|
}
|
||||||
|
|
||||||
dataFlowAnalyzer.enterCheckNotNullCall()
|
dataFlowAnalyzer.enterCheckNotNullCall()
|
||||||
checkNotNullCall.argumentList.transformArguments(transformer, ResolutionMode.ContextDependent)
|
checkNotNullCall
|
||||||
checkNotNullCall.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
|
.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
|
||||||
|
.replaceArgumentList(checkNotNullCall.argumentList.transform(transformer, ResolutionMode.ContextDependent))
|
||||||
|
|
||||||
var callCompleted = false
|
var callCompleted = false
|
||||||
val result = components.syntheticCallGenerator.generateCalleeForCheckNotNullCall(checkNotNullCall, resolutionContext)?.let {
|
val result = components.syntheticCallGenerator.generateCalleeForCheckNotNullCall(checkNotNullCall, resolutionContext)?.let {
|
||||||
@@ -1486,6 +1488,33 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
|
|||||||
return anonymousObjectExpression
|
return anonymousObjectExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val nonLambdaArgumentTransformer = object : FirTransformer<ResolutionMode>() {
|
||||||
|
override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E =
|
||||||
|
element.transform(this@FirExpressionsResolveTransformer, data)
|
||||||
|
|
||||||
|
override fun transformAnonymousFunctionExpression(
|
||||||
|
anonymousFunctionExpression: FirAnonymousFunctionExpression,
|
||||||
|
data: ResolutionMode
|
||||||
|
): FirStatement = anonymousFunctionExpression
|
||||||
|
}
|
||||||
|
|
||||||
|
private val lambdaArgumentTransformer = object : FirTransformer<ResolutionMode>() {
|
||||||
|
override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E =
|
||||||
|
element
|
||||||
|
|
||||||
|
override fun transformAnonymousFunctionExpression(
|
||||||
|
anonymousFunctionExpression: FirAnonymousFunctionExpression,
|
||||||
|
data: ResolutionMode
|
||||||
|
): FirStatement = this@FirExpressionsResolveTransformer.transformAnonymousFunctionExpression(anonymousFunctionExpression, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transformArgumentList(argumentList: FirArgumentList, data: ResolutionMode): FirArgumentList {
|
||||||
|
// Transform all normal arguments first and then lambda to make CFG correct. See KT-46825
|
||||||
|
return argumentList
|
||||||
|
.transformArguments(nonLambdaArgumentTransformer, data)
|
||||||
|
.transformArguments(lambdaArgumentTransformer, data)
|
||||||
|
}
|
||||||
|
|
||||||
override fun transformAnonymousFunctionExpression(
|
override fun transformAnonymousFunctionExpression(
|
||||||
anonymousFunctionExpression: FirAnonymousFunctionExpression,
|
anonymousFunctionExpression: FirAnonymousFunctionExpression,
|
||||||
data: ResolutionMode
|
data: ResolutionMode
|
||||||
|
|||||||
+2
-16
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.transformInplace
|
||||||
|
|
||||||
internal class FirArgumentListImpl(
|
internal class FirArgumentListImpl(
|
||||||
override val source: KtSourceElement?,
|
override val source: KtSourceElement?,
|
||||||
@@ -27,22 +28,7 @@ internal class FirArgumentListImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentListImpl {
|
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentListImpl {
|
||||||
// Transform all normal arguments first and then lambda to make CFG correct. See KT-46825
|
arguments.transformInplace(transformer, data)
|
||||||
val postponedFunctionArgs = mutableListOf<Pair<Int, FirAnonymousFunctionExpression>>()
|
|
||||||
val iterator = arguments.listIterator()
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
val index = iterator.nextIndex()
|
|
||||||
val next = iterator.next() as FirPureAbstractElement
|
|
||||||
if (next is FirAnonymousFunctionExpression) {
|
|
||||||
postponedFunctionArgs += (index to next)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
val result = next.transform<FirExpression, D>(transformer, data)
|
|
||||||
iterator.set(result)
|
|
||||||
}
|
|
||||||
for ((index, lambda) in postponedFunctionArgs) {
|
|
||||||
arguments[index] = lambda.transform(transformer, data)
|
|
||||||
}
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user