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

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

// Serves as intermediate to make sure the access to a property is done from a separate class.
private object Intermediate {
  fun readPrivateProp() = privateProp

  fun writePrivateProp(s: String) {
    privateProp = s
  }

  fun readInternalProp() = internalProp

  fun writeInternalProp(s: String) {
    internalProp = s
  }

  fun readPublicProp() = publicProp

  fun writePublicProp(s: String) {
    publicProp = s
  }

  fun readPrimitiveProp() = primitiveProp

  fun writePrimitiveProp(i: Int) {
    primitiveProp = i
  }

  fun readLateInitPrivateProp() = privateLateInitProp

  fun writeLateInitPrivateProp(s: String) {
    privateLateInitProp = s
  }

  fun readLateInitInternalProp() = internalLateInitProp

  fun writeLateInitInternalProp(s: String) {
    internalLateInitProp = s
  }

  fun readLateInitPublicProp() = publicLateInitProp

  fun writeLateInitPublicProp(s: String) {
    publicLateInitProp = s
  }
}

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

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

fun fileProperties_usePrivateProp() {
  Intermediate.writePrivateProp("foo")
  println(Intermediate.readPrivateProp())
}

fun fileProperties_useInternalProp() {
  Intermediate.writeInternalProp("foo")
  println(Intermediate.readInternalProp())
}

fun fileProperties_usePublicProp() {
  Intermediate.writePublicProp("foo")
  println(Intermediate.readPublicProp())
}

fun fileProperties_usePrimitiveProp() {
  Intermediate.writePrimitiveProp(Int.MIN_VALUE)
  println(Intermediate.readPrimitiveProp())
}

fun fileProperties_useLateInitPrivateProp() {
  Intermediate.writeLateInitPrivateProp("foo")
  println(Intermediate.readLateInitPrivateProp())
}

fun fileProperties_useLateInitInternalProp() {
  Intermediate.writeLateInitInternalProp("foo")
  println(Intermediate.readLateInitInternalProp())
}

fun fileProperties_useLateInitPublicProp() {
  Intermediate.writeLateInitPublicProp("foo")
  println(Intermediate.readLateInitPublicProp())
}
