[FIR2IR] Fix translating primitive array types
This commit fixes two issues in the existing implementation of translating primitive array types: * IrType.getArrayElementType throws an exception when the receiver is a primitive array type, because IR expects primitive array types use symbols defined in IrBuiltIns, but fir2ir translation doesn't; * IteratorNext.toCallable assumes all element types are boxed. The first issue is fixed by changing the fir2ir type translation to use symbols in IrBuiltIns for primitive array types, and the second by not unboxing primitive types.
This commit is contained in:
committed by
Mikhail Glukhikh
parent
1cf582e9ed
commit
3dc58bc995
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.types.IrErrorType
|
import org.jetbrains.kotlin.ir.types.IrErrorType
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
@@ -25,6 +26,8 @@ import org.jetbrains.kotlin.ir.types.impl.IrErrorTypeImpl
|
|||||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
||||||
import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl
|
import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl
|
||||||
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
|
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
@@ -40,56 +43,82 @@ internal fun <T : IrElement> FirElement.convertWithOffsets(
|
|||||||
|
|
||||||
internal fun createErrorType(): IrErrorType = IrErrorTypeImpl(null, emptyList(), Variance.INVARIANT)
|
internal fun createErrorType(): IrErrorType = IrErrorTypeImpl(null, emptyList(), Variance.INVARIANT)
|
||||||
|
|
||||||
fun FirTypeRef.toIrType(session: FirSession, declarationStorage: Fir2IrDeclarationStorage): IrType {
|
fun FirTypeRef.toIrType(session: FirSession, declarationStorage: Fir2IrDeclarationStorage, irBuiltIns: IrBuiltIns): IrType {
|
||||||
if (this !is FirResolvedTypeRef) {
|
if (this !is FirResolvedTypeRef) {
|
||||||
return createErrorType()
|
return createErrorType()
|
||||||
}
|
}
|
||||||
return type.toIrType(session, declarationStorage)
|
return type.toIrType(session, declarationStorage, irBuiltIns)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ConeKotlinType.toIrType(session: FirSession, declarationStorage: Fir2IrDeclarationStorage, definitelyNotNull: Boolean = false): IrType {
|
fun ConeKotlinType.toIrType(
|
||||||
|
session: FirSession,
|
||||||
|
declarationStorage: Fir2IrDeclarationStorage,
|
||||||
|
irBuiltIns: IrBuiltIns,
|
||||||
|
definitelyNotNull: Boolean = false
|
||||||
|
): IrType {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is ConeKotlinErrorType -> createErrorType()
|
is ConeKotlinErrorType -> createErrorType()
|
||||||
is ConeLookupTagBasedType -> {
|
is ConeLookupTagBasedType -> {
|
||||||
val firSymbol = this.lookupTag.toSymbol(session) ?: return createErrorType()
|
val irSymbol = getPrimitiveArrayType(this.classId, irBuiltIns) ?: run {
|
||||||
val irSymbol = firSymbol.toIrSymbol(session, declarationStorage)
|
val firSymbol = this.lookupTag.toSymbol(session) ?: return createErrorType()
|
||||||
|
firSymbol.toIrSymbol(session, declarationStorage)
|
||||||
|
}
|
||||||
// TODO: annotations
|
// TODO: annotations
|
||||||
IrSimpleTypeImpl(
|
IrSimpleTypeImpl(
|
||||||
irSymbol, !definitelyNotNull && this.isMarkedNullable,
|
irSymbol, !definitelyNotNull && this.isMarkedNullable,
|
||||||
typeArguments.map { it.toIrTypeArgument(session, declarationStorage) },
|
typeArguments.map { it.toIrTypeArgument(session, declarationStorage, irBuiltIns) },
|
||||||
emptyList()
|
emptyList()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is ConeFlexibleType -> {
|
is ConeFlexibleType -> {
|
||||||
// TODO: yet we take more general type. Not quite sure it's Ok
|
// TODO: yet we take more general type. Not quite sure it's Ok
|
||||||
upperBound.toIrType(session, declarationStorage, definitelyNotNull)
|
upperBound.toIrType(session, declarationStorage, irBuiltIns, definitelyNotNull)
|
||||||
}
|
}
|
||||||
is ConeCapturedType -> TODO()
|
is ConeCapturedType -> TODO()
|
||||||
is ConeDefinitelyNotNullType -> {
|
is ConeDefinitelyNotNullType -> {
|
||||||
original.toIrType(session, declarationStorage, definitelyNotNull = true)
|
original.toIrType(session, declarationStorage, irBuiltIns, definitelyNotNull = true)
|
||||||
}
|
}
|
||||||
is ConeIntersectionType -> {
|
is ConeIntersectionType -> {
|
||||||
// TODO: add intersectionTypeApproximation
|
// TODO: add intersectionTypeApproximation
|
||||||
intersectedTypes.first().toIrType(session, declarationStorage, definitelyNotNull)
|
intersectedTypes.first().toIrType(session, declarationStorage, irBuiltIns, definitelyNotNull)
|
||||||
}
|
}
|
||||||
is ConeStubType -> createErrorType()
|
is ConeStubType -> createErrorType()
|
||||||
is ConeIntegerLiteralType -> getApproximatedType().toIrType(session, declarationStorage, definitelyNotNull)
|
is ConeIntegerLiteralType -> getApproximatedType().toIrType(session, declarationStorage, irBuiltIns, definitelyNotNull)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ConeKotlinTypeProjection.toIrTypeArgument(session: FirSession, declarationStorage: Fir2IrDeclarationStorage): IrTypeArgument {
|
private fun getPrimitiveArrayType(classId: ClassId?, irBuiltIns: IrBuiltIns): IrClassifierSymbol? {
|
||||||
|
val irType = when (classId) {
|
||||||
|
ClassId(FqName("kotlin"), FqName("BooleanArray"), false) -> irBuiltIns.booleanType
|
||||||
|
ClassId(FqName("kotlin"), FqName("ByteArray"), false) -> irBuiltIns.byteType
|
||||||
|
ClassId(FqName("kotlin"), FqName("CharArray"), false) -> irBuiltIns.charType
|
||||||
|
ClassId(FqName("kotlin"), FqName("DoubleArray"), false) -> irBuiltIns.doubleType
|
||||||
|
ClassId(FqName("kotlin"), FqName("FloatArray"), false) -> irBuiltIns.floatType
|
||||||
|
ClassId(FqName("kotlin"), FqName("IntArray"), false) -> irBuiltIns.intType
|
||||||
|
ClassId(FqName("kotlin"), FqName("LongArray"), false) -> irBuiltIns.longType
|
||||||
|
ClassId(FqName("kotlin"), FqName("ShortArray"), false) -> irBuiltIns.shortType
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
return irType?.let { irBuiltIns.primitiveArrayForType.getValue(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ConeKotlinTypeProjection.toIrTypeArgument(
|
||||||
|
session: FirSession,
|
||||||
|
declarationStorage: Fir2IrDeclarationStorage,
|
||||||
|
irBuiltIns: IrBuiltIns
|
||||||
|
): IrTypeArgument {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
ConeStarProjection -> IrStarProjectionImpl
|
ConeStarProjection -> IrStarProjectionImpl
|
||||||
is ConeKotlinTypeProjectionIn -> {
|
is ConeKotlinTypeProjectionIn -> {
|
||||||
val irType = this.type.toIrType(session, declarationStorage)
|
val irType = this.type.toIrType(session, declarationStorage, irBuiltIns)
|
||||||
makeTypeProjection(irType, Variance.IN_VARIANCE)
|
makeTypeProjection(irType, Variance.IN_VARIANCE)
|
||||||
}
|
}
|
||||||
is ConeKotlinTypeProjectionOut -> {
|
is ConeKotlinTypeProjectionOut -> {
|
||||||
val irType = this.type.toIrType(session, declarationStorage)
|
val irType = this.type.toIrType(session, declarationStorage, irBuiltIns)
|
||||||
makeTypeProjection(irType, Variance.OUT_VARIANCE)
|
makeTypeProjection(irType, Variance.OUT_VARIANCE)
|
||||||
}
|
}
|
||||||
is ConeKotlinType -> {
|
is ConeKotlinType -> {
|
||||||
val irType = toIrType(session, declarationStorage)
|
val irType = toIrType(session, declarationStorage, irBuiltIns)
|
||||||
makeTypeProjection(irType, Variance.INVARIANT)
|
makeTypeProjection(irType, Variance.INVARIANT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.*
|
import org.jetbrains.kotlin.ir.declarations.impl.*
|
||||||
import org.jetbrains.kotlin.ir.descriptors.*
|
import org.jetbrains.kotlin.ir.descriptors.*
|
||||||
@@ -40,7 +41,8 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
|||||||
class Fir2IrDeclarationStorage(
|
class Fir2IrDeclarationStorage(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
private val irSymbolTable: SymbolTable,
|
private val irSymbolTable: SymbolTable,
|
||||||
private val moduleDescriptor: FirModuleDescriptor
|
private val moduleDescriptor: FirModuleDescriptor,
|
||||||
|
private val irBuiltIns: IrBuiltIns
|
||||||
) {
|
) {
|
||||||
private val firSymbolProvider = session.firSymbolProvider
|
private val firSymbolProvider = session.firSymbolProvider
|
||||||
|
|
||||||
@@ -90,6 +92,9 @@ class Fir2IrDeclarationStorage(
|
|||||||
irSymbolTable.leaveScope(descriptor)
|
irSymbolTable.leaveScope(descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun FirTypeRef.toIrType(session: FirSession, declarationStorage: Fir2IrDeclarationStorage) =
|
||||||
|
toIrType(session, declarationStorage, irBuiltIns)
|
||||||
|
|
||||||
private fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment {
|
private fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment {
|
||||||
return fragmentCache.getOrPut(fqName) {
|
return fragmentCache.getOrPut(fqName) {
|
||||||
// TODO: module descriptor is wrong here
|
// TODO: module descriptor is wrong here
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class Fir2IrVisitor(
|
|||||||
|
|
||||||
private val typeContext = session.typeContext
|
private val typeContext = session.typeContext
|
||||||
|
|
||||||
private val declarationStorage = Fir2IrDeclarationStorage(session, symbolTable, moduleDescriptor)
|
private val declarationStorage = Fir2IrDeclarationStorage(session, symbolTable, moduleDescriptor, irBuiltIns)
|
||||||
|
|
||||||
private val nothingType = session.builtinTypes.nothingType.toIrType(session, declarationStorage)
|
private val nothingType = session.builtinTypes.nothingType.toIrType(session, declarationStorage)
|
||||||
|
|
||||||
@@ -138,6 +138,9 @@ class Fir2IrVisitor(
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun FirTypeRef.toIrType(session: FirSession, declarationStorage: Fir2IrDeclarationStorage) =
|
||||||
|
toIrType(session, declarationStorage, irBuiltIns)
|
||||||
|
|
||||||
override fun visitElement(element: FirElement, data: Any?): IrElement {
|
override fun visitElement(element: FirElement, data: Any?): IrElement {
|
||||||
TODO("Should not be here: ${element.render()}")
|
TODO("Should not be here: ${element.render()}")
|
||||||
}
|
}
|
||||||
@@ -711,7 +714,7 @@ class Fir2IrVisitor(
|
|||||||
private fun FirAnnotationCall.toIrExpression(): IrExpression {
|
private fun FirAnnotationCall.toIrExpression(): IrExpression {
|
||||||
val coneType = (annotationTypeRef as? FirResolvedTypeRef)?.type as? ConeLookupTagBasedType
|
val coneType = (annotationTypeRef as? FirResolvedTypeRef)?.type as? ConeLookupTagBasedType
|
||||||
val firSymbol = coneType?.lookupTag?.toSymbol(session) as? FirClassSymbol
|
val firSymbol = coneType?.lookupTag?.toSymbol(session) as? FirClassSymbol
|
||||||
val type = coneType?.toIrType(this@Fir2IrVisitor.session, declarationStorage)
|
val type = coneType?.toIrType(session, declarationStorage, irBuiltIns)
|
||||||
val symbol = type?.classifierOrNull
|
val symbol = type?.classifierOrNull
|
||||||
return convertWithOffsets { startOffset, endOffset ->
|
return convertWithOffsets { startOffset, endOffset ->
|
||||||
when (symbol) {
|
when (symbol) {
|
||||||
|
|||||||
+3
-1
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.codegen.AsmUtil
|
|||||||
import org.jetbrains.kotlin.fileClasses.internalNameWithoutInnerClasses
|
import org.jetbrains.kotlin.fileClasses.internalNameWithoutInnerClasses
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
||||||
|
import org.jetbrains.kotlin.ir.types.isPrimitiveType
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||||
@@ -31,7 +32,8 @@ import org.jetbrains.org.objectweb.asm.Type
|
|||||||
object IteratorNext : IntrinsicMethod() {
|
object IteratorNext : IntrinsicMethod() {
|
||||||
|
|
||||||
override fun toCallable(expression: IrFunctionAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction {
|
override fun toCallable(expression: IrFunctionAccessExpression, signature: JvmMethodSignature, context: JvmBackendContext): IrIntrinsicFunction {
|
||||||
val type = AsmUtil.unboxType(signature.returnType)
|
// If the array element type is unboxed primitive, do not unbox. Otherwise AsmUtil.unbox throws exception
|
||||||
|
val type = if (AsmUtil.isBoxedPrimitiveType(signature.returnType)) AsmUtil.unboxType(signature.returnType) else signature.returnType
|
||||||
val newSignature = signature.newReturnType(type)
|
val newSignature = signature.newReturnType(type)
|
||||||
return IrIntrinsicFunction.create(expression, newSignature, context, AsmTypes.OBJECT_TYPE) {
|
return IrIntrinsicFunction.create(expression, newSignature, context, AsmTypes.OBJECT_TYPE) {
|
||||||
val primitiveClassName = getKotlinPrimitiveClassName(type)
|
val primitiveClassName = getKotlinPrimitiveClassName(type)
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in BooleanArray(5)) {
|
for (x in BooleanArray(5)) {
|
||||||
if (x != false) return "Fail $x"
|
if (x != false) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in ByteArray(5)) {
|
for (x in ByteArray(5)) {
|
||||||
if (x != 0.toByte()) return "Fail $x"
|
if (x != 0.toByte()) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in CharArray(5)) {
|
for (x in CharArray(5)) {
|
||||||
if (x != 0.toChar()) return "Fail $x"
|
if (x != 0.toChar()) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in DoubleArray(5)) {
|
for (x in DoubleArray(5)) {
|
||||||
if (x != 0.toDouble()) return "Fail $x"
|
if (x != 0.toDouble()) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in FloatArray(5)) {
|
for (x in FloatArray(5)) {
|
||||||
if (x != 0.toFloat()) return "Fail $x"
|
if (x != 0.toFloat()) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in IntArray(5)) {
|
for (x in IntArray(5)) {
|
||||||
if (x != 0) return "Fail $x"
|
if (x != 0) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in LongArray(5)) {
|
for (x in LongArray(5)) {
|
||||||
if (x != 0.toLong()) return "Fail $x"
|
if (x != 0.toLong()) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
for (x in ShortArray(5)) {
|
for (x in ShortArray(5)) {
|
||||||
if (x != 0.toShort()) return "Fail $x"
|
if (x != 0.toShort()) return "Fail $x"
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = BooleanArray(5)
|
val a = BooleanArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = ByteArray(5)
|
val a = ByteArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = ByteArray(5)
|
val a = ByteArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = CharArray(5)
|
val a = CharArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = DoubleArray(5)
|
val a = DoubleArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = FloatArray(5)
|
val a = FloatArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = IntArray(5)
|
val a = IntArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = LongArray(5)
|
val a = LongArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = LongArray(5)
|
val a = LongArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val a = ShortArray(5)
|
val a = ShortArray(5)
|
||||||
val x = a.iterator()
|
val x = a.iterator()
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun test(str: String): String {
|
fun test(str: String): String {
|
||||||
var s = ""
|
var s = ""
|
||||||
for (i in 1..3) {
|
for (i in 1..3) {
|
||||||
|
|||||||
Vendored
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
var s = "OK"
|
var s = "OK"
|
||||||
for (i in 1..3) {
|
for (i in 1..3) {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
var r = ""
|
var r = ""
|
||||||
for (i in 1..1) {
|
for (i in 1..1) {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box() : String {
|
fun box() : String {
|
||||||
val a = IntArray (5)
|
val a = IntArray (5)
|
||||||
var i = 0
|
var i = 0
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
package demo2
|
package demo2
|
||||||
|
|
||||||
fun print(o : Any?) {}
|
fun print(o : Any?) {}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
package demo2
|
package demo2
|
||||||
|
|
||||||
fun print(o : Any?) {}
|
fun print(o : Any?) {}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
val r = 1.toLong()..2
|
val r = 1.toLong()..2
|
||||||
var s = ""
|
var s = ""
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun idiv(a: Int, b: Int): Int =
|
fun idiv(a: Int, b: Int): Int =
|
||||||
if (b == 0) throw Exception("Division by zero") else a / b
|
if (b == 0) throw Exception("Division by zero") else a / b
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
var result = ""
|
var result = ""
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
var result = ""
|
var result = ""
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +ProperFinally
|
// !LANGUAGE: +ProperFinally
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
var result = ""
|
var result = ""
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +ProperFinally
|
// !LANGUAGE: +ProperFinally
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
var result = ""
|
var result = ""
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun test1(): String {
|
fun test1(): String {
|
||||||
var r = ""
|
var r = ""
|
||||||
for (i in 1..2) {
|
for (i in 1..2) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_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
|
// IGNORE_BACKEND: JS
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun test1(): Boolean {
|
fun test1(): Boolean {
|
||||||
test1@ for(i in 1..2) {
|
test1@ for(i in 1..2) {
|
||||||
continue@test1
|
continue@test1
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
operator fun Int.component1() = this + 1
|
operator fun Int.component1() = this + 1
|
||||||
operator fun Int.component2() = this + 2
|
operator fun Int.component2() = this + 2
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
operator fun Long.component1() = this + 1
|
operator fun Long.component1() = this + 1
|
||||||
operator fun Long.component2() = this + 2
|
operator fun Long.component2() = this + 2
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
operator fun Int.component1() = this + 1
|
operator fun Int.component1() = this + 1
|
||||||
operator fun Int.component2() = this + 2
|
operator fun Int.component2() = this + 2
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
operator fun Int.component1() = this + 1
|
operator fun Int.component1() = this + 1
|
||||||
operator fun Int.component2() = this + 2
|
operator fun Int.component2() = this + 2
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
operator fun Long.component1() = this + 1
|
operator fun Long.component1() = this + 1
|
||||||
operator fun Long.component2() = this + 2
|
operator fun Long.component2() = this + 2
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: 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_FIR: 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
|
// IGNORE_BACKEND: JS
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// KJS_WITH_FULL_RUNTIME
|
// KJS_WITH_FULL_RUNTIME
|
||||||
// Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT!
|
// Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT!
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun test1(): Long {
|
fun test1(): Long {
|
||||||
var s = 0L
|
var s = 0L
|
||||||
for (i in 1L..4) {
|
for (i in 1L..4) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// KJS_WITH_FULL_RUNTIME
|
// KJS_WITH_FULL_RUNTIME
|
||||||
// Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT!
|
// Auto-generated by org.jetbrains.kotlin.generators.tests.GenerateRangesCodegenTestData. DO NOT EDIT!
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
var result = 0
|
var result = 0
|
||||||
val intRange: IntProgression = 1..3
|
val intRange: IntProgression = 1..3
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
var result = 0
|
var result = 0
|
||||||
val intRange = 1..3
|
val intRange = 1..3
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
var result = 0
|
var result = 0
|
||||||
for (i: Int? in 1..3) {
|
for (i: Int? in 1..3) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun stringConcat(n : Int) : String? {
|
fun stringConcat(n : Int) : String? {
|
||||||
var string : String? = ""
|
var string : String? = ""
|
||||||
for (i in 0..(n - 1))
|
for (i in 0..(n - 1))
|
||||||
|
|||||||
+8
-6
@@ -135,7 +135,7 @@ public class GenerateRangesCodegenTestData {
|
|||||||
out.printf("// IGNORE_BACKEND: %s%n%n", backendName);
|
out.printf("// IGNORE_BACKEND: %s%n%n", backendName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeToFile(File file, String generatedBody, boolean isForUnsigned) {
|
private static void writeToFile(File file, String generatedBody, boolean isForUnsigned, boolean ignoreFrontendIR) {
|
||||||
PrintWriter out;
|
PrintWriter out;
|
||||||
try {
|
try {
|
||||||
//noinspection IOResourceOpenedButNotSafelyClosed
|
//noinspection IOResourceOpenedButNotSafelyClosed
|
||||||
@@ -145,7 +145,9 @@ public class GenerateRangesCodegenTestData {
|
|||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
out.println("// IGNORE_BACKEND_FIR: JVM_IR");
|
if (ignoreFrontendIR) {
|
||||||
|
out.println("// IGNORE_BACKEND_FIR: JVM_IR");
|
||||||
|
}
|
||||||
out.println("// KJS_WITH_FULL_RUNTIME");
|
out.println("// KJS_WITH_FULL_RUNTIME");
|
||||||
out.println("// Auto-generated by " + GenerateRangesCodegenTestData.class.getName() + ". DO NOT EDIT!");
|
out.println("// Auto-generated by " + GenerateRangesCodegenTestData.class.getName() + ". DO NOT EDIT!");
|
||||||
out.println("// WITH_RUNTIME");
|
out.println("// WITH_RUNTIME");
|
||||||
@@ -225,10 +227,10 @@ public class GenerateRangesCodegenTestData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String fileName = testFunName + ".kt";
|
String fileName = testFunName + ".kt";
|
||||||
writeToFile(new File(AS_LITERAL_DIR, fileName), asLiteralBody.toString(), false);
|
writeToFile(new File(AS_LITERAL_DIR, fileName), asLiteralBody.toString(), false, !fileName.equals("emptyRange.kt"));
|
||||||
writeToFile(new File(AS_EXPRESSION_DIR, fileName), asExpressionBody.toString(), false);
|
writeToFile(new File(AS_EXPRESSION_DIR, fileName), asExpressionBody.toString(), false, !fileName.equals("emptyRange.kt"));
|
||||||
writeToFile(new File(UNSIGNED_AS_LITERAL_DIR, fileName), unsignedAsLiteralBody.toString(), true);
|
writeToFile(new File(UNSIGNED_AS_LITERAL_DIR, fileName), unsignedAsLiteralBody.toString(), true, true);
|
||||||
writeToFile(new File(UNSIGNED_AS_EXPRESSION_DIR, fileName), unsignedAsExpressionBody.toString(), true);
|
writeToFile(new File(UNSIGNED_AS_EXPRESSION_DIR, fileName), unsignedAsExpressionBody.toString(), true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user