/*
 * Copyright 2021 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.
 */

// WITH_RUNTIME
// TEST PROCESSOR: BackingFieldProcessor
// EXPECTED:
// lib.BaseClass.abstractProp_willBeBacked: false
// lib.BaseClass.abstractProp_wontBeBacked: false
// lib.BaseClass.lateinit_var_1: true
// lib.BaseClass.lateinit_var_2: true
// lib.BaseClass.notOverriddenAbstractProp: true
// lib.BaseClass.overriddenBaseProp_willBeBacked: true
// lib.BaseClass.overriddenBaseProp_wontBeBacked: true
// lib.ChildClass.abstractProp_willBeBacked: true
// lib.ChildClass.abstractProp_wontBeBacked: false
// lib.ChildClass.interfaceProp_willBeBacked: true
// lib.ChildClass.interfaceProp_wontBeBacked: false
// lib.ChildClass.lateinit_var_1: false
// lib.ChildClass.lateinit_var_2: true
// lib.ChildClass.lateinit_var_3: true
// lib.ChildClass.overriddenBaseProp_willBeBacked: true
// lib.ChildClass.overriddenBaseProp_wontBeBacked: false
// lib.ConstructorSetProp.propSetInConstructor: true
// lib.DataClass.value_Param: true
// lib.DataClass.variable_Param: true
// lib.JavaClass.javaField: true
// lib.JavaClass.javaFieldWithAccessors: true
// lib.MyInterface.interfaceProp_willBeBacked: false
// lib.MyInterface.interfaceProp_wontBeBacked: false
// lib.MyInterface.lateinit_var_3: false
// lib.NormalClass.Companion.companionVar: true
// lib.NormalClass.Companion.companion_noBackingVal: false
// lib.NormalClass.Companion.companion_noBackingVar: false
// lib.NormalClass.Companion.companion_withBackingAndGetter: true
// lib.NormalClass.Companion.staticVar: true
// lib.NormalClass.Companion.static_noBackingVal: false
// lib.NormalClass.Companion.static_noBackingVar: false
// lib.NormalClass.Companion.static_withBackingAndGetter: true
// lib.NormalClass.jvmField_withBacking: true
// lib.NormalClass.lateinit_var: true
// lib.NormalClass.value: true
// lib.NormalClass.value_Param: true
// lib.NormalClass.value_noBacking: false
// lib.NormalClass.value_withBacking: true
// lib.NormalClass.variable: true
// lib.NormalClass.variable_Param: true
// lib.NormalClass.variable_noBacking: false
// lib.NormalClass.variable_withBacking: true
// lib.lateinit_var: true
// lib.value: true
// lib.value_noBacking: false
// lib.value_withBacking: true
// lib.variable: true
// lib.variable_noBacking: false
// lib.variable_withBacking: true
// main.BaseClass.abstractProp_willBeBacked: false
// main.BaseClass.abstractProp_wontBeBacked: false
// main.BaseClass.lateinit_var_1: true
// main.BaseClass.lateinit_var_2: true
// main.BaseClass.notOverriddenAbstractProp: true
// main.BaseClass.overriddenBaseProp_willBeBacked: true
// main.BaseClass.overriddenBaseProp_wontBeBacked: true
// main.ChildClass.abstractProp_willBeBacked: true
// main.ChildClass.abstractProp_wontBeBacked: false
// main.ChildClass.interfaceProp_willBeBacked: true
// main.ChildClass.interfaceProp_wontBeBacked: false
// main.ChildClass.lateinit_var_1: false
// main.ChildClass.lateinit_var_2: true
// main.ChildClass.lateinit_var_3: true
// main.ChildClass.overriddenBaseProp_willBeBacked: true
// main.ChildClass.overriddenBaseProp_wontBeBacked: false
// main.ConstructorSetProp.propSetInConstructor: true
// main.DataClass.value_Param: true
// main.DataClass.variable_Param: true
// main.JavaClass.javaField: true
// main.JavaClass.javaFieldWithAccessors: true
// main.MyInterface.interfaceProp_willBeBacked: false
// main.MyInterface.interfaceProp_wontBeBacked: false
// main.MyInterface.lateinit_var_3: false
// main.NormalClass.Companion.companionVar: true
// main.NormalClass.Companion.companion_noBackingVal: false
// main.NormalClass.Companion.companion_noBackingVar: false
// main.NormalClass.Companion.companion_withBackingAndGetter: true
// main.NormalClass.Companion.staticVar: true
// main.NormalClass.Companion.static_noBackingVal: false
// main.NormalClass.Companion.static_noBackingVar: false
// main.NormalClass.Companion.static_withBackingAndGetter: true
// main.NormalClass.lateinit_var: true
// main.NormalClass.value: true
// main.NormalClass.value_Param: true
// main.NormalClass.value_noBacking: false
// main.NormalClass.value_withBacking: true
// main.NormalClass.variable: true
// main.NormalClass.variable_Param: true
// main.NormalClass.variable_noBacking: false
// main.NormalClass.variable_withBacking: true
// main.lateinit_var: true
// main.value: true
// main.value_noBacking: false
// main.value_withBacking: true
// main.variable: true
// main.variable_noBacking: false
// main.variable_withBacking: true
// END

// MODULE: lib
// FILE: lib.kt
package lib

val value: String = ""
var variable: String = ""
val value_noBacking: String
    get() = "aa"
var variable_noBacking: String
    get() = "aa"
    set(value) {}
val value_withBacking: String = ""
    get() = field
var variable_withBacking: String? = null
    get() = field
lateinit var lateinit_var: String

data class DataClass(
    val value_Param: String,
    var variable_Param: String
)

class NormalClass(
    val value_Param: String,
    var variable_Param: String,
    normalParam: String
) {
    val value: String = ""
    var variable: String = ""
    val value_noBacking: String
        get() = "aa"
    var variable_noBacking: String
        get() = "aa"
        set(value) {}
    val value_withBacking: String = ""
        get() = field
    var variable_withBacking: String? = null
        get() = field
    val jvmField_withBacking: String = ""
    lateinit var lateinit_var: String

    companion object {
        @JvmStatic
        var staticVar: String = ""
        @JvmStatic
        val static_withBackingAndGetter: String = ""
            get() = field
        @JvmStatic
        val static_noBackingVal: String
            get() = ""
        @JvmStatic
        var static_noBackingVar: String
            get() = ""
            set(value) {}
        var companionVar: String = ""
        val companion_withBackingAndGetter: String = ""
            get() = field
        @JvmStatic
        val companion_noBackingVal: String
            get() = ""
        @JvmStatic
        var companion_noBackingVar: String
            get() = ""
            set(value) {}
    }
}

abstract class BaseClass {
    open val overriddenBaseProp_willBeBacked: String = ""
    open val overriddenBaseProp_wontBeBacked: String = ""
    open val notOverriddenAbstractProp: String = ""
    abstract val abstractProp_willBeBacked: String
    abstract val abstractProp_wontBeBacked: String
    open lateinit var lateinit_var_1: String
    open lateinit var lateinit_var_2: String
}

interface MyInterface {
    val interfaceProp_willBeBacked: String
    val interfaceProp_wontBeBacked: String
    var lateinit_var_3: String
}

class ChildClass: BaseClass(), MyInterface {
    override val overriddenBaseProp_willBeBacked: String = ""
    override val overriddenBaseProp_wontBeBacked: String
        get() = ""
    override val abstractProp_willBeBacked: String = ""
    override val abstractProp_wontBeBacked: String
        get() = ""
    override val interfaceProp_willBeBacked: String = ""
    override val interfaceProp_wontBeBacked: String
        get() = ""
    override var lateinit_var_1: String
        get() = ""
        set(v: String) = Unit
    override var lateinit_var_2: String = ""
    override lateinit var lateinit_var_3: String
}

class ConstructorSetProp {
    private val propSetInConstructor: Boolean
    constructor(propSetInConstructor: Boolean) {
        this.propSetInConstructor = propSetInConstructor
    }
}

// FILE: lib/JavaClass.java
package lib;
public class JavaClass {
    private String javaField;
    private String javaFieldWithAccessors;

    public String getJavaFieldWithAccessors()
    { return ""; }
    public void setJavaFieldWithAccessors(String value )
    {}

    public String getJavaAccessorWithoutField()
    { return ""; }
    public void setJavaAccessorWithoutField(String value )
    {}
}

// MODULE: main(lib)
// FILE: main.kt
package main
val value: String = ""
var variable: String = ""
val value_noBacking: String
    get() = "aa"
var variable_noBacking: String
    get() = "aa"
    set(value) {}
val value_withBacking: String = ""
    get() = field
var variable_withBacking: String? = null
    get() = field
lateinit var lateinit_var: String

data class DataClass(
    val value_Param: String,
    var variable_Param: String
)

class NormalClass(
    val value_Param: String,
    var variable_Param: String,
    normalParam: String
) {
    val value: String = ""
    var variable: String = ""
    val value_noBacking: String
        get() = "aa"
    var variable_noBacking: String
        get() = "aa"
        set(value) {}
    val value_withBacking: String = ""
        get() = field
    var variable_withBacking: String? = null
        get() = field
    lateinit var lateinit_var: String

    companion object {
        @JvmStatic
        var staticVar: String = ""
        @JvmStatic
        val static_withBackingAndGetter: String = ""
            get() = field
        @JvmStatic
        val static_noBackingVal: String
            get() = ""
        @JvmStatic
        var static_noBackingVar: String
            get() = ""
            set(value) {}
        var companionVar: String = ""
        val companion_withBackingAndGetter: String = ""
            get() = field
        @JvmStatic
        val companion_noBackingVal: String
            get() = ""
        @JvmStatic
        var companion_noBackingVar: String
            get() = ""
            set(value) {}
    }
}

abstract class BaseClass {
    open val overriddenBaseProp_willBeBacked: String = ""
    open val overriddenBaseProp_wontBeBacked: String = ""
    open val notOverriddenAbstractProp: String = ""
    abstract val abstractProp_willBeBacked: String
    abstract val abstractProp_wontBeBacked: String
    open lateinit var lateinit_var_1: String
    open lateinit var lateinit_var_2: String
}

interface MyInterface {
    val interfaceProp_willBeBacked: String
    val interfaceProp_wontBeBacked: String
    var lateinit_var_3: String
}

class ChildClass: BaseClass(), MyInterface {
    override val overriddenBaseProp_willBeBacked: String = ""
    override val overriddenBaseProp_wontBeBacked: String
        get() = ""
    override val abstractProp_willBeBacked: String = ""
    override val abstractProp_wontBeBacked: String
        get() = ""
    override val interfaceProp_willBeBacked: String = ""
    override val interfaceProp_wontBeBacked: String
        get() = ""
    override var lateinit_var_1: String
        get() = ""
        set(v: String) = Unit
    override var lateinit_var_2: String = ""
    override lateinit var lateinit_var_3: String
}

class ConstructorSetProp {
    private val propSetInConstructor: Boolean
    constructor(propSetInConstructor: Boolean) {
        this.propSetInConstructor = propSetInConstructor
    }
}

// FILE: main/JavaClass.java
package main;
public class JavaClass {
    private String javaField;
    private String javaFieldWithAccessors;

    public String getJavaFieldWithAccessors()
    { return ""; }
    public void setJavaFieldWithAccessors(String value )
    {}

    public String getJavaAccessorWithoutField()
    { return ""; }
    public void setJavaAccessorWithoutField(String value )
    {}
}
