// Copyright (c) 2020, 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 com.android.tools.r8.kotlin.metadata.typeargument_lib

open class SomeClass

class Invariant<T, C> {

  constructor(someValue : C) {
    println(someValue)
  }

  fun classGenerics(t : T) : T {
    return t
  }

  fun <R> funGenerics(r : R) : R {
    return r
  }

  fun <R : SomeClass> funGenericsWithUpperBound(r : R) : R {
    return r;
  }

  fun <R> funGenericsWithUpperBounds(r1 : R, r2 : R) : R
    where R : SomeClass,
          R : Comparable<SomeClass> {
    return when {
      r1 > r2 -> {
        r1;
      }
      else -> {
        r2;
      }
    }
  }

  fun <R : T> mixedGenerics(r : R) : T {
    return r;
  }
}

class CoVariant<out T>(val t : T) {

  fun classGenerics() : CoVariant<T> {
    return CoVariant(t);
  }
}

class ContraVariant<in T> {

  fun classGenerics(t : T) {
    println(t)
  }
}

fun <T> CoVariant<T>.unBoxAndBox() : CoVariant<T> {
  return CoVariant(this.t)
}

fun <T, R> CoVariant<R>.update(t : T) : CoVariant<T> {
  println(this.t)
  return CoVariant(t)
}

fun <T> CoVariant<T>.unboxAndPutInBox(box : CoVariant<T>) : CoVariant<T> {
  println(this.t)
  println(box.t)
  return CoVariant(box.t)
}

inline fun <reified T> CoVariant<T>.asList() : CoVariant<Array<T>> {
  println(this.t)
  return CoVariant(arrayOf(this.t))
}

inline fun <reified T> CoVariant<T>.asList(vararg ts : T) : CoVariant<Array<out T>> {
  println(this.t)
  return CoVariant(ts)
}

fun <T> CoVariant<T>.asObfuscatedClass() : CoVariant<Array<Array<ClassThatWillBeObfuscated>>> {
  println(this.t)
  return CoVariant(arrayOf(arrayOf(ClassThatWillBeObfuscated(42))))
}