package org.jetbrains.kotlin.codegen.range.inExpression interface ExpressionCodegen interface KtSimpleNameExpression interface InExpressionGenerator interface StackValue open class BranchedValue interface Type interface KotlinType interface Label interface InstructionAdapter class CallBasedInExpressionGenerator( val codegen: ExpressionCodegen, operatorReference: KtSimpleNameExpression ) : InExpressionGenerator { private val resolvedCall = operatorReference.getResolvedCallWithAssert(codegen.bindingContext) private val isInverted = operatorReference.getReferencedNameElementType() == KtTokens.NOT_IN override fun generate(argument: StackValue): BranchedValue = gen(argument).let { if (isInverted) Invert(it) else it } private fun gen(argument: StackValue): BranchedValue = object : BranchedValue(argument, null, argument.type, Opcodes.IFEQ) { override fun putSelector(type: Type, kotlinType: KotlinType?, v: InstructionAdapter) { invokeFunction(v) coerceTo(type, kotlinType, v) } override fun condJump(jumpLabel: Label, v: InstructionAdapter, jumpIfFalse: Boolean) { invokeFunction(v) v.visitJumpInsn(if (jumpIfFalse) Opcodes.IFEQ else Opcodes.IFNE, jumpLabel) } private fun invokeFunction(v: InstructionAdapter) { val result = codegen.invokeFunction(resolvedCall.call, resolvedCall, none()) result.put(result.type, result.kotlinType, v) } } }