K2: introduce custom Enum.entries migration checkers

Related to KT-56623, KT-56587
#KT-59344 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-08-24 09:46:51 +02:00
committed by Space Team
parent e0d68fc93e
commit 3ff2c7d6f7
70 changed files with 658 additions and 132 deletions
@@ -1,15 +0,0 @@
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
enum class E {
;
val entries: Int = 0
}
fun test() {
E::entries
val ref = E::entries
val refType: (E) -> Int = E::entries
val refTypeWithAnyExpectedType: Any = E::entries
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
@@ -1,16 +0,0 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
enum class E {
;
val entries: Int = 0
}
fun test() {
E::entries
val ref = E::entries
val refType: (E) -> Int = E::entries
val refTypeWithAnyExpectedType: Any = E::entries
}
@@ -1,4 +1,4 @@
FILE: conflictingPropertyEntriesAndReferenceOn.fir.kt
FILE: conflictingPropertyEntriesAndReferenceOn.kt
public final enum class E : R|kotlin/Enum<E>| {
private constructor(): R|E| {
super<R|kotlin/Enum<E>|>()
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
@@ -12,7 +12,7 @@ enum class A {
val A.Companion.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -13,7 +13,7 @@ enum class A {
val A.Companion.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -14,7 +14,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -15,7 +15,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -10,7 +10,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -11,7 +11,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
with(A) {
@@ -11,7 +11,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -12,7 +12,7 @@ enum class A {
}
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
with(A) {
entries
@@ -12,6 +12,6 @@ enum class A {
val <T> T.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
}
@@ -13,6 +13,6 @@ enum class A {
val <T> T.entries: Int get() = 0
fun test() {
A.entries
<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY!>A.entries<!>
A.Companion.entries
}
@@ -0,0 +1,5 @@
FILE: Main.kt
public final fun main(): R|kotlin/Unit| {
R|kotlin/io/println|(Q|JavaEnum|.R|/JavaEnum.entries*s|)
R|kotlin/io/println|(Q|JavaEnum01|.R|/JavaEnum01.entries*s|)
}
@@ -0,0 +1,25 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries +PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
// ISSUE: KT-56623
// FILE: JavaEnum.java
public enum JavaEnum {
public static String entries = "entries";
}
// FILE: JavaEnum01.java
interface I01 {
String entries = "entries";
}
public enum JavaEnum01 implements I01 {
}
// FILE: Main.kt
fun main() {
println(JavaEnum.entries)
println(JavaEnum01.entries)
}
@@ -1,33 +0,0 @@
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
// FILE: JEnumEntry.java
public enum JEnumEntry {
entries;
}
// FILE: JEnumStaticField.java
public enum JEnumStaticField {
;
public static final int entries = 0;
}
// FILE: JEnumField.java
public enum JEnumField {
;
public final int entries = 0;
}
// FILE: test.kt
fun test() {
JEnumEntry.entries
JEnumStaticField.entries
JEnumField::entries
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: -EnumEntries
// WITH_STDLIB
@@ -1,36 +0,0 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
// FILE: JEnumEntry.java
public enum JEnumEntry {
entries;
}
// FILE: JEnumStaticField.java
public enum JEnumStaticField {
;
public static final int entries = 0;
}
// FILE: JEnumField.java
public enum JEnumField {
;
public final int entries = 0;
}
// FILE: test.kt
fun test(): String {
val first = JEnumEntry.entries
val second = JEnumStaticField.entries
val third = JEnumField::entries
return "$first$second$third"
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
@@ -9,7 +9,7 @@ enum class E {
;
fun foo() {
entries
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
pckg.entries
}
}
@@ -20,7 +20,7 @@ class A {
class B {
fun foo() {
entries
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
pckg.entries
}
}
@@ -10,7 +10,7 @@ enum class E {
;
fun foo() {
entries.length
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>.length
pckg.entries.length
}
}
@@ -21,7 +21,7 @@ class A {
class B {
fun foo() {
entries.length
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>.length
pckg.entries.length
}
}
@@ -0,0 +1,6 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
enum class Some {}
val x = Some::entries
@@ -0,0 +1,6 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
enum class Some {}
val x = Some::<!DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE!>entries<!>
@@ -0,0 +1,46 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// ISSUE: KT-56587
enum class E05 {
;
object entries
}
fun test05() {
println(<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>E05.entries<!>)
}
enum class E07(val entries: String) {
;
fun test() {
println(entries)
}
}
enum class E071 {
;
constructor(entries: String) {
println(entries)
}
}
enum class E09 {
;
val entries: String = "entries"
fun test() {
println(entries)
}
}
interface I01 {
val entries: String
get() = "entries"
}
enum class E10 : I01 {
;
fun test() {
println(entries)
}
}
@@ -0,0 +1,46 @@
// !LANGUAGE: +EnumEntries -PrioritizedEnumEntries
// WITH_STDLIB
// ISSUE: KT-56587
enum class E05 {
;
object entries
}
fun test05() {
println(E05.entries)
}
enum class E07(val entries: String) {
;
fun test() {
println(entries)
}
}
enum class E071 {
;
constructor(entries: String) {
println(entries)
}
}
enum class E09 {
;
val entries: String = "entries"
fun test() {
println(entries)
}
}
interface I01 {
val entries: String
get() = "entries"
}
enum class E10 : I01 {
;
fun test() {
println(entries)
}
}
@@ -0,0 +1,112 @@
FILE: toBeShadowedPrioritized.kt
public final enum class E05 : R|kotlin/Enum<E05>| {
private constructor(): R|E05| {
super<R|kotlin/Enum<E05>|>()
}
public final object entries : R|kotlin/Any| {
private constructor(): R|E05.entries| {
super<R|kotlin/Any|>()
}
}
public final static fun values(): R|kotlin/Array<E05>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E05| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E05>|
public get(): R|kotlin/enums/EnumEntries<E05>|
}
public final fun test05(): R|kotlin/Unit| {
R|kotlin/io/println|(Q|E05|.R|/E05.entries*s|)
}
public final enum class E07 : R|kotlin/Enum<E07>| {
private constructor(entries: R|kotlin/String|): R|E07| {
super<R|kotlin/Enum<E07>|>()
}
public final val entries: R|kotlin/String| = R|<local>/entries|
public get(): R|kotlin/String|
public final fun test(): R|kotlin/Unit| {
R|kotlin/io/println|(this@R|/E07|.R|/E07.entries|)
}
public final static fun values(): R|kotlin/Array<E07>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E07| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E07>|
public get(): R|kotlin/enums/EnumEntries<E07>|
}
public final enum class E071 : R|kotlin/Enum<E071>| {
private constructor(entries: R|kotlin/String|): R|E071| {
super<R|kotlin/Enum<E071>|>()
R|kotlin/io/println|(R|<local>/entries|)
}
public final static fun values(): R|kotlin/Array<E071>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E071| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E071>|
public get(): R|kotlin/enums/EnumEntries<E071>|
}
public final enum class E09 : R|kotlin/Enum<E09>| {
private constructor(): R|E09| {
super<R|kotlin/Enum<E09>|>()
}
public final val entries: R|kotlin/String| = String(entries)
public get(): R|kotlin/String|
public final fun test(): R|kotlin/Unit| {
R|kotlin/io/println|(this@R|/E09|.R|/E09.entries|)
}
public final static fun values(): R|kotlin/Array<E09>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E09| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E09>|
public get(): R|kotlin/enums/EnumEntries<E09>|
}
public abstract interface I01 : R|kotlin/Any| {
public open val entries: R|kotlin/String|
public get(): R|kotlin/String| {
^ String(entries)
}
}
public final enum class E10 : R|I01|, R|kotlin/Enum<E10>| {
private constructor(): R|E10| {
super<R|kotlin/Enum<E10>|>()
}
public final fun test(): R|kotlin/Unit| {
R|kotlin/io/println|(this@R|/E10|.R|/I01.entries|)
}
public final static fun values(): R|kotlin/Array<E10>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|E10| {
}
public final static val entries: R|kotlin/enums/EnumEntries<E10>|
public get(): R|kotlin/enums/EnumEntries<E10>|
}
@@ -0,0 +1,48 @@
// FIR_IDENTICAL
// !LANGUAGE: +EnumEntries +PrioritizedEnumEntries
// WITH_STDLIB
// FIR_DUMP
// ISSUE: KT-56587
enum class E05 {
;
object entries
}
fun test05() {
println(E05.entries)
}
enum class E07(val entries: String) {
;
fun test() {
println(entries)
}
}
enum class E071 {
;
constructor(entries: String) {
println(entries)
}
}
enum class E09 {
;
val entries: String = "entries"
fun test() {
println(entries)
}
}
interface I01 {
val entries: String
get() = "entries"
}
enum class E10 : I01 {
;
fun test() {
println(entries)
}
}