/*
 * Copyright 2020 Google LLC
 * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// TEST PROCESSOR: DeclarationUtilProcessor
// FORMAT: <name>: isInternal: isLocal: isPrivate: isProtected: isPublic: isOpen
// EXPECTED:
// Cls: internal
// Cls / <init>: public
// Cls.b: public open
// Cls / <init>: public
// Cls / <init> / aaa: local
// Cls.prop: public open
// Cls.protectedProp: protected open
// Cls.abstractITFFun: public open
// Cls.pri: private
// ITF: public open
// ITF.prop: public open
// ITF.protectedProp: protected open
// ITF.b: public open
// ITF.abstractITFFun: public open
// ITF.nonAbstractITFFun: public open
// ITF.nonAbstractITFFun / aa: local
// NestedClassSubjects: public open
// NestedClassSubjects.NestedDataClass: public
// NestedClassSubjects.NestedDataClass / <init>: public
// NestedClassSubjects.NestedDataClass.field: public
// NestedClassSubjects.NestedFinalClass: public
// NestedClassSubjects.NestedFinalClass / <init>: public
// NestedClassSubjects.NestedFinalClass.field: public
// NestedClassSubjects.NestedOpenClass: public open
// NestedClassSubjects.NestedOpenClass / <init>: public
// NestedClassSubjects.NestedOpenClass.field: public
// NestedClassSubjects.NestedInterface: public open
// SealedBase: public open
// SealedBase.<init>: public
// SealedImpl: public
// SealedImpl.<init>: public
// END
// FILE: a.kt
internal class Cls(override val b: Int) : ITF {
    constructor() {
        val aaa = 2
        Cls(aaa)
    }
    override val prop: Int = 2

    override val protectedProp: Int = 2

    override fun abstractITFFun(): Int {
        return 2
    }

    private val pri: Int = 3
}

interface ITF {
    val prop: Int

    protected val protectedProp: Int

    val b: Int = 1

    fun abstractITFFun(): Int

    fun nonAbstractITFFun(): Int {
        val aa = "local"
        return 1
    }
}

interface NestedClassSubjects {
    data class NestedDataClass(
        val field: String,
    )
    class NestedFinalClass(
        val field: String,
    )
    open class NestedOpenClass(
        val field: String,
    )
    interface NestedInterface
}

sealed class SealedBase

class SealedImpl: SealedBase
