FIR checker: report UNINITIALIZED_ENUM_(ENTRY|COMPANION)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
ad9b962536
commit
619360fe4d
Vendored
+31
-5
@@ -9,7 +9,7 @@ enum class B(val x: Int) {
|
||||
}
|
||||
|
||||
enum class C(val x: Int) {
|
||||
C1(SUM),
|
||||
C1(<!UNINITIALIZED_VARIABLE!>SUM<!>),
|
||||
C2(1);
|
||||
|
||||
companion object {
|
||||
@@ -26,13 +26,14 @@ enum class Fruit(personal: Int) {
|
||||
val common = 20
|
||||
}
|
||||
|
||||
val score = personal + common
|
||||
val score = personal + <!UNINITIALIZED_VARIABLE!>common<!>
|
||||
val score2 = { personal + <!UNINITIALIZED_VARIABLE!>common<!> }()
|
||||
}
|
||||
|
||||
// Another example from KT-11769
|
||||
enum class EnumCompanion1(val x: Int) {
|
||||
INSTANCE(Companion.foo()),
|
||||
ANOTHER(foo());
|
||||
INSTANCE(<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.foo()),
|
||||
ANOTHER(<!UNINITIALIZED_ENUM_COMPANION!>foo<!>());
|
||||
|
||||
companion object {
|
||||
fun foo() = 42
|
||||
@@ -40,7 +41,7 @@ enum class EnumCompanion1(val x: Int) {
|
||||
}
|
||||
// Also should be reported for implicit receiver
|
||||
enum class EnumCompanion2(val x: Int) {
|
||||
INSTANCE(foo());
|
||||
INSTANCE(<!UNINITIALIZED_ENUM_COMPANION!>foo<!>());
|
||||
|
||||
companion object {
|
||||
fun foo() = 42
|
||||
@@ -53,3 +54,28 @@ enum class EnumCompanion3(val x: Int) {
|
||||
|
||||
companion object
|
||||
}
|
||||
|
||||
interface ExtractableCodeDescriptor {
|
||||
fun isInterface(): Boolean
|
||||
}
|
||||
|
||||
enum class ExtractionTarget(val targetName: String) {
|
||||
FUNCTION("function") {
|
||||
override fun isAvailable(descriptor: ExtractableCodeDescriptor) = true
|
||||
},
|
||||
|
||||
LAZY_PROPERTY("lazy property") {
|
||||
override fun isAvailable(descriptor: ExtractableCodeDescriptor): Boolean {
|
||||
// Should not report UNINITIALIZED_ENUM_COMPANION
|
||||
return checkNotTrait(descriptor)
|
||||
}
|
||||
};
|
||||
|
||||
abstract fun isAvailable(descriptor: ExtractableCodeDescriptor): Boolean
|
||||
|
||||
companion object {
|
||||
fun checkNotTrait(descriptor: ExtractableCodeDescriptor): Boolean {
|
||||
return !descriptor.isInterface()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+26
@@ -27,6 +27,7 @@ enum class Fruit(personal: Int) {
|
||||
}
|
||||
|
||||
val score = personal + <!UNINITIALIZED_VARIABLE!>common<!>
|
||||
val score2 = { personal + common }()
|
||||
}
|
||||
|
||||
// Another example from KT-11769
|
||||
@@ -53,3 +54,28 @@ enum class EnumCompanion3(val x: Int) {
|
||||
|
||||
companion object
|
||||
}
|
||||
|
||||
interface ExtractableCodeDescriptor {
|
||||
fun isInterface(): Boolean
|
||||
}
|
||||
|
||||
enum class ExtractionTarget(val targetName: String) {
|
||||
FUNCTION("function") {
|
||||
override fun isAvailable(descriptor: ExtractableCodeDescriptor) = true
|
||||
},
|
||||
|
||||
LAZY_PROPERTY("lazy property") {
|
||||
override fun isAvailable(descriptor: ExtractableCodeDescriptor): Boolean {
|
||||
// Should not report UNINITIALIZED_ENUM_COMPANION
|
||||
return checkNotTrait(descriptor)
|
||||
}
|
||||
};
|
||||
|
||||
abstract fun isAvailable(descriptor: ExtractableCodeDescriptor): Boolean
|
||||
|
||||
companion object {
|
||||
fun checkNotTrait(descriptor: ExtractableCodeDescriptor): Boolean {
|
||||
return !descriptor.isInterface()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+39
@@ -149,6 +149,44 @@ public final enum class EnumCompanion3 : kotlin.Enum<EnumCompanion3> {
|
||||
public final /*synthesized*/ fun values(): kotlin.Array<EnumCompanion3>
|
||||
}
|
||||
|
||||
public interface ExtractableCodeDescriptor {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public abstract fun isInterface(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final enum class ExtractionTarget : kotlin.Enum<ExtractionTarget> {
|
||||
enum entry FUNCTION
|
||||
|
||||
enum entry LAZY_PROPERTY
|
||||
|
||||
private constructor ExtractionTarget(/*0*/ targetName: kotlin.String)
|
||||
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||
public final val targetName: kotlin.String
|
||||
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: ExtractionTarget): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
|
||||
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<ExtractionTarget!>!
|
||||
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public abstract fun isAvailable(/*0*/ descriptor: ExtractableCodeDescriptor): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public companion object Companion {
|
||||
private constructor Companion()
|
||||
public final fun checkNotTrait(/*0*/ descriptor: ExtractableCodeDescriptor): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): ExtractionTarget
|
||||
public final /*synthesized*/ fun values(): kotlin.Array<ExtractionTarget>
|
||||
}
|
||||
|
||||
public final enum class Fruit : kotlin.Enum<Fruit> {
|
||||
enum entry APPLE
|
||||
|
||||
@@ -156,6 +194,7 @@ public final enum class Fruit : kotlin.Enum<Fruit> {
|
||||
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||
public final val score: kotlin.Int
|
||||
public final val score2: kotlin.Int
|
||||
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Fruit): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
|
||||
+6
-5
@@ -1,10 +1,11 @@
|
||||
enum class A(val v: A) {
|
||||
A1(A2),
|
||||
A2(A1)
|
||||
A1(<!UNINITIALIZED_ENUM_ENTRY!>A2<!>),
|
||||
A2(A1),
|
||||
A3(<!UNINITIALIZED_ENUM_ENTRY!>A3<!>)
|
||||
}
|
||||
|
||||
enum class D(val x: Int) {
|
||||
D1(D2.x),
|
||||
D1(<!UNINITIALIZED_ENUM_ENTRY!>D2<!>.x),
|
||||
D2(D1.x)
|
||||
}
|
||||
|
||||
@@ -28,8 +29,8 @@ object Object1 {
|
||||
enum class MyEnum {
|
||||
A, B;
|
||||
val x = when(this) {
|
||||
A -> 1
|
||||
B -> 2
|
||||
<!UNINITIALIZED_ENUM_ENTRY!>A<!> -> 1
|
||||
<!UNINITIALIZED_ENUM_ENTRY!>B<!> -> 2
|
||||
else -> 3
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
enum class A(val v: A) {
|
||||
A1(<!UNINITIALIZED_ENUM_ENTRY!>A2<!>),
|
||||
A2(A1)
|
||||
A2(A1),
|
||||
A3(A3)
|
||||
}
|
||||
|
||||
enum class D(val x: Int) {
|
||||
|
||||
+2
@@ -5,6 +5,8 @@ public final enum class A : kotlin.Enum<A> {
|
||||
|
||||
enum entry A2
|
||||
|
||||
enum entry A3
|
||||
|
||||
private constructor A(/*0*/ v: A)
|
||||
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||
|
||||
Reference in New Issue
Block a user