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

object ObjectProperties {
  private var privateProp: String = "privateProp"
  internal var internalProp: String = "internalProp"
  public var publicProp: String = "publicProp"

  private lateinit var privateLateInitProp: String
  internal lateinit var internalLateInitProp: String
  public lateinit var publicLateInitProp: String

  public var primitiveProp: Int = Int.MAX_VALUE

  fun callSetterPrivateProp(v: String) {
    privateProp = v
  }

  fun callGetterPrivateProp(): String {
    return privateProp
  }

  fun callSetterLateInitPrivateProp(v: String) {
    privateLateInitProp = v
  }

  fun callGetterLateInitPrivateProp(): String {
    return privateLateInitProp
  }

  fun doNotUseProperties(): String {
    return "doNotUseProperties"
  }
}

fun objectProperties_noUseOfProperties() {
  println(ObjectProperties.doNotUseProperties())
}

fun objectProperties_usePrivateProp() {
  ObjectProperties.callSetterPrivateProp("foo")
  println(ObjectProperties.callGetterPrivateProp())
}

fun objectProperties_useInternalProp() {
  ObjectProperties.internalProp = "foo"
  println(ObjectProperties.internalProp)
}

fun objectProperties_usePublicProp() {
  ObjectProperties.publicProp = "foo"
  println(ObjectProperties.publicProp)
}

fun objectProperties_usePrimitiveProp() {
  ObjectProperties.primitiveProp = Int.MIN_VALUE
  println(ObjectProperties.primitiveProp)
}

fun objectProperties_useLateInitPrivateProp() {
  ObjectProperties.callSetterLateInitPrivateProp("foo")
  println(ObjectProperties.callGetterLateInitPrivateProp())
}

fun objectProperties_useLateInitInternalProp() {
  ObjectProperties.internalLateInitProp = "foo"
  println(ObjectProperties.internalLateInitProp)
}

fun objectProperties_useLateInitPublicProp() {
  ObjectProperties.publicLateInitProp = "foo"
  println(ObjectProperties.publicLateInitProp)
}
