// RUN_PIPELINE_TILL: BACKEND
// FIR_IDENTICAL
// LANGUAGE: +ProhibitVisibilityOfNestedClassifiersFromSupertypesOfCompanion
// DIAGNOSTICS: -UNUSED_VARIABLE

// See KT-21515 for a class diagram and details

// Object is to prevent accidental short-name import
object O {
    open class Alpha {
        class FromAlpha

        companion object {
            class FromCompanionAlpha
        }
    }

    open class Beta : Alpha() {
        class FromBeta

        companion object {
            class FromCompanionBeta
        }
    }


    open class A {
        class FromA

        companion object : Beta() {
            class FromCompanionA
        }
    }

//////////////////////////

    open class FarAway {
        class FromFarAway

    }

    open class Gamma {
        class FromGamma
        companion object : FarAway() {
            class FromCompanionGamma
        }
    }

    open class B : A() {
        class FromB

        companion object : Gamma() {
            class FromCompanionB
        }
    }
}

///////////////////////////////


open class Delta {
    class FromDelta
}

class C : O.B() {
    companion object : Delta() {
        class FromCompanionC
    }

    // VISIBLE: Classifiers from direct superclasses
    val c = O.A.FromA()
    val d = O.B.FromB()

    // VISIBLE: Classifiers from our own companion
    val n = C.Companion.FromCompanionC()

    // INVISIBLE: direct superclasses themselves.
    val a = O.A()
    val b = O.B()

    // DEPRECATED: Classifiers from companions of direct superclasses
    val e = O.A.Companion.FromCompanionA()
    val f = O.B.Companion.FromCompanionB()

    // INVISIBLE: "cousin" supertypes themselves
    val g = O.Alpha()
    val h = O.Beta()
    val i = O.Gamma()

    // DEPRECATED: classifiers from "cousin" superclasses
    val k = O.Alpha.FromAlpha()
    val l = O.Beta.FromBeta()
    val m = O.Gamma.FromGamma()

    // INVISIBLE: We don't see classifiers from companions of "cousin" superclasses
    val o = O.Alpha.Companion.FromCompanionAlpha()
    val p = O.Beta.Companion.FromCompanionBeta()
    val q = O.Gamma.Companion.FromCompanionGamma()

    // DEPRECATED: Classifiers from supertypes of our own companion
    val r = Delta.FromDelta()
}

/* GENERATED_FIR_TAGS: classDeclaration, companionObject, nestedClass, objectDeclaration, propertyDeclaration */
