From 5edb872224f9d31d7d379b7504f9e5a9d508ff12 Mon Sep 17 00:00:00 2001 From: SuperVlad Date: Sat, 31 Dec 2016 12:15:54 +0300 Subject: [PATCH] Fix for KT-9594 J2K: null cast incorrect conversion. #KT-9594 fixed --- j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt | 2 +- j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt | 7 +++++++ j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt | 8 +++++++- .../fileOrElement/typeCastExpression/castNullObject.java | 2 ++ .../fileOrElement/typeCastExpression/castNullObject.kt | 1 + .../j2k/JavaToKotlinConverterForWebDemoTestGenerated.java | 6 ++++++ .../j2k/JavaToKotlinConverterSingleFileTestGenerated.java | 6 ++++++ 7 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 j2k/testData/fileOrElement/typeCastExpression/castNullObject.java create mode 100644 j2k/testData/fileOrElement/typeCastExpression/castNullObject.kt diff --git a/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt index 406a9136374..4422a4a490f 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt @@ -109,7 +109,7 @@ class CodeConverter( val actualType = expression.type ?: return convertedExpression - if (actualType is PsiPrimitiveType || actualType is PsiClassType && expectedType is PsiPrimitiveType) { + if ((actualType is PsiPrimitiveType && actualType != PsiType.NULL) || actualType is PsiClassType && expectedType is PsiPrimitiveType) { convertedExpression = BangBangExpression.surroundIfNullable(convertedExpression) } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index ed27c163158..73ad57b3953 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -270,6 +270,12 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { val value = expression.value var text = expression.text!! val type = expression.type + + if(expression.isNullLiteral()) { + result = LiteralExpression.NullLiteral + return + } + if (type != null) { val typeStr = type.canonicalText if (typeStr == "double") { @@ -314,6 +320,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { } } + result = LiteralExpression(text) } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt index f204c72a735..e7e702c39fa 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/Expressions.kt @@ -84,10 +84,16 @@ class TypeCastExpression(val type: Type, val expression: Expression) : Expressio get() = type.isNullable } -class LiteralExpression(val literalText: String) : Expression() { +open class LiteralExpression(val literalText: String) : Expression() { + override fun generateCode(builder: CodeBuilder) { builder.append(literalText) } + + object NullLiteral : LiteralExpression("null"){ + override val isNullable: Boolean + get() = true + } } class ParenthesizedExpression(val expression: Expression) : Expression() { diff --git a/j2k/testData/fileOrElement/typeCastExpression/castNullObject.java b/j2k/testData/fileOrElement/typeCastExpression/castNullObject.java new file mode 100644 index 00000000000..ae53b0c9798 --- /dev/null +++ b/j2k/testData/fileOrElement/typeCastExpression/castNullObject.java @@ -0,0 +1,2 @@ +//expression +(Object) null \ No newline at end of file diff --git a/j2k/testData/fileOrElement/typeCastExpression/castNullObject.kt b/j2k/testData/fileOrElement/typeCastExpression/castNullObject.kt new file mode 100644 index 00000000000..42752455b59 --- /dev/null +++ b/j2k/testData/fileOrElement/typeCastExpression/castNullObject.kt @@ -0,0 +1 @@ +null as Any? \ No newline at end of file diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index a72acae17f4..35613e57f32 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -4823,6 +4823,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("castNullObject.java") + public void testCastNullObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullObject.java"); + doTest(fileName); + } + @TestMetadata("castNullable.java") public void testCastNullable() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullable.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index c168e1459ee..8db28df59b3 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -4823,6 +4823,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("castNullObject.java") + public void testCastNullObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullObject.java"); + doTest(fileName); + } + @TestMetadata("castNullable.java") public void testCastNullable() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullable.java");