psi2ir: support dynamic infix calls ('foo bar 42' is 'foo.bar(42)')
This commit is contained in:
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
internal fun ResolvedCall<*>.isImplicitInvoke(): Boolean {
|
||||
if (resultingDescriptor.name != OperatorNameConventions.INVOKE) return false
|
||||
val callExpression = call.callElement as? KtCallExpression ?: return true
|
||||
val callExpression = call.callElement as? KtCallExpression ?: return false
|
||||
val calleeExpression = callExpression.calleeExpression as? KtSimpleNameExpression ?: return true
|
||||
return calleeExpression.getReferencedName() != OperatorNameConventions.INVOKE.asString()
|
||||
}
|
||||
|
||||
+9
-6
@@ -177,14 +177,17 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
||||
|
||||
val kotlinType = context.bindingContext.getType(ktExpression) ?: throw AssertionError("No type for ${ktExpression.text}")
|
||||
|
||||
val startOffset = ktExpression.startOffsetSkippingComments
|
||||
val endOffset = ktExpression.endOffset
|
||||
val irType = kotlinType.toIrType()
|
||||
|
||||
if (ktExpression.operationToken == KtTokens.IDENTIFIER) {
|
||||
return generateCall(getResolvedCall(ktExpression)!!, ktExpression, null)
|
||||
}
|
||||
|
||||
val operator = ktExpression.getDynamicOperator()
|
||||
|
||||
return IrDynamicOperatorExpressionImpl(
|
||||
ktExpression.startOffsetSkippingComments,
|
||||
ktExpression.endOffset,
|
||||
kotlinType.toIrType(),
|
||||
operator
|
||||
).apply {
|
||||
return IrDynamicOperatorExpressionImpl(startOffset, endOffset, irType, operator).apply {
|
||||
left = ktLeft.genExpr()
|
||||
right = ktRight.genExpr()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user