J2K: not initialized field of non-primitive type should have null initializer
#KT-11544 Fixed
This commit is contained in:
@@ -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() ) {
|
if (variable.isMainMethodParameter() ) {
|
||||||
return Nullability.NotNull
|
return Nullability.NotNull
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal object Library {
|
internal object Library {
|
||||||
val ourOut: java.io.PrintStream
|
val ourOut: java.io.PrintStream? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class User {
|
internal class User {
|
||||||
fun main() {
|
fun main() {
|
||||||
Library.ourOut.print(1)
|
Library.ourOut!!.print(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal class Library {
|
internal class Library {
|
||||||
val myString: String
|
val myString: String? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class User {
|
internal class User {
|
||||||
fun main() {
|
fun main() {
|
||||||
Library().myString.isEmpty()
|
Library().myString!!.isEmpty()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
internal class T {
|
internal class T {
|
||||||
var a: String
|
var a: String? = null
|
||||||
var b: String
|
var b: String? = null
|
||||||
var c = "abc"
|
var c = "abc"
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,4 +1,3 @@
|
|||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
import A.Nested
|
import A.Nested
|
||||||
|
|
||||||
internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD)) {
|
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 {
|
internal class B {
|
||||||
var nested: Nested
|
var nested: Nested? = null
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,4 +1,3 @@
|
|||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
package pack
|
package pack
|
||||||
|
|
||||||
import pack.A.Nested
|
import pack.A.Nested
|
||||||
@@ -14,5 +13,5 @@ internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD)
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal class B {
|
internal class B {
|
||||||
var nested: Nested
|
var nested: Nested? = null
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,4 +1,3 @@
|
|||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
package pack
|
package pack
|
||||||
|
|
||||||
import pack.A.*
|
import pack.A.*
|
||||||
@@ -14,5 +13,5 @@ internal class A @JvmOverloads constructor(nested: Nested = Nested(Nested.FIELD)
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal class B {
|
internal class B {
|
||||||
var nested: Nested
|
var nested: Nested? = null
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,5 +1,4 @@
|
|||||||
// ERROR: Unresolved reference: Foo
|
// ERROR: Unresolved reference: Foo
|
||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal class C {
|
internal class C {
|
||||||
var f: Foo
|
var f: Foo? = null
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-2
@@ -1,5 +1,4 @@
|
|||||||
// ERROR: Unresolved reference: Foo
|
// ERROR: Unresolved reference: Foo
|
||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal class C {
|
internal class C {
|
||||||
protected var f: Foo
|
protected var f: Foo? = null
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,5 +1,4 @@
|
|||||||
// ERROR: Unresolved reference: Foo
|
// ERROR: Unresolved reference: Foo
|
||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal class C {
|
internal class C {
|
||||||
var f: Foo
|
var f: Foo? = null
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,5 +1,4 @@
|
|||||||
// ERROR: Unresolved reference: Foo
|
// ERROR: Unresolved reference: Foo
|
||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal class C {
|
internal class C {
|
||||||
var f: Foo
|
var f: Foo? = null
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,8 +1,7 @@
|
|||||||
// ERROR: Property must be initialized or be abstract
|
|
||||||
internal open class Base {
|
internal open class Base {
|
||||||
internal inner class Nested
|
internal inner class Nested
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class Derived : Base() {
|
internal class Derived : Base() {
|
||||||
var field: Base.Nested
|
var field: Base.Nested? = null
|
||||||
}
|
}
|
||||||
@@ -1825,6 +1825,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("privateField.java")
|
||||||
public void testPrivateField() throws Exception {
|
public void testPrivateField() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/privateField.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/privateField.java");
|
||||||
|
|||||||
@@ -1825,6 +1825,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("privateField.java")
|
||||||
public void testPrivateField() throws Exception {
|
public void testPrivateField() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/privateField.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/field/privateField.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user