/*
 * 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
// EXPECT NEXT: com.example.Anno: TargetClass.allUseSite.field
// com.example.Anno: TargetClass.delegateUseSite
// EXPECT CURRENT: com.example.Anno: TargetClass.fieldUseSite
// EXPECT NEXT: com.example.Anno: TargetClass.fieldUseSite.field
// 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
// EXPECT NEXT: com.example.Anno: TargetClass.nonParamValAllUseSite.field
// com.example.Anno: TargetClass.nonParamValAllUseSite.nonParamValAllUseSite.getter()
// com.example.Anno: TargetClass.nonParamVarAllUseSite
// EXPECT NEXT: com.example.Anno: TargetClass.nonParamVarAllUseSite.field
// 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
