KT-40359 Catch NumberFormatException during literal conversion
- Instead of failing J2K conversion completely, insert TODO expression to the resulting code (it is better to have a converted code with TODO than to have nothing at all) - See EA-210233 for similar exceptions - ^KT-40359 Fixed
This commit is contained in:
committed by
Roman Golyshev
parent
cc0a787735
commit
cba671a3ef
@@ -6,16 +6,35 @@
|
|||||||
package org.jetbrains.kotlin.nj2k.conversions
|
package org.jetbrains.kotlin.nj2k.conversions
|
||||||
|
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NonNls
|
||||||
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
|
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
|
||||||
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression
|
import org.jetbrains.kotlin.nj2k.tree.*
|
||||||
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
|
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
|
|
||||||
class LiteralConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
|
class LiteralConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
if (element !is JKLiteralExpression) return recurse(element)
|
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() {
|
private fun JKLiteralExpression.convertLiteral() {
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
class Test {
|
class Test {
|
||||||
int negativeOctalInt = 023432423432;
|
int negativeOctalInt = 023432423432;
|
||||||
int octalInt = 07432423432;
|
int octalInt = 07432423432;
|
||||||
|
int invalidOctalInt = 08;
|
||||||
|
|
||||||
long negativeOctalLong = 01777777777777777777777L;
|
long negativeOctalLong = 01777777777777777777777L;
|
||||||
long octalLong = 0777777777777777777777L;
|
long octalLong = 0777777777777777777777L;
|
||||||
|
long invalidOctalLong = 08L;
|
||||||
|
|
||||||
short octalShort = 047777;
|
short octalShort = 047777;
|
||||||
byte octalByte = 077;
|
byte octalByte = 077;
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
internal class Test {
|
internal class Test {
|
||||||
var negativeOctalInt = -1670764774
|
var negativeOctalInt = -1670764774
|
||||||
var octalInt = 1013589786
|
var octalInt = 1013589786
|
||||||
|
var invalidOctalInt: Int = TODO("Could not convert int literal '08' to Kotlin")
|
||||||
var negativeOctalLong = -1L
|
var negativeOctalLong = -1L
|
||||||
var octalLong = 9223372036854775807L
|
var octalLong = 9223372036854775807L
|
||||||
|
var invalidOctalLong: Long = TODO("Could not convert long literal '08L' to Kotlin")
|
||||||
var octalShort: Short = 20479
|
var octalShort: Short = 20479
|
||||||
var octalByte: Byte = 63
|
var octalByte: Byte = 63
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user