/*
 * Copyright 2026 Google LLC
 * Copyright 2010-2026 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: GetSymbolsWithAnnotationProcessor
// PROCESSOR INPUT: com.example.Anno, com.example.FileAnno
// EXPECTED:
// com.example.Anno: TargetClass
// com.example.Anno: TargetClass.<init>.allUseSite
// com.example.Anno: TargetClass.<init>.noUseSite
// com.example.Anno: TargetClass.<init>.paramAndPropertyUseSite
// com.example.Anno: TargetClass.<init>.paramUseSite
// com.example.Anno: TargetClass.allUseSite
// com.example.Anno: TargetClass.allUseSite.allUseSite.getter()
// com.example.Anno: TargetClass.allUseSite.allUseSite.setter()
// com.example.Anno: TargetClass.allUseSite.allUseSite.setter().value
// com.example.Anno: TargetClass.delegateUseSite
// com.example.Anno: TargetClass.fieldUseSite
// com.example.Anno: TargetClass.getAndSetUseSite.getAndSetUseSite.getter()
// com.example.Anno: TargetClass.getAndSetUseSite.getAndSetUseSite.setter()
// com.example.Anno: TargetClass.getterUseSite.getterUseSite.getter()
// com.example.Anno: TargetClass.noUseSite
// com.example.Anno: TargetClass.nonParamValAllUseSite
// com.example.Anno: TargetClass.nonParamValAllUseSite.nonParamValAllUseSite.getter()
// com.example.Anno: TargetClass.nonParamVarAllUseSite
// com.example.Anno: TargetClass.nonParamVarAllUseSite.nonParamVarAllUseSite.getter()
// com.example.Anno: TargetClass.nonParamVarAllUseSite.nonParamVarAllUseSite.setter()
// com.example.Anno: TargetClass.nonParamVarAllUseSite.nonParamVarAllUseSite.setter().value
// com.example.Anno: TargetClass.paramAndPropertyUseSite
// com.example.Anno: TargetClass.propertyUseSite
// com.example.Anno: TargetClass.setParamUseSiteOnSetParam.setParamUseSiteOnSetParam.setter().boolSetterParameter
// com.example.Anno: TargetClass.setParamUseSiteOnVar.setParamUseSiteOnVar.setter().value
// com.example.Anno: TargetClass.setterUseSite.setterUseSite.setter()
// com.example.Anno: nothingFun.ReceiverFunClass
// com.example.Anno: nothingProp.ReceiverPropClass
// com.example.FileAnno: File: TargetFile.kt
// END

// FILE: Anno.kt

package com.example

annotation class Anno
annotation class FileAnno

// FILE: TargetFile.kt

@file:FileAnno

import com.example.Anno
import com.example.FileAnno

@Anno
class TargetClass(
    @Anno val noUseSite: Int,
    @param:Anno val paramUseSite: String,
    @property:Anno val propertyUseSite: Boolean,
    @get:Anno val getterUseSite: Boolean,
    @set:Anno var setterUseSite: Boolean,
    @get:Anno @set:Anno var getAndSetUseSite: Boolean,
    @field:Anno val fieldUseSite: Float,
    @all:Anno var allUseSite: Char,
    @param:Anno @property:Anno val paramAndPropertyUseSite: Long,
) {

    @all:Anno
    var nonParamVarAllUseSite: String

    @all:Anno
    val nonParamValAllUseSite: String

    @setparam:Anno
    var setParamUseSiteOnVar = 42

    var setParamUseSiteOnSetParam: Boolean
        set(@setparam:Anno boolSetterParameter) {
            field = boolSetterParameter
        }

    @delegate:Anno val delegateUseSite: Boolean by lazy { true }
}

class ReceiverFunClass

class ReceiverPropClass

@receiver:Anno
fun ReceiverFunClass.nothingFun() {}

@receiver:Anno
val ReceiverPropClass.nothingProp: Unit get() = Unit
