FIR: introduce inline classes checks

This commit is contained in:
eugenpolytechnic
2021-02-22 15:17:26 +03:00
committed by Mikhail Glukhikh
parent 9cc8f44390
commit f6e564ffa6
46 changed files with 923 additions and 238 deletions
@@ -0,0 +1,146 @@
FILE: inlineClassConstructor.kt
public final class WithoutConstructor : R|kotlin/Any| {
public constructor(): R|WithoutConstructor| {
super<R|kotlin/Any|>()
}
}
public final inline class WithoutParameter : R|kotlin/Any| {
public constructor(): R|WithoutParameter| {
super<R|kotlin/Any|>()
}
}
public final inline class WithTwoParameters : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|, y: R|kotlin/String|): R|WithTwoParameters| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
public final val y: R|kotlin/String| = R|<local>/y|
public get(): R|kotlin/String|
}
public final inline class Ok : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|Ok| {
super<R|kotlin/Any|>()
}
private final val x: R|kotlin/Int| = R|<local>/x|
private get(): R|kotlin/Int|
}
public final inline class OpenParameter : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|OpenParameter| {
super<R|kotlin/Any|>()
}
public open val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public final inline class VarargParameter : R|kotlin/Any| {
public constructor(vararg x: R|kotlin/IntArray|): R|VarargParameter| {
super<R|kotlin/Any|>()
}
}
public final inline class VarParameter : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|VarParameter| {
super<R|kotlin/Any|>()
}
public final var x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
}
public final inline class SimpleParameter : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|SimpleParameter| {
super<R|kotlin/Any|>()
}
}
public final inline class UnitParameter : R|kotlin/Any| {
public constructor(x: R|kotlin/Unit|): R|UnitParameter| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Unit| = R|<local>/x|
public get(): R|kotlin/Unit|
}
public final inline class NothingParameter : R|kotlin/Any| {
public constructor(x: R|kotlin/Nothing|): R|NothingParameter| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Nothing| = R|<local>/x|
public get(): R|kotlin/Nothing|
}
public final inline class TypeParameterType<T> : R|kotlin/Any| {
public constructor<T>(x: R|T|): R|TypeParameterType<T>| {
super<R|kotlin/Any|>()
}
public final val x: R|T| = R|<local>/x|
public get(): R|T|
}
public final inline class ArrayOfTypeParameters<T> : R|kotlin/Any| {
public constructor<T>(x: R|kotlin/Array<T>|): R|ArrayOfTypeParameters<T>| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Array<T>| = R|<local>/x|
public get(): R|kotlin/Array<T>|
}
public final inline class ListOfTypeParameters<T> : R|kotlin/Any| {
public constructor<T>(x: R|kotlin/collections/List<T>|): R|ListOfTypeParameters<T>| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/collections/List<T>| = R|<local>/x|
public get(): R|kotlin/collections/List<T>|
}
public final inline class StarProjection<T> : R|kotlin/Any| {
public constructor<T>(x: R|kotlin/Array<*>|): R|StarProjection<T>| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Array<*>| = R|<local>/x|
public get(): R|kotlin/Array<*>|
}
public final inline class SimpleRecursive : R|kotlin/Any| {
public constructor(x: R|SimpleRecursive|): R|SimpleRecursive| {
super<R|kotlin/Any|>()
}
public final val x: R|SimpleRecursive| = R|<local>/x|
public get(): R|SimpleRecursive|
}
public final inline class DoubleRecursive1 : R|kotlin/Any| {
public constructor(x: R|DoubleRecursive2|): R|DoubleRecursive1| {
super<R|kotlin/Any|>()
}
public final val x: R|DoubleRecursive2| = R|<local>/x|
public get(): R|DoubleRecursive2|
}
public final inline class DoubleRecursive2 : R|kotlin/Any| {
public constructor(x: R|DoubleRecursive1|): R|DoubleRecursive2| {
super<R|kotlin/Any|>()
}
public final val x: R|DoubleRecursive1| = R|<local>/x|
public get(): R|DoubleRecursive1|
}
@@ -0,0 +1,21 @@
<!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_INLINE_CLASS!>value<!> class WithoutConstructor {}
inline class WithoutParameter<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>()<!> {}
inline class WithTwoParameters<!INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE!>(val x: Int, val y: String)<!> {}
inline class Ok(private val x: Int) {}
inline class OpenParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!><!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> val x: Int<!>) {}
inline class VarargParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>vararg x: Int<!>) {}
inline class VarParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>var x: Int<!>) {}
inline class SimpleParameter(<!INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER!>x: Int<!>) {}
inline class UnitParameter(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>Unit<!>)
inline class NothingParameter(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>Nothing<!>)
inline class TypeParameterType<T>(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)
inline class ArrayOfTypeParameters<T>(val x: <!INLINE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>Array<T><!>)
inline class ListOfTypeParameters<T>(val x: List<T>)
inline class StarProjection<T>(val x: Array<*>)
inline class SimpleRecursive(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>SimpleRecursive<!>)
inline class DoubleRecursive1(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>DoubleRecursive2<!>)
inline class DoubleRecursive2(val x: <!INLINE_CLASS_CANNOT_BE_RECURSIVE!>DoubleRecursive1<!>)
@@ -0,0 +1,111 @@
FILE: inlineClassDeclaration.kt
public final class A : R|kotlin/Any| {
public constructor(): R|A| {
super<R|kotlin/Any|>()
}
public final inline class B : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|A.B| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public final fun foo(): R|kotlin/Unit| {
local final inline class C : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|A.C| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
}
public final inner class D : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|A.D| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
}
public open inline class NotFinalClass1 : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|NotFinalClass1| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public abstract inline class NotFinalClass2 : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|NotFinalClass2| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public sealed inline class NotFinalClass3 : R|kotlin/Any| {
protected constructor(x: R|kotlin/Int|): R|NotFinalClass3| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public final class CloneableClass1 : R|kotlin/Cloneable| {
public constructor(x: R|kotlin/Int|): R|CloneableClass1| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public final inline class CloneableClass2 : R|java/lang/Cloneable| {
public constructor(x: R|kotlin/Int|): R|CloneableClass2| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public open class Test : R|kotlin/Any| {
public constructor(): R|Test| {
super<R|kotlin/Any|>()
}
}
public final inline class ExtendTest : R|Test| {
public constructor(x: R|kotlin/Int|): R|ExtendTest| {
super<R|Test|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
public final inline class ImplementByDelegation : R|kotlin/Comparable<kotlin/Int>| {
public constructor(x: R|kotlin/Int|): R|ImplementByDelegation| {
super<R|kotlin/Any|>()
}
local final field <$$delegate_0>: R|kotlin/Comparable<kotlin/Int>| = R|<local>/x|
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
}
@@ -0,0 +1,19 @@
class A {
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class B(val x: Int)
fun foo() {
<!INLINE_CLASS_NOT_TOP_LEVEL!>inline<!> class C(val x: Int)
}
inner <!INLINE_CLASS_NOT_TOP_LEVEL!>value<!> class D(val x: Int)
}
<!INLINE_CLASS_NOT_FINAL!>open<!> inline class NotFinalClass1(val x: Int)
<!INLINE_CLASS_NOT_FINAL!>abstract<!> inline class NotFinalClass2(val x: Int)
<!INLINE_CLASS_NOT_FINAL!>sealed<!> inline class NotFinalClass3(val x: Int)
<!VALUE_CLASS_CANNOT_BE_CLONEABLE!>value<!> class CloneableClass1(val x: Int): Cloneable
<!VALUE_CLASS_CANNOT_BE_CLONEABLE!>inline<!> class CloneableClass2(val x: Int): java.lang.Cloneable
open class Test
inline class ExtendTest(val x: Int): <!INLINE_CLASS_CANNOT_EXTEND_CLASSES!>Test<!>
inline class ImplementByDelegation(val x: Int) : <!INLINE_CLASS_CANNOT_IMPLEMENT_INTERFACE_BY_DELEGATION!>Comparable<Int><!> by x
@@ -0,0 +1,100 @@
FILE: inlineClassMembers.kt
public final class BackingFields : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|BackingFields| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
public final val y: R|kotlin/Int| = Int(0)
public get(): R|kotlin/Int|
public final var z: R|kotlin/String|
public get(): R|kotlin/String| {
^ String()
}
public set(value: R|kotlin/String|): R|kotlin/Unit| {
}
}
public final class Val : R|kotlin/Any| {
public constructor(): R|Val| {
super<R|kotlin/Any|>()
}
public final operator fun getValue(thisRef: R|kotlin/Any?|, kProp: R|kotlin/Any?|): R|kotlin/Int| {
^getValue Int(1)
}
}
public final inline class DelegatedProp : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|DelegatedProp| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
public final val testVal: R|kotlin/Int|by R|/Val.Val|()
public get(): R|kotlin/Int| {
^ this@R|/DelegatedProp|.D|/DelegatedProp.testVal|.R|/Val.getValue|(this@R|/DelegatedProp|, ::R|/DelegatedProp.testVal|)
}
}
public final inline class ReversedMembers : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|ReversedMembers| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
public final fun box(): R|kotlin/Unit| {
}
public final fun unbox(): R|kotlin/Unit| {
}
public final override operator fun equals(other: R|kotlin/Any?|): R|kotlin/Boolean| {
^equals Boolean(true)
}
public final override fun hashCode(): R|kotlin/Int| {
^hashCode Int(1)
}
}
public final inline class SecondaryConstructors : R|kotlin/Any| {
public constructor(x: R|kotlin/Int|): R|SecondaryConstructors| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/Int| = R|<local>/x|
public get(): R|kotlin/Int|
public constructor(y: R|kotlin/String|): R|SecondaryConstructors| {
this<R|SecondaryConstructors|>(Int(5))
}
public constructor(x: R|kotlin/Int|, y: R|kotlin/String|): R|SecondaryConstructors| {
this<R|SecondaryConstructors|>(R|<local>/x|)
}
}
public final class WithInner : R|kotlin/Any| {
public constructor(x: R|kotlin/String|): R|WithInner| {
super<R|kotlin/Any|>()
}
public final val x: R|kotlin/String| = R|<local>/x|
public get(): R|kotlin/String|
public final inner class Inner : R|kotlin/Any| {
public constructor(): R|WithInner.Inner| {
super<R|kotlin/Any|>()
}
}
}
@@ -0,0 +1,32 @@
value class BackingFields(val x: Int) {
<!PROPERTY_WITH_BACKING_FIELD_INSIDE_INLINE_CLASS!>val y<!> = 0
var z: String
get() = ""
set(value) {}
}
class Val {
operator fun getValue(thisRef: Any?, kProp: Any?) = 1
}
inline class DelegatedProp(val x: Int) {
val testVal by <!DELEGATED_PROPERTY_INSIDE_INLINE_CLASS!>Val()<!>
}
inline class ReversedMembers(val x: Int) {
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>box<!>() {}<!>
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>unbox<!>() {}<!>
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>equals<!>(other: Any?) = true<!>
<!RESERVED_MEMBER_INSIDE_INLINE_CLASS{LT}!>override fun <!RESERVED_MEMBER_INSIDE_INLINE_CLASS{PSI}!>hashCode<!>() = 1<!>
}
inline class SecondaryConstructors(val x: Int) {
constructor(y: String) : this(5)
constructor(x: Int, y: String) : this(x) <!SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS!>{
}<!>
}
value class WithInner(val x: String) {
<!INNER_CLASS_INSIDE_INLINE_CLASS!>inner<!> class Inner
}