// Generated from "nullability/Nullability.java"
@file:Suppress(
 "ALWAYS_NULL",
 "PARAMETER_NAME_CHANGED_ON_OVERRIDE",
 "SENSELESS_COMPARISON",
 "UNCHECKED_CAST",
 "UNNECESSARY_LATEINIT",
 "UNNECESSARY_NOT_NULL_ASSERTION",
 "UNREACHABLE_CODE",
 "UNUSED_ANONYMOUS_PARAMETER",
 "UNUSED_PARAMETER",
 "UNUSED_VARIABLE",
 "USELESS_CAST",
 "VARIABLE_IN_SINGLETON_WITHOUT_THREAD_LOCAL",
 "VARIABLE_WITH_REDUNDANT_INITIALIZER",
 "REDUNDANT_ELSE_IN_WHEN")

package nullability

import javaemul.lang.*
import java.lang.RuntimeException
import java.util.ArrayList
import java.util.Comparator
import javaemul.lang.MutableListJvm
import jsinterop.annotations.JsConstructor
import jsinterop.annotations.JsFunction
import jsinterop.annotations.JsMethod
import kotlin.Any
import kotlin.Array
import kotlin.Double
import kotlin.Int
import kotlin.String
import kotlin.Suppress
import kotlin.arrayOf
import kotlin.collections.MutableList
import kotlin.jvm.JvmStatic

open class Nullability {
 private var f1: String = "Hello"

 private var f2: String? = null

 private var f3: String? = null

 private var f4: MutableList<String> = ArrayList<String>()

 private var f5: MutableList<String>? = ArrayList<String>()

 private var f6: MutableList<String?> = ArrayList<String>() as MutableList<String?>

 private var f7: MutableList<String?>? = null

 private var f8: Array<String> = arrayOf<String>()

 private var f9: Array<String?> = arrayOf<String?>()

 private var f10: Array<String>? = arrayOf<String>()

 private var f12: MutableList<String?>? = ArrayList<String>() as MutableList<String?>?

 private var f13: Any

 private var f14: Any? = null

 @JsConstructor
 constructor(a: String) {
  this.f13 = Any()
 }

 open fun m1(a: String, b: MutableList<Double>, c: String?): String {
  return ""
 }

 open fun m2(a: String?, b: MutableList<Double?>): String? {
  return ""
 }

 @JsMethod
 open fun m3(a: String, vararg args: String): String? {
  val args_1: Array<String>? = args as Array<String>?
  return null
 }

 open fun m4(f: MyFunction) {}

 companion object {
  @JvmStatic
  internal fun <T: String?> testDefaultNullabilityBounds_pp_nullability(defaultNullability: ParameterizedDefaultNullability<T>?) {
   defaultNullability!!.getNonNullable_pp_nullability().length
   defaultNullability!!.getNullable_pp_nullability()!!.length
   defaultNullability!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T: String?> testDefaultNullabilityBounds_pp_nullability(nullable: ParameterizedNullable<T>?) {
   nullable!!.getNonNullable_pp_nullability().length
   nullable!!.getNullable_pp_nullability()!!.length
   nullable!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T: String?> testNullableBounds_pp_nullability(defaultNullability: ParameterizedDefaultNullability<T>?) {
   defaultNullability!!.getNonNullable_pp_nullability().length
   defaultNullability!!.getNullable_pp_nullability()!!.length
   defaultNullability!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T: String?> testNullableBounds_pp_nullability(nullable: ParameterizedNullable<T>?) {
   nullable!!.getNonNullable_pp_nullability().length
   nullable!!.getNullable_pp_nullability()!!.length
   nullable!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T: String> testNonNullableBounds_pp_nullability(defaultNullability: ParameterizedDefaultNullability<T>?) {
   defaultNullability!!.getNonNullable_pp_nullability().length
   defaultNullability!!.getNullable_pp_nullability()!!.length
   defaultNullability!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T: String> testNonNullableBounds_pp_nullability(nullable: ParameterizedNullable<T>?) {
   nullable!!.getNonNullable_pp_nullability().length
   nullable!!.getNullable_pp_nullability()!!.length
   nullable!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T: String> testNonNullableBounds_pp_nullability(nonNullable: ParameterizedNonNullable<T>?) {
   nonNullable!!.getNonNullable_pp_nullability().length
   nonNullable!!.getNullable_pp_nullability()!!.length
   nonNullable!!.getDefaultNullability_pp_nullability().length
  }

  @JvmStatic
  internal fun testDefaultNullabilityWildcards_pp_nullability(nonNullable: ParameterizedDefaultNullability<out String?>?) {
   nonNullable!!.getNonNullable_pp_nullability()!!.length
   nonNullable!!.getNullable_pp_nullability()!!.length
   nonNullable!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun testDefaultNullabilityWildcards_pp_nullability(nonNullable: ParameterizedNullable<out String?>?) {
   nonNullable!!.getNonNullable_pp_nullability()!!.length
   nonNullable!!.getNullable_pp_nullability()!!.length
   nonNullable!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun testDefaultNullabilityWildcards_pp_nullability(nonNullable: ParameterizedNonNullable<out String>?) {
   nonNullable!!.getNonNullable_pp_nullability()!!.length
   nonNullable!!.getNullable_pp_nullability()!!.length
   nonNullable!!.getDefaultNullability_pp_nullability()!!.length
  }

  @JvmStatic
  internal fun <T> testRecursive_pp_nullability() where T: Recursive<T>, T: Marker? {
   val generic: RecursiveParam<T> = RecursiveParam<T>()
   val parametrized: RecursiveParam<RecursiveChild> = RecursiveParam<RecursiveChild>()
  }

  @JvmStatic
  internal fun <T> testRecursiveNullable_pp_nullability() where T: RecursiveNullable<T>?, T: Marker? {
   val generic: RecursiveNullableParam<T> = RecursiveNullableParam<T>()
   val parametrized: RecursiveNullableParam<RecursiveNullableChild?> = RecursiveNullableParam<RecursiveNullableChild?>()
  }

  @JvmStatic
  internal fun testMethodNullmarked_pp_nullability() {
   open class ImplicitlyNullmarkedLocalClass internal constructor() {
    internal open fun acceptsNonNullStrng_pp_nullability(i: String?) {}
   }
  }
 }

 open class Foo<T> internal constructor() {
  internal open fun bar_pp_nullability(t: T) {}

  internal open fun baz_pp_nullability(): T? {
   return null
  }

  override fun toString(): String {
   return "Foo"
  }
 }

 @JsFunction
 fun interface MyFunction {
  fun x(a: String): String
 }

 interface StringList: MutableListJvm<String?>

 open class StringComparator: Comparator<String> {
  override fun compare(a: String, b: String): Int {
   return 0
  }
 }

 open class NullableStringComparator: Comparator<String?> {
  override fun compare(a: String?, b: String?): Int {
   return 0
  }
 }

 fun interface NullableTemplatedReturn<T> {
  fun foo(): T?
 }

 open class NullableTemplatedReturnOverride: NullableTemplatedReturn<String?> {
  override fun foo(): String? {
   return "foo"
  }
 }

 open class ParameterizedDefaultNullability<N> internal constructor() {
  internal open fun getNullable_pp_nullability(): N? {
   return null
  }

  internal open fun getNonNullable_pp_nullability(): N & Any {
   throw RuntimeException()
  }

  internal open fun getDefaultNullability_pp_nullability(): N {
   return null as N
  }
 }

 open class ParameterizedNullable<N> internal constructor() {
  internal open fun getNullable_pp_nullability(): N? {
   return null
  }

  internal open fun getNonNullable_pp_nullability(): N & Any {
   throw RuntimeException()
  }

  internal open fun getDefaultNullability_pp_nullability(): N {
   return null as N
  }
 }

 open class ParameterizedNonNullable<N: Any> internal constructor() {
  internal open fun getNullable_pp_nullability(): N? {
   return null
  }

  internal open fun getNonNullable_pp_nullability(): N {
   throw RuntimeException()
  }

  internal open fun getDefaultNullability_pp_nullability(): N {
   return null!!
  }
 }

 open class NonNullableInsideNullable<T> internal constructor() {
  internal open fun nonNullableTest_pp_nullability(nonNullable: ParameterizedNonNullable<T & Any>?) {}
 }

 open class Recursive<T> internal constructor() where T: Recursive<T>, T: Marker?

 open class RecursiveNullable<T> internal constructor() where T: RecursiveNullable<T>?, T: Marker?

 open class RecursiveChild internal constructor(): Recursive<RecursiveChild>(), Marker

 open class RecursiveNullableChild internal constructor(): RecursiveNullable<RecursiveNullableChild?>(), Marker

 open class RecursiveParam<T> internal constructor() where T: Recursive<T>, T: Marker?

 open class RecursiveNullableParam<T> internal constructor() where T: RecursiveNullable<T>?, T: Marker?
}

interface Marker
