From 4bc4f0bce755b7779763a821a4d6df22547abc08 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 23 Mar 2016 13:54:13 +0300 Subject: [PATCH] J2K: not initialized field of non-primitive type should have null initializer #KT-11544 Fixed --- .../org/jetbrains/kotlin/j2k/TypeConverter.kt | 3 +++ .../callChainExpression/libraryFieldCall.kt | 5 ++--- .../libraryStringFieldCall.kt | 5 ++--- .../class/classWithMultiplyFields.kt | 4 ++-- .../nestedClassNameInParameterDefaults2.kt | 3 +-- .../nestedClassNameInParameterDefaults3.kt | 3 +-- .../nestedClassNameInParameterDefaults4.kt | 3 +-- .../fileOrElement/field/internalField.kt | 3 +-- .../fileOrElement/field/needInitializer.java | 22 +++++++++++++++++++ .../fileOrElement/field/needInitializer.kt | 22 +++++++++++++++++++ .../fileOrElement/field/protectedField.kt | 3 +-- .../fileOrElement/field/publicField.kt | 3 +-- .../fileOrElement/field/varWithoutInit.kt | 3 +-- j2k/testData/fileOrElement/issues/kt-5400.kt | 3 +-- ...otlinConverterForWebDemoTestGenerated.java | 6 +++++ ...otlinConverterSingleFileTestGenerated.java | 6 +++++ 16 files changed, 73 insertions(+), 24 deletions(-) create mode 100644 j2k/testData/fileOrElement/field/needInitializer.java create mode 100644 j2k/testData/fileOrElement/field/needInitializer.kt diff --git a/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt index 264eb7f8ef4..9f7cc82d490 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt @@ -255,6 +255,9 @@ class TypeConverter(val converter: Converter) { } } } + else if (variable is PsiField && !variable.hasWriteAccesses(converter.referenceSearcher, variable.containingClass)) { + return Nullability.Nullable + } if (variable.isMainMethodParameter() ) { return Nullability.NotNull diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryFieldCall.kt b/j2k/testData/fileOrElement/callChainExpression/libraryFieldCall.kt index a9b7fff5a51..824bbb17299 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryFieldCall.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryFieldCall.kt @@ -1,10 +1,9 @@ -// ERROR: Property must be initialized or be abstract internal object Library { - val ourOut: java.io.PrintStream + val ourOut: java.io.PrintStream? = null } internal class User { fun main() { - Library.ourOut.print(1) + Library.ourOut!!.print(1) } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryStringFieldCall.kt b/j2k/testData/fileOrElement/callChainExpression/libraryStringFieldCall.kt index 335f685b46e..1f6a63ed532 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryStringFieldCall.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryStringFieldCall.kt @@ -1,10 +1,9 @@ -// ERROR: Property must be initialized or be abstract internal class Library { - val myString: String + val myString: String? = null } internal class User { fun main() { - Library().myString.isEmpty() + Library().myString!!.isEmpty() } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/class/classWithMultiplyFields.kt b/j2k/testData/fileOrElement/class/classWithMultiplyFields.kt index 0bda7e0f9f8..4c6c72de143 100644 --- a/j2k/testData/fileOrElement/class/classWithMultiplyFields.kt +++ b/j2k/testData/fileOrElement/class/classWithMultiplyFields.kt @@ -1,5 +1,5 @@ internal class T { - var a: String - var b: String + var a: String? = null + var b: String? = null var c = "abc" } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt index 185648bc6a4..d8434692860 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults2.kt @@ -1,4 +1,3 @@ -// ERROR: Property must be initialized or be abstract import A.Nested internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD)) { @@ -12,5 +11,5 @@ internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD) } internal class B { - var nested: Nested + var nested: Nested? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt index f2cfdfae66c..be004561955 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults3.kt @@ -1,4 +1,3 @@ -// ERROR: Property must be initialized or be abstract package pack import pack.A.Nested @@ -14,5 +13,5 @@ internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD) } internal class B { - var nested: Nested + var nested: Nested? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt index 5ea5b4fd7af..3e0b04d1321 100644 --- a/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt +++ b/j2k/testData/fileOrElement/constructors/nestedClassNameInParameterDefaults4.kt @@ -1,4 +1,3 @@ -// ERROR: Property must be initialized or be abstract package pack import pack.A.* @@ -14,5 +13,5 @@ internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD) } internal class B { - var nested: Nested + var nested: Nested? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/field/internalField.kt b/j2k/testData/fileOrElement/field/internalField.kt index c49abd9c60d..b7573ab7770 100644 --- a/j2k/testData/fileOrElement/field/internalField.kt +++ b/j2k/testData/fileOrElement/field/internalField.kt @@ -1,5 +1,4 @@ // ERROR: Unresolved reference: Foo -// ERROR: Property must be initialized or be abstract internal class C { - var f: Foo + var f: Foo? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/field/needInitializer.java b/j2k/testData/fileOrElement/field/needInitializer.java new file mode 100644 index 00000000000..4e95f005766 --- /dev/null +++ b/j2k/testData/fileOrElement/field/needInitializer.java @@ -0,0 +1,22 @@ +public class Init { + public String field1; + public String field2; + + public int field3; + public int field4; + + public Init() { + field1 = "str"; + field3 = 1; + + String prop1; + prop1 = "aaa"; + + String prop2; + + int prop3; + prop3 = 1; + + int prop4; + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/field/needInitializer.kt b/j2k/testData/fileOrElement/field/needInitializer.kt new file mode 100644 index 00000000000..ba912bbfb00 --- /dev/null +++ b/j2k/testData/fileOrElement/field/needInitializer.kt @@ -0,0 +1,22 @@ +class Init { + var field1: String + var field2: String? = null + + var field3: Int = 0 + var field4: Int = 0 + + init { + field1 = "str" + field3 = 1 + + val prop1: String + prop1 = "aaa" + + val prop2: String + + val prop3: Int + prop3 = 1 + + val prop4: Int + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/field/protectedField.kt b/j2k/testData/fileOrElement/field/protectedField.kt index bfa318f3d9f..b9558f109a4 100644 --- a/j2k/testData/fileOrElement/field/protectedField.kt +++ b/j2k/testData/fileOrElement/field/protectedField.kt @@ -1,5 +1,4 @@ // ERROR: Unresolved reference: Foo -// ERROR: Property must be initialized or be abstract internal class C { - protected var f: Foo + protected var f: Foo? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/field/publicField.kt b/j2k/testData/fileOrElement/field/publicField.kt index c49abd9c60d..b7573ab7770 100644 --- a/j2k/testData/fileOrElement/field/publicField.kt +++ b/j2k/testData/fileOrElement/field/publicField.kt @@ -1,5 +1,4 @@ // ERROR: Unresolved reference: Foo -// ERROR: Property must be initialized or be abstract internal class C { - var f: Foo + var f: Foo? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/field/varWithoutInit.kt b/j2k/testData/fileOrElement/field/varWithoutInit.kt index c49abd9c60d..b7573ab7770 100644 --- a/j2k/testData/fileOrElement/field/varWithoutInit.kt +++ b/j2k/testData/fileOrElement/field/varWithoutInit.kt @@ -1,5 +1,4 @@ // ERROR: Unresolved reference: Foo -// ERROR: Property must be initialized or be abstract internal class C { - var f: Foo + var f: Foo? = null } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/issues/kt-5400.kt b/j2k/testData/fileOrElement/issues/kt-5400.kt index 5886a20474f..95fce88b4cf 100644 --- a/j2k/testData/fileOrElement/issues/kt-5400.kt +++ b/j2k/testData/fileOrElement/issues/kt-5400.kt @@ -1,8 +1,7 @@ -// ERROR: Property must be initialized or be abstract internal open class Base { internal inner class Nested } internal class Derived : Base() { - var field: Base.Nested + var field: Base.Nested? = null } \ 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 98ac97ddef9..2fd2a4b73a6 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -1825,6 +1825,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("needInitializer.java") + public void testNeedInitializer() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/needInitializer.java"); + doTest(fileName); + } + @TestMetadata("privateField.java") public void testPrivateField() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/privateField.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 7473292688f..8fb040e06e7 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -1825,6 +1825,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("needInitializer.java") + public void testNeedInitializer() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/needInitializer.java"); + doTest(fileName); + } + @TestMetadata("privateField.java") public void testPrivateField() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/privateField.java");