KT-40363 Handle non-octal int literals in for-loop conversions
- See EA-210233 - ^KT-40363 Fixed
This commit is contained in:
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.nj2k.tree.*
|
||||
import org.jetbrains.kotlin.nj2k.types.JKJavaArrayType
|
||||
import org.jetbrains.kotlin.nj2k.types.JKJavaPrimitiveType
|
||||
import org.jetbrains.kotlin.nj2k.types.JKNoType
|
||||
import org.jetbrains.kotlin.utils.extractRadix
|
||||
import org.jetbrains.kotlin.utils.radixPrefix
|
||||
import kotlin.math.abs
|
||||
|
||||
|
||||
@@ -200,8 +202,11 @@ class ForConversion(context: NewJ2kConverterContext) : RecursiveApplicableConver
|
||||
if (correction == 0) return bound
|
||||
|
||||
if (bound is JKLiteralExpression && bound.type == JKLiteralExpression.LiteralType.INT) {
|
||||
val value = bound.literal.toInt()
|
||||
return JKLiteralExpression((value + correction).toString(), bound.type)
|
||||
val correctedLiteral = addCorrectionToIntLiteral(bound.literal, correction)
|
||||
|
||||
if (correctedLiteral != null) {
|
||||
return JKLiteralExpression(correctedLiteral, bound.type)
|
||||
}
|
||||
}
|
||||
|
||||
val sign = if (correction > 0) JKOperatorToken.PLUS else JKOperatorToken.MINUS
|
||||
@@ -215,6 +220,17 @@ class ForConversion(context: NewJ2kConverterContext) : RecursiveApplicableConver
|
||||
)
|
||||
}
|
||||
|
||||
private fun addCorrectionToIntLiteral(intLiteral: String, correction: Int): String? {
|
||||
require(!intLiteral.startsWith("-")) { "This function does not work with signed literals, but $intLiteral was supplied" }
|
||||
|
||||
val numberWithRadix = extractRadix(intLiteral)
|
||||
|
||||
val value = numberWithRadix.number.toIntOrNull(numberWithRadix.radix) ?: return null
|
||||
val fixedValue = (value + correction).toString(numberWithRadix.radix)
|
||||
|
||||
return "${numberWithRadix.radixPrefix}${fixedValue}"
|
||||
}
|
||||
|
||||
private fun indicesIterationRange(
|
||||
start: JKExpression,
|
||||
bound: JKExpression,
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
class A {
|
||||
{
|
||||
for (int i = 0; i < 0x12b; i++) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
internal class A {
|
||||
init {
|
||||
for (i in 0..0x12a) {
|
||||
}
|
||||
}
|
||||
}
|
||||
+5
@@ -3538,6 +3538,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew
|
||||
runTest("nj2k/testData/newJ2k/literalExpression/kt-15991.java");
|
||||
}
|
||||
|
||||
@TestMetadata("kt-40363.java")
|
||||
public void testKt_40363() throws Exception {
|
||||
runTest("nj2k/testData/newJ2k/literalExpression/kt-40363.java");
|
||||
}
|
||||
|
||||
@TestMetadata("long.java")
|
||||
public void testLong() throws Exception {
|
||||
runTest("nj2k/testData/newJ2k/literalExpression/long.java");
|
||||
|
||||
Reference in New Issue
Block a user