// MODULE: separate
// FILE: Test.kt

class I : J2 {
  internal val j1: Int
    field = 11
    internal get

  internal val j2: Int
    field = 22
    internal get

  internal val j3: Int
    field = 33
    internal get

  internal val j4: Int
    field = 44
    internal get

  constructor() /* primary */ {
    super/*J2*/()
    /* <init>() */

  }

}

// MODULE: main
// FILE: test.kt

class A : J {
  constructor() /* primary */ {
    super/*J*/()
    /* <init>() */

  }

}

class B : J2 {
  constructor() /* primary */ {
    super/*J2*/()
    /* <init>() */

  }

}

class C : J {
  constructor() /* primary */ {
    super/*J*/()
    /* <init>() */

  }

  override fun funJ1() {
  }

  override fun funJ2() {
  }

  internal override fun funJ4() {
  }

}

class D : J2 {
  constructor() /* primary */ {
    super/*J2*/()
    /* <init>() */

  }

  override fun funJ1() {
  }

  override fun funJ2() {
  }

}

class E : J {
  val j1: Int
    field = 100
    get

  val j2: Int
    field = 200
    get

  val j3: Int
    field = 300
    get

  val j4: Int
    field = 400
    get

  constructor() /* primary */ {
    super/*J*/()
    /* <init>() */

  }

}

open class F : J {
  protected val j1: Int
    field = 100
    protected get

  protected val j2: Int
    field = 200
    protected get

  protected val j3: Int
    field = 300
    protected get

  protected var j4: Int
    field = 400
    protected get
    protected set

  constructor() /* primary */ {
    super/*J*/()
    /* <init>() */

  }

}

class G : J {
  internal val j1: Int
    field = 100
    internal get

  internal val j2: Int
    field = 200
    internal get

  internal val j3: Int
    field = 300
    internal get

  internal var j4: Int
    field = 400
    internal get
    internal set

  constructor() /* primary */ {
    super/*J*/()
    /* <init>() */

  }

}

class H : J {
  private val j1: Int
    field = 100
    private get

  private val j2: Int
    field = 200
    private get

  private val j3: Int
    field = 300
    private get

  private val j4: Int
    field = 400
    private get

  constructor() /* primary */ {
    super/*J*/()
    /* <init>() */

  }

}

fun test(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I) {
  a.#j1 = 1
  a.#j2 = 2
  a.#j4 = 3
  a.funJ1()
  a.funJ2()
  a.funJ4()
  b.#j1 = 1
  b.funJ1()
  c.#j1 = 1
  c.#j2 = 2
  c.#j4 = 3
  c.funJ1()
  c.funJ2()
  c.funJ4()
  d.#j1 = 1
  d.funJ1()
  d.funJ2()
  e.<get-j1>() /*~> Unit */
  e.<get-j2>() /*~> Unit */
  e.<get-j3>() /*~> Unit */
  e.<get-j4>() /*~> Unit */
  f.#j1 /*~> Unit */
  f.#j2 /*~> Unit */
  f.#j4 /*~> Unit */
  g.<get-j1>() /*~> Unit */
  g.<get-j2>() /*~> Unit */
  g.<get-j3>() /*~> Unit */
  g.<get-j4>() /*~> Unit */
  h.#j1 /*~> Unit */
  h.#j2 /*~> Unit */
  h.#j4 /*~> Unit */
  i.#j1 /*~> Unit */
  i.#j2 /*~> Unit */
  i.#j4 /*~> Unit */
}
