// 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)
}
