diff --git a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt index 50029aa195b..5e96c897512 100644 --- a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt @@ -72,7 +72,8 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver private fun variableNullabilityNoCache(variable: PsiVariable): Nullability { if (variable is PsiEnumConstant) return Nullability.NotNull - if (variable.getType() is PsiPrimitiveType) return Nullability.NotNull + val variableType = variable.getType() + if (variableType is PsiPrimitiveType) return Nullability.NotNull var nullability = variable.nullabilityFromAnnotations() @@ -102,6 +103,11 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver } } + // variables of types like Integer are most likely nullable + if (nullability == Nullability.Default && variableType.getCanonicalText() in boxingTypes) { + return Nullability.Nullable + } + if (!conversionScope.contains(variable)) { // do not analyze usages out of our conversion scope if (variable is PsiParameter) { // Object.equals corresponds to Any.equals which has nullable parameter: @@ -158,7 +164,8 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver } private fun methodNullabilityNoCache(method: PsiMethod): Nullability { - if (method.getReturnType() is PsiPrimitiveType) return Nullability.NotNull + val returnType = method.getReturnType() + if (returnType is PsiPrimitiveType) return Nullability.NotNull var nullability = method.nullabilityFromAnnotations() @@ -167,6 +174,11 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver nullability = superSignatures.map { methodNullability(it.getMethod()) }.firstOrNull { it != Nullability.Default } ?: Nullability.Default } + // methods of types like Integer are most likely nullable + if (nullability == Nullability.Default && returnType?.getCanonicalText() in boxingTypes) { + return Nullability.Nullable + } + if (!conversionScope.contains(method)) return nullability // do not analyze body and usages of methods out of our conversion scope if (nullability == Nullability.Default) { @@ -265,4 +277,17 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver else Nullability.Default } + + class object { + private val boxingTypes: Set = setOf( + CommonClassNames.JAVA_LANG_BYTE, + CommonClassNames.JAVA_LANG_CHARACTER, + CommonClassNames.JAVA_LANG_DOUBLE, + CommonClassNames.JAVA_LANG_FLOAT, + CommonClassNames.JAVA_LANG_INTEGER, + CommonClassNames.JAVA_LANG_LONG, + CommonClassNames.JAVA_LANG_SHORT, + CommonClassNames.JAVA_LANG_BOOLEAN + ) + } } diff --git a/j2k/tests/testData/ast/field/conversion.kt b/j2k/tests/testData/ast/field/conversion.kt index e3eb44fc25a..a765f8b62f1 100644 --- a/j2k/tests/testData/ast/field/conversion.kt +++ b/j2k/tests/testData/ast/field/conversion.kt @@ -1,5 +1,5 @@ class A() { - private var i = getByte().toInt() + private var i: Int? = getByte().toInt() fun foo() { i = 10 diff --git a/j2k/tests/testData/ast/formatting/nonStaticMembers.kt b/j2k/tests/testData/ast/formatting/nonStaticMembers.kt index 33f676dfcd5..ff73612e96b 100644 --- a/j2k/tests/testData/ast/formatting/nonStaticMembers.kt +++ b/j2k/tests/testData/ast/formatting/nonStaticMembers.kt @@ -5,7 +5,7 @@ class F() { fun f2() { } - var i = 0 + var i: Int? = 0 fun f3() { } diff --git a/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt b/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt index ef0256981a4..6a19db6efe0 100644 --- a/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt +++ b/j2k/tests/testData/ast/formatting/nonStaticMembersWithComments.kt @@ -16,7 +16,7 @@ class F() { fun f2() { } - var i = 0 + var i: Int? = 0 fun f3() { } diff --git a/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt b/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt index 71b50c0348e..2d1d3b24f86 100644 --- a/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt +++ b/j2k/tests/testData/ast/formatting/staticAndNonStaticMembersWithComments.kt @@ -24,7 +24,7 @@ class F() { fun f1() { } - var i = 0 + var i: Int? = 0 //c5 diff --git a/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt b/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt index 2dc176320f2..5613de90b2f 100644 --- a/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt +++ b/j2k/tests/testData/ast/formatting/staticMembersWithComments.kt @@ -17,7 +17,7 @@ class F() { fun f2() { } - var i = 0 + var i: Int? = 0 fun f3() { } diff --git a/j2k/tests/testData/ast/issues/kt-543-boxed.kt b/j2k/tests/testData/ast/issues/kt-543-boxed.kt index a66932aa467..422897d015b 100644 --- a/j2k/tests/testData/ast/issues/kt-543-boxed.kt +++ b/j2k/tests/testData/ast/issues/kt-543-boxed.kt @@ -1,7 +1,7 @@ package demo class Test() { - fun putInt(i: Int) { + fun putInt(i: Int?) { } fun test() { diff --git a/j2k/tests/testData/ast/issues/kt-543-mixed.kt b/j2k/tests/testData/ast/issues/kt-543-mixed.kt index 553cbc1888c..51c5780d3d0 100644 --- a/j2k/tests/testData/ast/issues/kt-543-mixed.kt +++ b/j2k/tests/testData/ast/issues/kt-543-mixed.kt @@ -1,7 +1,7 @@ package demo class Test() { - fun putInt(i: Int) { + fun putInt(i: Int?) { } fun test() { diff --git a/j2k/tests/testData/ast/issues/kt-792-mixed.kt b/j2k/tests/testData/ast/issues/kt-792-mixed.kt index e8eb0dc6c4b..fc7c01c2318 100644 --- a/j2k/tests/testData/ast/issues/kt-792-mixed.kt +++ b/j2k/tests/testData/ast/issues/kt-792-mixed.kt @@ -1,6 +1,6 @@ package demo -class Test(i: Int) { +class Test(i: Int?) { fun test() { val i = 10 diff --git a/j2k/tests/testData/ast/issues/kt-794-mixed.kt b/j2k/tests/testData/ast/issues/kt-794-mixed.kt index b40935b89ad..f69a5e05698 100644 --- a/j2k/tests/testData/ast/issues/kt-794-mixed.kt +++ b/j2k/tests/testData/ast/issues/kt-794-mixed.kt @@ -1,11 +1,11 @@ package demo class Test() { - fun getInteger(i: Int): Int { + fun getInteger(i: Int?): Int? { return i } fun test() { - val i = getInteger(10) + val i = getInteger(10)!! } } \ No newline at end of file diff --git a/j2k/tests/testData/ast/localVariable/autoBangBang.kt b/j2k/tests/testData/ast/localVariable/autoBangBang.kt index b1ea23613e5..076cff468aa 100644 --- a/j2k/tests/testData/ast/localVariable/autoBangBang.kt +++ b/j2k/tests/testData/ast/localVariable/autoBangBang.kt @@ -1,4 +1,4 @@ -fun foo(i: Int) { - var i1 = i +fun foo(i: Int?) { + var i1 = i!! i1++ } \ No newline at end of file diff --git a/j2k/tests/testData/ast/localVariable/conversion.kt b/j2k/tests/testData/ast/localVariable/conversion.kt index c40e99deb33..292c6507953 100644 --- a/j2k/tests/testData/ast/localVariable/conversion.kt +++ b/j2k/tests/testData/ast/localVariable/conversion.kt @@ -1,4 +1,4 @@ fun foo(b: Byte) { - var i = b.toInt() + var i: Int? = b.toInt() if (p) i = 10 } \ No newline at end of file