diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index febaac2b6b5..772d54dcc5e 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -449,6 +449,10 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { val data = SpecialMethod.ConvertCallData(qualifier, arguments.asList(), typeArguments, dot, lPar, rPar, codeConverter) val converted = specialMethod.convertCall(data) if (converted != null) { + qualifier?.type?.let { + if (canRemoveSpecialMethod(specialMethod, it)) return + } + result = converted return } @@ -468,6 +472,16 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { methodExpression.assignNoPrototype() } + private fun canRemoveSpecialMethod(specialMethod: SpecialMethod, psiType: PsiType): Boolean = when { + specialMethod == SpecialMethod.NUMBER_BYTE_VALUE && psiType.canonicalText == "java.lang.Byte" -> true + specialMethod == SpecialMethod.NUMBER_SHORT_VALUE && psiType.canonicalText == "java.lang.Short" -> true + specialMethod == SpecialMethod.NUMBER_INT_VALUE && psiType.canonicalText == "java.lang.Integer" -> true + specialMethod == SpecialMethod.NUMBER_LONG_VALUE && psiType.canonicalText == "java.lang.Long" -> true + specialMethod == SpecialMethod.NUMBER_FLOAT_VALUE && psiType.canonicalText == "java.lang.Float" -> true + specialMethod == SpecialMethod.NUMBER_DOUBLE_VALUE && psiType.canonicalText == "java.lang.Double" -> true + else -> false + } + private fun KtLightMethod.isKotlinExtensionFunction(): Boolean { val origin = this.kotlinOrigin if (origin != null) return origin.isExtensionDeclaration() diff --git a/j2k/testData/fileOrElement/issues/kt-19943.java b/j2k/testData/fileOrElement/issues/kt-19943.java new file mode 100644 index 00000000000..bd868832c8e --- /dev/null +++ b/j2k/testData/fileOrElement/issues/kt-19943.java @@ -0,0 +1,27 @@ +import java.util.List; + +public class TestSpecialMethodForTypeValue { + public byte testByte(List xs) { + return xs.get(0).byteValue(); + } + + public short testShort(List xs) { + return xs.get(0).shortValue(); + } + + public int testInt(List xs) { + return xs.get(0).intValue(); + } + + public long testLong(List xs) { + return xs.get(0).longValue(); + } + + public float testFloat(List xs) { + return xs.get(0).floatValue(); + } + + public double testDouble(List xs) { + return xs.get(0).doubleValue(); + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/issues/kt-19943.kt b/j2k/testData/fileOrElement/issues/kt-19943.kt new file mode 100644 index 00000000000..acc11383439 --- /dev/null +++ b/j2k/testData/fileOrElement/issues/kt-19943.kt @@ -0,0 +1,25 @@ +class TestSpecialMethodForTypeValue { + fun testByte(xs: List): Byte { + return xs[0] + } + + fun testShort(xs: List): Short { + return xs[0] + } + + fun testInt(xs: List): Int { + return xs[0] + } + + fun testLong(xs: List): Long { + return xs[0] + } + + fun testFloat(xs: List): Float { + return xs[0] + } + + fun testDouble(xs: List): Double { + return xs[0] + } +} \ 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 31e476d0189..f4d7dd5c5e7 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -2969,6 +2969,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("kt-19943.java") + public void testKt_19943() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/kt-19943.java"); + doTest(fileName); + } + @TestMetadata("kt-5294.java") public void testKt_5294() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/kt-5294.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 08c93a838cc..b2246d72a61 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -2969,6 +2969,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("kt-19943.java") + public void testKt_19943() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/kt-19943.java"); + doTest(fileName); + } + @TestMetadata("kt-5294.java") public void testKt_5294() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/kt-5294.java");