Skip to content

Commit

Permalink
KT-74600 Include ExperimentalAtomicApi when serializing builtins
Browse files Browse the repository at this point in the history
When an annotation class is not resolved,
the current builtin compilation pipeline ignores it.
For common atomic types it led to ExperimentalAtomicApi being missed
on JVM (meaning that users can use experimental atomic types
without an explicit opt-in).
This change fixes the problem by including the
annotation source file during builtin serialization.

^KT-74600

Co-authored-by: vladislavgrecko <[email protected]>
Merge-request: KT-MR-19780
Merged-by: Filipp Zhinkin <[email protected]>
  • Loading branch information
2 people authored and Space Team committed Jan 22, 2025
1 parent 1e00112 commit 68074a7
Show file tree
Hide file tree
Showing 26 changed files with 105 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

package kotlin.concurrent.atomics

@kotlin.SinceKotlin public final class AtomicArray<T> {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicArray<T> {
public constructor(array: kotlin.Array<T>) { /* compiled code */ }

public final val size: kotlin.Int /* compiled code */
Expand All @@ -21,7 +21,7 @@ package kotlin.concurrent.atomics
public open fun toString(): kotlin.String { /* compiled code */ }
}

@kotlin.SinceKotlin public final class AtomicBoolean public constructor(value: kotlin.Boolean) {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicBoolean public constructor(value: kotlin.Boolean) {
public final fun load(): kotlin.Boolean { /* compiled code */ }

public final fun store(newValue: kotlin.Boolean): kotlin.Unit { /* compiled code */ }
Expand All @@ -35,7 +35,7 @@ package kotlin.concurrent.atomics
public open fun toString(): kotlin.String { /* compiled code */ }
}

@kotlin.SinceKotlin public final class AtomicInt public constructor(value: kotlin.Int) {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicInt public constructor(value: kotlin.Int) {
public final fun load(): kotlin.Int { /* compiled code */ }

public final fun store(newValue: kotlin.Int): kotlin.Unit { /* compiled code */ }
Expand All @@ -53,7 +53,7 @@ package kotlin.concurrent.atomics
public open fun toString(): kotlin.String { /* compiled code */ }
}

@kotlin.SinceKotlin public final class AtomicIntArray {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicIntArray {
public constructor(size: kotlin.Int) { /* compiled code */ }

public constructor(array: kotlin.IntArray) { /* compiled code */ }
Expand All @@ -78,7 +78,7 @@ package kotlin.concurrent.atomics
public open fun toString(): kotlin.String { /* compiled code */ }
}

@kotlin.SinceKotlin public final class AtomicLong public constructor(value: kotlin.Long) {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicLong public constructor(value: kotlin.Long) {
public final fun load(): kotlin.Long { /* compiled code */ }

public final fun store(newValue: kotlin.Long): kotlin.Unit { /* compiled code */ }
Expand All @@ -96,7 +96,7 @@ package kotlin.concurrent.atomics
public open fun toString(): kotlin.String { /* compiled code */ }
}

@kotlin.SinceKotlin public final class AtomicLongArray {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicLongArray {
public constructor(size: kotlin.Int) { /* compiled code */ }

public constructor(array: kotlin.LongArray) { /* compiled code */ }
Expand All @@ -121,7 +121,7 @@ package kotlin.concurrent.atomics
public open fun toString(): kotlin.String { /* compiled code */ }
}

@kotlin.SinceKotlin public final class AtomicReference<T> public constructor(value: T) {
@kotlin.SinceKotlin @kotlin.concurrent.atomics.ExperimentalAtomicApi public final class AtomicReference<T> public constructor(value: T) {
public final fun load(): T { /* compiled code */ }

public final fun store(newValue: T): kotlin.Unit { /* compiled code */ }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FILE: KotlinClass.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public open class KotlinClass : R|kotlin/Any| {
public constructor(): R|KotlinClass| {
super<R|kotlin/Any|>()
Expand All @@ -12,6 +13,7 @@ FILE: KotlinClass.kt

}
FILE: test.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public final class KotlinChildWithFakeOverride : R|JavaClassWithFakeOverride| {
public constructor(): R|KotlinChildWithFakeOverride| {
super<R|JavaClassWithFakeOverride|>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// WITH_STDLIB

// FILE: KotlinClass.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt

open class KotlinClass {
Expand All @@ -15,6 +18,9 @@ open class KotlinClass {
public class JavaClassWithFakeOverride extends KotlinClass {}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClassWithFakeOverride
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.atomics.AtomicInt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FILE: test.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public final class KotlinClassWithFakeOverride : R|JavaClass| {
public constructor(): R|KotlinClassWithFakeOverride| {
super<R|JavaClass|>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ public class JavaClass {
}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClass
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.atomics.AtomicInt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FILE: KotlinClass.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public open class KotlinClass : R|kotlin/Any| {
public constructor(): R|KotlinClass| {
super<R|kotlin/Any|>()
Expand All @@ -12,6 +13,7 @@ FILE: KotlinClass.kt

}
FILE: test.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public final fun usage(x: R|JavaClassWithFakeOverride|): R|kotlin/Unit| {
R|<local>/x|.R|/KotlinClass.foo|(R|kotlin/concurrent/atomics/AtomicInt.AtomicInt|(Int(0)))
R|<local>/x|.R|/KotlinClass.foo<Inapplicable(INAPPLICABLE): /KotlinClass.foo>#|(R|java/util/concurrent/atomic/AtomicInteger.AtomicInteger|(Int(0)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// WITH_STDLIB

// FILE: KotlinClass.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt

open class KotlinClass {
Expand All @@ -15,6 +18,9 @@ open class KotlinClass {
public class JavaClassWithFakeOverride extends KotlinClass { }

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClassWithFakeOverride
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.atomics.AtomicInt
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FILE: KotlinClass.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public open class KotlinClass : R|kotlin/Any| {
public constructor(): R|KotlinClass| {
super<R|kotlin/Any|>()
Expand All @@ -9,6 +10,7 @@ FILE: KotlinClass.kt

}
FILE: test.kt
@FILE:R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/concurrent/atomics/ExperimentalAtomicApi|)))
public final fun usage(a: R|JavaClass|): R|kotlin/Unit| {
R|<local>/a|.R|/JavaClass.foo|(Q|java/util/concurrent/atomic|.R|java/util/concurrent/atomic/AtomicReference.AtomicReference|<R|kotlin/String!|>(String()))
R|<local>/a|.R|/JavaClass.foo<Inapplicable(INAPPLICABLE): /JavaClass.foo>#|(R|kotlin/concurrent/atomics/AtomicReference.AtomicReference|<R|kotlin/Int|>(Int(1)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// WITH_STDLIB

// FILE: KotlinClass.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

open class KotlinClass {
Expand All @@ -18,6 +21,9 @@ public class JavaClass extends KotlinClass {
}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun usage(a: JavaClass) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
// WITH_STDLIB

// FILE: KotlinInterface.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt

interface KotlinInterface {
Expand Down Expand Up @@ -47,6 +50,9 @@ public class JavaIntersectionWithExplicitOverride extends JavaClass implements K
}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClass
import kotlin.concurrent.atomics.AtomicInt
import java.util.concurrent.atomic.AtomicInteger
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
// WITH_STDLIB

// FILE: KotlinClass.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt

open class KotlinClass {
Expand All @@ -16,6 +19,9 @@ open class KotlinClass {
public class JavaClassWithFakeOverride extends KotlinClass {}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClassWithFakeOverride
import kotlin.concurrent.atomics.*

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ public class JavaBase {
}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt
import java.util.concurrent.atomic.AtomicInteger

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
// WITH_STDLIB

// FILE: KotlinClass.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt

open class KotlinClass {
Expand All @@ -28,6 +31,9 @@ public class JavaClassWithExplicitOverride extends KotlinClass {
}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClassWithExplicitOverride
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.atomics.AtomicInt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
public class JavaOverloadsChild extends OverloadsWithAtomicIntAndInteger { }

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaOverloadsChild
import kotlin.concurrent.atomics.AtomicInt
import java.util.concurrent.atomic.AtomicInteger
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ public class JavaClass {
}

// FILE: test.kt

@file:OptIn(ExperimentalAtomicApi::class)

import JavaClass
import kotlin.concurrent.atomics.asKotlinAtomic
import kotlin.concurrent.atomics.asKotlinAtomicArray
Expand All @@ -26,7 +29,6 @@ class KotlinClass {
}
}

@OptIn(ExperimentalAtomicApi::class)
fun usage(a: KotlinClass): String {
return a.foo(JavaClass().a.asKotlinAtomic())+ a.bar(JavaClass().b.asKotlinAtomicArray())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ fun testTypealiasedJava() {

// FILE: K.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun testKotlin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ fun testTypealiasedJava() {

// FILE: K.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun testKotlin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
// MODULE: common
// FILE: C.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun commonTestKotlin() {
Expand Down Expand Up @@ -33,6 +35,8 @@ fun commonTypealiasedKotlin() {
// MODULE: jvm()()(common)
// FILE: K.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun testKotlin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
// MODULE: common
// FILE: C.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun commonTestKotlin() {
Expand Down Expand Up @@ -33,6 +35,8 @@ fun commonTypealiasedKotlin() {
// MODULE: jvm()()(common)
// FILE: K.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun testKotlin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
// MODULE: common
// FILE: C.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun commonTestKotlin() {
Expand Down Expand Up @@ -33,6 +35,8 @@ fun commonTypealiasedKotlin() {
// MODULE: jvm()()(common)
// FILE: K.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicReference

fun testKotlin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
// MODULE: m1-common
// FILE: common.kt
import kotlin.concurrent.atomics.AtomicInt
import kotlin.concurrent.atomics.<!UNRESOLVED_REFERENCE!>ExperimentalAtomicApi<!>
import kotlin.concurrent.atomics.ExperimentalAtomicApi

<!OPT_IN_WITHOUT_ARGUMENTS!>@OptIn(<!ANNOTATION_ARGUMENT_MUST_BE_CONST!><!UNRESOLVED_REFERENCE!>ExperimentalAtomicApi<!>::class<!>)<!>
@OptIn(ExperimentalAtomicApi::class)
expect class Foo {
fun test(a: AtomicInt): AtomicInt
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// WITH_STDLIB

// FILE: KotlinClass.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import kotlin.concurrent.atomics.AtomicInt

open class KotlinClass {
Expand All @@ -22,6 +25,9 @@ public class JavaClassWithExplicitOverride extends KotlinClass {
}

// FILE: test.kt

@file:OptIn(kotlin.concurrent.atomics.ExperimentalAtomicApi::class)

import JavaClassWithExplicitOverride
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.atomics.AtomicInt
Expand Down
Loading

0 comments on commit 68074a7

Please sign in to comment.