FIR checker: report UNINITIALIZED_ENUM_(ENTRY|COMPANION)

This commit is contained in:
Jinseong Jeon
2021-04-02 10:50:10 -07:00
committed by Mikhail Glukhikh
parent ad9b962536
commit 619360fe4d
22 changed files with 500 additions and 25 deletions
@@ -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()
}
}
}
@@ -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()
}
}
}
@@ -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
@@ -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
}
}
@@ -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) {
@@ -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