JVM_IR: implement single-abstract-method conversions
This commit is contained in:
+6
@@ -52,6 +52,12 @@ inline fun buildField(b: IrFieldBuilder.() -> Unit) =
|
|||||||
buildField()
|
buildField()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun IrDeclarationContainer.addField(b: IrFieldBuilder.() -> Unit) =
|
||||||
|
buildField(b).also { field ->
|
||||||
|
field.parent = this
|
||||||
|
declarations.add(field)
|
||||||
|
}
|
||||||
|
|
||||||
fun IrPropertyBuilder.buildProperty(): IrProperty {
|
fun IrPropertyBuilder.buildProperty(): IrProperty {
|
||||||
val wrappedDescriptor = WrappedPropertyDescriptor()
|
val wrappedDescriptor = WrappedPropertyDescriptor()
|
||||||
return IrPropertyImpl(
|
return IrPropertyImpl(
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin {
|
|||||||
object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS :
|
object SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS :
|
||||||
IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS", isSynthetic = true)
|
IrDeclarationOriginImpl("SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS", isSynthetic = true)
|
||||||
object GENERATED_PROPERTY_REFERENCE : IrDeclarationOriginImpl("GENERATED_PROPERTY_REFERENCE", isSynthetic = true)
|
object GENERATED_PROPERTY_REFERENCE : IrDeclarationOriginImpl("GENERATED_PROPERTY_REFERENCE", isSynthetic = true)
|
||||||
|
object GENERATED_SAM_IMPLEMENTATION : IrDeclarationOriginImpl("GENERATED_SAM_IMPLEMENTATION", isSynthetic = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
interface JvmLoweredStatementOrigin : IrStatementOrigin {
|
interface JvmLoweredStatementOrigin : IrStatementOrigin {
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ val jvmPhases = namedIrFilePhase(
|
|||||||
makePatchParentsPhase(1) then
|
makePatchParentsPhase(1) then
|
||||||
|
|
||||||
jvmLocalDeclarationsPhase then
|
jvmLocalDeclarationsPhase then
|
||||||
|
singleAbstractMethodPhase then
|
||||||
callableReferencePhase then
|
callableReferencePhase then
|
||||||
functionNVarargInvokePhase then
|
functionNVarargInvokePhase then
|
||||||
|
|
||||||
|
|||||||
+156
@@ -0,0 +1,156 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.backend.jvm.lower
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.*
|
||||||
|
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||||
|
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.irBlock
|
||||||
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||||
|
import org.jetbrains.kotlin.ir.types.toKotlinType
|
||||||
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
|
internal val singleAbstractMethodPhase = makeIrFilePhase(
|
||||||
|
::SingleAbstractMethodLowering,
|
||||||
|
name = "SingleAbstractMethod",
|
||||||
|
description = "Replace SAM conversions with instances of interface-implementing classes"
|
||||||
|
)
|
||||||
|
|
||||||
|
class SingleAbstractMethodLowering(val context: CommonBackendContext) : ClassLoweringPass {
|
||||||
|
override fun lower(irClass: IrClass) {
|
||||||
|
// TODO use `IrType`s; unfortunately, they are currently not comparable.
|
||||||
|
// (Can't use class symbols here, we want type parameters as well.)
|
||||||
|
val implementations = mutableMapOf<Pair<KotlinType, KotlinType>, IrClass>()
|
||||||
|
irClass.transformChildrenVoid(object : IrElementTransformerVoidWithContext() {
|
||||||
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
|
if (expression.symbol.owner.descriptor !is SamConstructorDescriptor)
|
||||||
|
return super.visitCall(expression)
|
||||||
|
// Direct construction of an interface:
|
||||||
|
// Runnable { print("Hello, World!") }
|
||||||
|
return createInstance(expression.type, expression.getValueArgument(0)!!.transform(this, null))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression {
|
||||||
|
if (expression.operator != IrTypeOperator.SAM_CONVERSION)
|
||||||
|
return super.visitTypeOperator(expression)
|
||||||
|
// Implicit conversion to an interface:
|
||||||
|
// val a: (Runnable) -> Unit = { it.run() } // pretend this is a Java method
|
||||||
|
// val b: () -> Unit = { print("Hello, World!") }
|
||||||
|
// a(b)
|
||||||
|
return createInstance(expression.typeOperand, expression.argument.transform(this, null))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace a SAM-conversion of a callable object with an instance of an appropriate implementation.
|
||||||
|
private fun createInstance(superType: IrType, invokable: IrExpression): IrExpression {
|
||||||
|
val implementation = implementations.getOrPut(superType.toKotlinType() to invokable.type.toKotlinType()) {
|
||||||
|
createClass(superType, invokable.type)
|
||||||
|
}
|
||||||
|
// Running in the class context, so empty scope means this is a field/anonymous initializer.
|
||||||
|
val scopeOwnerSymbol = currentScope?.scope?.scopeOwnerSymbol ?: irClass.symbol
|
||||||
|
return context.createIrBuilder(scopeOwnerSymbol).irBlock(invokable, null, superType) {
|
||||||
|
// TODO if invokable is a callable reference, avoid materializing it?
|
||||||
|
if (superType.isNullable() && invokable.type.isNullable()) {
|
||||||
|
val invokableVariable = scope.createTemporaryVariable(invokable)
|
||||||
|
val instance = irCall(implementation.constructors.single()).apply { putValueArgument(0, irGet(invokableVariable)) }
|
||||||
|
+invokableVariable
|
||||||
|
+irIfNull(superType, irGet(invokableVariable), irNull(), instance)
|
||||||
|
} else {
|
||||||
|
+irCall(implementation.constructors.single()).apply { putValueArgument(0, invokable) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct a class that wraps an invokable object into an implementation of an interface:
|
||||||
|
// class sam$n(private val invokable: F) : Interface() { override fun method(...) = invokable(...) }
|
||||||
|
private fun createClass(superType: IrType, invokableType: IrType): IrClass {
|
||||||
|
val invokableClass = invokableType.classifierOrFail.owner as IrClass
|
||||||
|
val invoke = invokableClass.functions.single { it.name == OperatorNameConventions.INVOKE }
|
||||||
|
|
||||||
|
val superClass = superType.classifierOrFail.owner as IrClass
|
||||||
|
val superConstructor = if (superClass.kind != ClassKind.INTERFACE)
|
||||||
|
superClass.constructors.single { it.valueParameters.size == 0 }
|
||||||
|
else
|
||||||
|
context.irBuiltIns.anyClass.owner.constructors.single { it.valueParameters.size == 0 }
|
||||||
|
val superMethod = superClass.functions.single { it.modality == Modality.ABSTRACT }
|
||||||
|
|
||||||
|
val superClassName = superClass.fqNameSafe.pathSegments().joinToString("_") { it.toString() }
|
||||||
|
val subclass = buildClass {
|
||||||
|
// TODO this is not the name some tests (e.g. kt11519) expect
|
||||||
|
name = Name.identifier("sam\$${superClassName}\$${implementations.size}")
|
||||||
|
origin = JvmLoweredDeclarationOrigin.GENERATED_SAM_IMPLEMENTATION
|
||||||
|
}.apply {
|
||||||
|
createImplicitParameterDeclarationWithWrappedDescriptor()
|
||||||
|
parent = irClass
|
||||||
|
// TODO convert all type parameters to upper bounds? See the kt11696 test.
|
||||||
|
superTypes += superType
|
||||||
|
}
|
||||||
|
|
||||||
|
val invokableField = subclass.addField {
|
||||||
|
name = Name.identifier("invokable")
|
||||||
|
type = invokableType
|
||||||
|
origin = subclass.origin
|
||||||
|
visibility = Visibilities.PRIVATE
|
||||||
|
}
|
||||||
|
|
||||||
|
subclass.addConstructor {
|
||||||
|
returnType = subclass.defaultType
|
||||||
|
origin = subclass.origin
|
||||||
|
isPrimary = true
|
||||||
|
}.apply {
|
||||||
|
addValueParameter {
|
||||||
|
name = invokableField.name
|
||||||
|
type = invokableType
|
||||||
|
index = 0
|
||||||
|
origin = subclass.origin
|
||||||
|
}
|
||||||
|
body = context.createIrBuilder(symbol).irBlockBody(startOffset, endOffset) {
|
||||||
|
+irDelegatingConstructorCall(superConstructor)
|
||||||
|
+irSetField(irGet(subclass.thisReceiver!!), invokableField, irGet(valueParameters[0]))
|
||||||
|
+IrInstanceInitializerCallImpl(startOffset, endOffset, superClass.symbol, context.irBuiltIns.unitType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subclass.addFunction {
|
||||||
|
name = superMethod.name
|
||||||
|
returnType = superMethod.returnType
|
||||||
|
visibility = superMethod.visibility
|
||||||
|
origin = subclass.origin
|
||||||
|
}.apply {
|
||||||
|
overriddenSymbols.add(superMethod.symbol)
|
||||||
|
dispatchReceiverParameter = subclass.thisReceiver!!.copyTo(this)
|
||||||
|
superMethod.valueParameters.mapTo(valueParameters) { it.copyTo(this) }
|
||||||
|
body = context.createIrBuilder(symbol).irBlockBody(startOffset, endOffset) {
|
||||||
|
+irReturn(irCall(invoke.symbol).apply {
|
||||||
|
dispatchReceiver = irGetField(irGet(subclass.thisReceiver!!), invokableField)
|
||||||
|
valueParameters.forEachIndexed { i, parameter -> putValueArgument(i, irGet(parameter)) }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return subclass
|
||||||
|
}
|
||||||
|
})
|
||||||
|
irClass.declarations.addAll(implementations.values)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -379,7 +379,7 @@ private fun StatementGenerator.pregenerateValueArguments(call: CallBuilder, reso
|
|||||||
generateSamConversionForValueArgumentsIfRequired(call, resolvedCall.resultingDescriptor)
|
generateSamConversionForValueArgumentsIfRequired(call, resolvedCall.resultingDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, originalDescriptor: CallableDescriptor) {
|
fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, originalDescriptor: CallableDescriptor) {
|
||||||
val underlyingDescriptor = context.extensions.samConversion.getOriginalForSamAdapter(originalDescriptor) ?: return
|
val underlyingDescriptor = context.extensions.samConversion.getOriginalForSamAdapter(originalDescriptor) ?: return
|
||||||
|
|
||||||
val originalValueParameters = originalDescriptor.valueParameters
|
val originalValueParameters = originalDescriptor.valueParameters
|
||||||
|
|||||||
+1
@@ -72,6 +72,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
|
|||||||
val opCall = statementGenerator.pregenerateCallReceivers(opResolvedCall)
|
val opCall = statementGenerator.pregenerateCallReceivers(opResolvedCall)
|
||||||
opCall.setExplicitReceiverValue(irLValue)
|
opCall.setExplicitReceiverValue(irLValue)
|
||||||
opCall.irValueArgumentsByIndex[0] = ktRight.genExpr()
|
opCall.irValueArgumentsByIndex[0] = ktRight.genExpr()
|
||||||
|
statementGenerator.generateSamConversionForValueArgumentsIfRequired(opCall, opResolvedCall.resultingDescriptor)
|
||||||
val irOpCall = CallGenerator(statementGenerator).generateCall(ktExpression, opCall, origin)
|
val irOpCall = CallGenerator(statementGenerator).generateCall(ktExpression, opCall, origin)
|
||||||
|
|
||||||
if (isSimpleAssignment) {
|
if (isSimpleAssignment) {
|
||||||
|
|||||||
+10
-11
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.inlineStatement
|
|||||||
import org.jetbrains.kotlin.ir.expressions.isAssignmentOperatorWithResult
|
import org.jetbrains.kotlin.ir.expressions.isAssignmentOperatorWithResult
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
|
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
|
||||||
|
import org.jetbrains.kotlin.psi2ir.generators.generateSamConversionForValueArgumentsIfRequired
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.pregenerateValueArgumentsUsing
|
import org.jetbrains.kotlin.psi2ir.generators.pregenerateValueArgumentsUsing
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
||||||
@@ -98,8 +99,8 @@ class ArrayAccessAssignmentReceiver(
|
|||||||
return LValueWithGetterAndSetterCalls(
|
return LValueWithGetterAndSetterCalls(
|
||||||
callGenerator,
|
callGenerator,
|
||||||
descriptor,
|
descriptor,
|
||||||
{ indexedGetCall()?.fillArrayAndIndexArguments(irArrayValue, indexedGetResolvedCall!!, ktExpressionToIrIndexValue) },
|
{ indexedGetCall()?.fillArguments(irArrayValue, indexedGetResolvedCall!!, ktExpressionToIrIndexValue, null) },
|
||||||
{ indexedSetCall()?.fillArrayAndIndexArguments(irArrayValue, indexedSetResolvedCall!!, ktExpressionToIrIndexValue) },
|
{ indexedSetCall()?.fillArguments(irArrayValue, indexedSetResolvedCall!!, ktExpressionToIrIndexValue, it) },
|
||||||
callGenerator.translateType(kotlinType),
|
callGenerator.translateType(kotlinType),
|
||||||
startOffset, endOffset, origin
|
startOffset, endOffset, origin
|
||||||
)
|
)
|
||||||
@@ -107,24 +108,22 @@ class ArrayAccessAssignmentReceiver(
|
|||||||
|
|
||||||
override fun assign(value: IrExpression): IrExpression {
|
override fun assign(value: IrExpression): IrExpression {
|
||||||
val call = indexedSetCall() ?: throw AssertionError("Array access without indexed-get call")
|
val call = indexedSetCall() ?: throw AssertionError("Array access without indexed-get call")
|
||||||
val ktExpressionToIrIndexExpression = ktIndexExpressions.zip(irIndexExpressions).toMap()
|
val ktExpressionToIrIndexExpression = ktIndexExpressions.zip(irIndexExpressions.map { OnceExpressionValue(it) }).toMap()
|
||||||
call.setExplicitReceiverValue(OnceExpressionValue(irArray))
|
call.fillArguments(OnceExpressionValue(irArray), indexedSetResolvedCall!!, ktExpressionToIrIndexExpression, value)
|
||||||
callGenerator.statementGenerator.pregenerateValueArgumentsUsing(call, indexedSetResolvedCall!!) {
|
|
||||||
ktExpressionToIrIndexExpression[it]
|
|
||||||
}
|
|
||||||
call.lastArgument = value
|
|
||||||
return callGenerator.generateCall(startOffset, endOffset, call, IrStatementOrigin.EQ)
|
return callGenerator.generateCall(startOffset, endOffset, call, IrStatementOrigin.EQ)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun CallBuilder.fillArrayAndIndexArguments(
|
private fun CallBuilder.fillArguments(
|
||||||
arrayValue: IntermediateValue,
|
arrayValue: IntermediateValue,
|
||||||
resolvedCall: ResolvedCall<FunctionDescriptor>,
|
resolvedCall: ResolvedCall<FunctionDescriptor>,
|
||||||
ktExpressionToIrIndexValue: Map<KtExpression, IntermediateValue>
|
ktExpressionToIrIndexValue: Map<KtExpression, IntermediateValue>,
|
||||||
|
value: IrExpression?
|
||||||
) = apply {
|
) = apply {
|
||||||
setExplicitReceiverValue(arrayValue)
|
setExplicitReceiverValue(arrayValue)
|
||||||
|
|
||||||
callGenerator.statementGenerator.pregenerateValueArgumentsUsing(this, resolvedCall) { ktExpression ->
|
callGenerator.statementGenerator.pregenerateValueArgumentsUsing(this, resolvedCall) { ktExpression ->
|
||||||
ktExpressionToIrIndexValue[ktExpression]?.load()
|
ktExpressionToIrIndexValue[ktExpression]?.load()
|
||||||
}
|
}
|
||||||
|
value?.let { lastArgument = it }
|
||||||
|
callGenerator.statementGenerator.generateSamConversionForValueArgumentsIfRequired(this, resolvedCall.resultingDescriptor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -26,7 +26,7 @@ class LValueWithGetterAndSetterCalls(
|
|||||||
val callGenerator: CallGenerator,
|
val callGenerator: CallGenerator,
|
||||||
val descriptor: CallableDescriptor,
|
val descriptor: CallableDescriptor,
|
||||||
val getterCall: () -> CallBuilder?,
|
val getterCall: () -> CallBuilder?,
|
||||||
val setterCall: () -> CallBuilder?,
|
val setterCall: (IrExpression) -> CallBuilder?,
|
||||||
override val type: IrType,
|
override val type: IrType,
|
||||||
val startOffset: Int,
|
val startOffset: Int,
|
||||||
val endOffset: Int,
|
val endOffset: Int,
|
||||||
@@ -39,8 +39,7 @@ class LValueWithGetterAndSetterCalls(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun store(irExpression: IrExpression): IrExpression {
|
override fun store(irExpression: IrExpression): IrExpression {
|
||||||
val call = setterCall() ?: throw AssertionError("No setter call for $descriptor")
|
val call = setterCall(irExpression) ?: throw AssertionError("No setter call for $descriptor")
|
||||||
call.irValueArgumentsByIndex[call.argumentsCount - 1] = irExpression
|
|
||||||
return callGenerator.generateCall(startOffset, endOffset, call, origin)
|
return callGenerator.generateCall(startOffset, endOffset, call, origin)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// KJS_WITH_FULL_RUNTIME
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// FILE: F.java
|
// FILE: F.java
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// JVM_TARGET: 1.8
|
// JVM_TARGET: 1.8
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// FILE: JavaCall.java
|
// FILE: JavaCall.java
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// KJS_WITH_FULL_RUNTIME
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
import java.io.*
|
import java.io.*
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// KJS_WITH_FULL_RUNTIME
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
import java.io.*
|
import java.io.*
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
var result = "FAIL"
|
var result = "FAIL"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
var result = "FAIL"
|
var result = "FAIL"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
class Box(val s: String) {
|
class Box(val s: String) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND: JS_IR
|
// IGNORE_BACKEND: JS_IR
|
||||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||||
// IGNORE_BACKEND: JS, NATIVE
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: MFunction.java
|
// FILE: MFunction.java
|
||||||
|
|
||||||
public interface MFunction<T, R> {
|
public interface MFunction<T, R> {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
// KT-5912
|
// KT-5912
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaInterface.java
|
// FILE: JavaInterface.java
|
||||||
|
|
||||||
interface JavaInterface {
|
interface JavaInterface {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: GenericInterface.java
|
// FILE: GenericInterface.java
|
||||||
|
|
||||||
interface GenericInterface<T> {
|
interface GenericInterface<T> {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FILE: Super.java
|
// FILE: Super.java
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: Sub.java
|
// FILE: Sub.java
|
||||||
|
|
||||||
class Super {
|
class Super {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: Java.java
|
// FILE: Java.java
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass<T> {
|
class JavaClass<T> {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: test.kt
|
// FILE: test.kt
|
||||||
class Test : Base {
|
class Test : Base {
|
||||||
constructor(f: () -> String) : super(f)
|
constructor(f: () -> String) : super(f)
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
class JavaClass {
|
class JavaClass {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: WeirdComparator.java
|
// FILE: WeirdComparator.java
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: WeirdComparator.java
|
// FILE: WeirdComparator.java
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: WeirdComparator.java
|
// FILE: WeirdComparator.java
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FILE: Custom.java
|
// FILE: Custom.java
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: Base.java
|
// FILE: Base.java
|
||||||
|
|
||||||
interface Base<T> {
|
interface Base<T> {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: ParamBase.java
|
// FILE: ParamBase.java
|
||||||
|
|
||||||
class ParamBase<T> {}
|
class ParamBase<T> {}
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// FILE: JavaClass.java
|
// FILE: JavaClass.java
|
||||||
|
|
||||||
|
|||||||
Vendored
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: test/Foo.java
|
// FILE: test/Foo.java
|
||||||
|
|
||||||
package test;
|
package test;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// FILE: 1.kt
|
// FILE: 1.kt
|
||||||
// FULL_JDK
|
// FULL_JDK
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// SKIP_JDK6
|
// SKIP_JDK6
|
||||||
// FILE: A.kt
|
// FILE: A.kt
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|||||||
Reference in New Issue
Block a user