diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt index fbaac6a7733..4e25b4705fe 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt @@ -6,16 +6,35 @@ package org.jetbrains.kotlin.nj2k.conversions +import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext -import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression -import org.jetbrains.kotlin.nj2k.tree.JKTreeElement +import org.jetbrains.kotlin.nj2k.tree.* import java.math.BigInteger class LiteralConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) { override fun applyToElement(element: JKTreeElement): JKTreeElement { if (element !is JKLiteralExpression) return recurse(element) - element.convertLiteral() - return recurse(element) + + val convertedElement = try { + element.apply { convertLiteral() } + } catch (_: NumberFormatException) { + createTodoCall(cannotConvertLiteralMessage(element)) + } + + return recurse(convertedElement) + } + + private fun createTodoCall(@NonNls message: String): JKCallExpressionImpl { + val todoMethodSymbol = symbolProvider.provideMethodSymbol("kotlin.TODO") + val todoMessageArgument = JKArgumentImpl(JKLiteralExpression("\"$message\"", JKLiteralExpression.LiteralType.STRING)) + + return JKCallExpressionImpl(todoMethodSymbol, JKArgumentList(todoMessageArgument)) + } + + private fun cannotConvertLiteralMessage(element: JKLiteralExpression): String { + val literalType = element.type.toString().toLowerCase() + val literalValue = element.literal + return "Could not convert $literalType literal '$literalValue' to Kotlin" } private fun JKLiteralExpression.convertLiteral() { diff --git a/nj2k/testData/newJ2k/literalExpression/octal.java b/nj2k/testData/newJ2k/literalExpression/octal.java index 79028a5e729..f1ba2121e6e 100644 --- a/nj2k/testData/newJ2k/literalExpression/octal.java +++ b/nj2k/testData/newJ2k/literalExpression/octal.java @@ -1,8 +1,12 @@ class Test { int negativeOctalInt = 023432423432; int octalInt = 07432423432; + int invalidOctalInt = 08; + long negativeOctalLong = 01777777777777777777777L; long octalLong = 0777777777777777777777L; + long invalidOctalLong = 08L; + short octalShort = 047777; byte octalByte = 077; } \ No newline at end of file diff --git a/nj2k/testData/newJ2k/literalExpression/octal.kt b/nj2k/testData/newJ2k/literalExpression/octal.kt index bc5658a81aa..ad18b957194 100644 --- a/nj2k/testData/newJ2k/literalExpression/octal.kt +++ b/nj2k/testData/newJ2k/literalExpression/octal.kt @@ -1,8 +1,10 @@ internal class Test { var negativeOctalInt = -1670764774 var octalInt = 1013589786 + var invalidOctalInt: Int = TODO("Could not convert int literal '08' to Kotlin") var negativeOctalLong = -1L var octalLong = 9223372036854775807L + var invalidOctalLong: Long = TODO("Could not convert long literal '08L' to Kotlin") var octalShort: Short = 20479 var octalByte: Byte = 63 } \ No newline at end of file