// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -NOTHING_TO_INLINE // !LANGUAGE: +NativeJsProhibitLateinitIsInitializedIntrinsicWithoutPrivateAccess // FILE: stdlibInternal.kt package kotlin.internal @Target(AnnotationTarget.VALUE_PARAMETER) @Retention(AnnotationRetention.BINARY) internal annotation class AccessibleLateinitPropertyLiteral // FILE: stdlib.kt package kotlin import kotlin.internal.AccessibleLateinitPropertyLiteral import kotlin.reflect.KProperty0 inline val @receiver:AccessibleLateinitPropertyLiteral KProperty0<*>.isInitialized: Boolean get() = true // FILE: test.kt interface Base { var x: String } open class Foo : Base { override lateinit var x: String private lateinit var y: String var nonLateInit: Int = 1 fun ok() { val b: Boolean = this::x.isInitialized val otherInstance = Foo() otherInstance::x.isInitialized (this::x).isInitialized (@Suppress("ALL") (this::x)).isInitialized object { fun local() { class Local { val xx = this@Foo::x.isInitialized val yy = this@Foo::y.isInitialized } } } } fun onLiteral() { val p = this::x p.isInitialized } fun onNonLateinit() { this::nonLateInit.isInitialized } inline fun inlineFun() { this::x.isInitialized object { val z = this@Foo::x.isInitialized } } inner class InnerSubclass : Foo() { fun innerOk() { // This is access to Foo.x declared lexically above this@Foo::x.isInitialized // This is access to InnerSubclass.x which is inherited from Foo.x this::x.isInitialized } } } fun onNonAccessible() { Foo()::x.isInitialized } fun onNonLateinit() { Foo()::nonLateInit.isInitialized } object Unrelated { fun onNonAccessible() { Foo()::x.isInitialized } } class FooImpl : Foo() { fun onNonAccessible() { this::x.isInitialized } } // FILE: other.kt class OtherFooImpl : Foo() { fun onNonAccessible() { this::x.isInitialized } }