[FIR] Implement FirNativeSharedImmutableChecker

* INAPPLICABLE_SHARED_IMMUTABLE_PROPERTY
* INAPPLICABLE_SHARED_IMMUTABLE_TOP_LEVEL
This commit is contained in:
Ivan Kochurkin
2022-06-29 17:16:28 +03:00
parent 1bb158e45c
commit 987137cf76
7 changed files with 72 additions and 149 deletions
@@ -1,145 +0,0 @@
// FILE: annotation.kt
package kotlin.native.concurrent
import kotlin.reflect.KProperty
@Target(AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.BINARY)
annotation class SharedImmutable
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class ThreadLocal
// FILE: test.kt
import kotlin.native.concurrent.SharedImmutable
import kotlin.native.concurrent.ThreadLocal
import kotlin.reflect.KProperty
fun println(value: Int) {}
fun println(value: String) {}
fun println(value: Point) {}
data class Point(val x: Double, val y: Double)
@SharedImmutable
val point1 = Point(1.0, 1.0)
@SharedImmutable
var point2 = Point(2.0, 2.0)
class Date(@SharedImmutable val month: Int, @SharedImmutable var day:Int)
class Person(val name: String) {
@SharedImmutable
var surname: String? = null
}
class Figure {
@SharedImmutable
val cornerPoint: Point
get() = point1
}
@SharedImmutable
var age = 20
get() {
println("Age is: $field")
return field
}
set(value) {
println(value)
}
var globalAge = 30
@SharedImmutable
var age1 = 20
get() {
println("Age is: $field")
return field
}
set(value) {
globalAge = value
}
@SharedImmutable
val age2 = 20
get() {
println("Age is: $field")
return field
}
@SharedImmutable
var point3: Point
get() = point2
set(value) {
point2 = value
}
@SharedImmutable
var point4: Point
get() = point2
set(value) {
println(value)
}
@ThreadLocal
var point0 = Point(2.0, 2.0)
@SharedImmutable
var point5: Point
get() = point0
set(value) {
point0 = value
}
class Delegate {
var value = 20
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
println("Get")
return value
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
println("Set")
}
}
@SharedImmutable
var property: Int by Delegate()
class Delegate1 {
var value = 20
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return value
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
this.value = value
}
}
@SharedImmutable
var property1: Int by Delegate1()
var globalValue: Int = 20
class Delegate2 {
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int {
return globalValue
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
println(value)
}
}
@SharedImmutable
var property2: Int by Delegate2()
@SharedImmutable
val someValue: Int
get() = 20
@SharedImmutable
val someValueWithDelegate by Delegate()
@@ -1,3 +1,5 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
// FILE: annotation.kt
package kotlin.native.concurrent
@@ -16,9 +18,9 @@ import kotlin.native.concurrent.SharedImmutable
import kotlin.native.concurrent.ThreadLocal
import kotlin.reflect.KProperty
fun println(<!UNUSED_PARAMETER!>value<!>: Int) {}
fun println(<!UNUSED_PARAMETER!>value<!>: String) {}
fun println(<!UNUSED_PARAMETER!>value<!>: Point) {}
fun println(value: Int) {}
fun println(value: String) {}
fun println(value: Point) {}
data class Point(val x: Double, val y: Double)
@SharedImmutable