|  | // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  | package properties | 
|  |  | 
|  | open class LateInitProperty { | 
|  | private lateinit var privateLateInitProp: String | 
|  | protected lateinit var protectedLateInitProp: String | 
|  | internal lateinit var internalLateInitProp: String | 
|  | public lateinit var publicLateInitProp: String | 
|  |  | 
|  | fun callSetterPrivateLateInitProp(v: String) { | 
|  | privateLateInitProp = v | 
|  | } | 
|  |  | 
|  | fun callGetterPrivateLateInitProp(): String { | 
|  | return privateLateInitProp | 
|  | } | 
|  | } | 
|  |  | 
|  | class SubLateInitProperty: LateInitProperty() { | 
|  | fun callSetterProtectedLateInitProp(v: String) { | 
|  | protectedLateInitProp = v | 
|  | } | 
|  |  | 
|  | fun callGetterProtectedLateInitProp(): String { | 
|  | return protectedLateInitProp | 
|  | } | 
|  | } | 
|  |  | 
|  | fun lateInitProperty_noUseOfProperties() { | 
|  | LateInitProperty() | 
|  | println("DONE") | 
|  | } | 
|  |  | 
|  | fun lateInitProperty_usePrivateLateInitProp() { | 
|  | val obj = LateInitProperty() | 
|  | obj.callSetterPrivateLateInitProp("foo") | 
|  | println(obj.callGetterPrivateLateInitProp()) | 
|  | } | 
|  |  | 
|  | fun lateInitProperty_useProtectedLateInitProp() { | 
|  | val obj = SubLateInitProperty() | 
|  | obj.callSetterProtectedLateInitProp("foo") | 
|  | println(obj.callGetterProtectedLateInitProp()) | 
|  | } | 
|  |  | 
|  | fun lateInitProperty_useInternalLateInitProp() { | 
|  | val obj = LateInitProperty() | 
|  | obj.internalLateInitProp = "foo" | 
|  | println(obj.internalLateInitProp) | 
|  | } | 
|  |  | 
|  | fun lateInitProperty_usePublicLateInitProp() { | 
|  | val obj = LateInitProperty() | 
|  | obj.publicLateInitProp = "foo" | 
|  | println(obj.publicLateInitProp) | 
|  | } |