KT-10005 Java to Kotlin: do not convert type cast to cast to nullable if it should not be null
#KT-10005 Fixed
This commit is contained in:
@@ -480,12 +480,24 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
|
|||||||
result = MethodCallExpression.buildNotNull(operandConverted, typeConversion)
|
result = MethodCallExpression.buildNotNull(operandConverted, typeConversion)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val typeConverted = typeConverter.convertType(castType.getType(),
|
val nullability = if (operandConverted.isNullable && !expression.isQualifier())
|
||||||
if (operandConverted.isNullable) Nullability.Nullable else Nullability.NotNull)
|
Nullability.Nullable
|
||||||
|
else
|
||||||
|
Nullability.NotNull
|
||||||
|
val typeConverted = typeConverter.convertType(castType.type, nullability)
|
||||||
result = TypeCastExpression(typeConverted, operandConverted)
|
result = TypeCastExpression(typeConverted, operandConverted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun PsiExpression.isQualifier(): Boolean {
|
||||||
|
val parent = parent
|
||||||
|
when (parent) {
|
||||||
|
is PsiParenthesizedExpression -> return parent.isQualifier()
|
||||||
|
is PsiReferenceExpression -> return this == parent.qualifierExpression
|
||||||
|
else -> return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitPolyadicExpression(expression: PsiPolyadicExpression) {
|
override fun visitPolyadicExpression(expression: PsiPolyadicExpression) {
|
||||||
val args = expression.getOperands().map { codeConverter.convertExpression(it, expression.getType()) }
|
val args = expression.getOperands().map { codeConverter.convertExpression(it, expression.getType()) }
|
||||||
result = PolyadicExpression(args, getOperatorString(expression.getOperationTokenType()))
|
result = PolyadicExpression(args, getOperatorString(expression.getOperationTokenType()))
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
public class A {
|
||||||
|
void foo(Object o) {
|
||||||
|
if (o == null) return;
|
||||||
|
int length = ((String) o).length();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
class A {
|
||||||
|
internal fun foo(o: Any?) {
|
||||||
|
if (o == null) return
|
||||||
|
val length = (o as String).length
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4318,6 +4318,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/typeCastExpression"), Pattern.compile("^(.+)\\.java$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/typeCastExpression"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeDot.java")
|
||||||
|
public void testBeforeDot() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/beforeDot.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("castNullable.java")
|
@TestMetadata("castNullable.java")
|
||||||
public void testCastNullable() throws Exception {
|
public void testCastNullable() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullable.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullable.java");
|
||||||
|
|||||||
@@ -4318,6 +4318,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/typeCastExpression"), Pattern.compile("^(.+)\\.java$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/typeCastExpression"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("beforeDot.java")
|
||||||
|
public void testBeforeDot() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/beforeDot.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("castNullable.java")
|
@TestMetadata("castNullable.java")
|
||||||
public void testCastNullable() throws Exception {
|
public void testCastNullable() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullable.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/typeCastExpression/castNullable.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user