/*
 * 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: ImplicitElementProcessor
// EXPECTED:
// <init>; origin: SYNTHETIC
// synthetic constructor for Cls
// <null>
// <null>
// <init>,<init>,<init>
// readOnly.get(): SYNTHETIC annotations from property: GetAnno
// readOnly.getter.owner: readOnly: KOTLIN
// readWrite.get(): KOTLIN
// readWrite.set(): SYNTHETIC annotations from property: SetAnno
// <init>
// comp1.get(): SYNTHETIC
// comp2.get(): SYNTHETIC
// comp2.set(): SYNTHETIC
// <init>
// synthetic constructor for ImplictConstructorJava
// EXPECT CURRENT: Test, p: [MyKotlinAnnotation: null, MyJavaAnnotation: null]
// EXPECT CURRENT: lib.Test, p: [MyKotlinAnnotation: null, MyJavaAnnotation: null]
// EXPECT NEXT: Test, p: [MyKotlinAnnotation: null]
// EXPECT NEXT: Test, field: [MyJavaAnnotation: null]
// EXPECT NEXT: lib.Test, p: [MyKotlinAnnotation: null]
// EXPECT NEXT: lib.Test, field: [MyJavaAnnotation: FIELD]
// END
// MODULE: lib
// FILE: lib/MyJavaAnnotation.java
package lib;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.MODULE;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({FIELD})
public @interface MyJavaAnnotation {}

// FILE: lib/MyKotlinAnnotation.kt
package lib
@Target(AnnotationTarget.PROPERTY)
annotation class MyKotlinAnnotation

// FILE: lib/Test.kt
package lib
class Test(
    @MyKotlinAnnotation
    @MyJavaAnnotation
    val p: Int
)

// MODULE: main(lib)
// FILE: Test.kt
import lib.*
class Test(
    @MyKotlinAnnotation
    @MyJavaAnnotation
    val p: Int
)
// FILE: a.kt
annotation class GetAnno
annotation class SetAnno

class Cls {
    @get:GetAnno
    val readOnly: Int = 1

    @set:SetAnno
    var readWrite: Int = 2
    get() = 1
}

data class Data(@get:GetAnno val comp1: Int, var comp2: Int)

class ClassWithoutImplicitPrimaryConstructor : ITF {
    constructor(x: Int)
}

interface ITF

// FILE: JavaClass.java
public class JavaClass {
    public JavaClass() { this(1); }
    public JavaClass(int a) { this(a, "ok"); }
    public JavaClass(int a, String s) { }
}

// FILE:ImplictConstructorJava.java

public class ImplictConstructorJava {

}
