diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/optimisticCommonization/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/optimisticCommonization/build.gradle.kts index 6335532dc8a..df7b6e86f73 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/optimisticCommonization/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/optimisticCommonization/build.gradle.kts @@ -8,6 +8,10 @@ repositories { } kotlin { + compilerOptions { + optIn.add("kotlinx.cinterop.ExperimentalForeignApi") + } + linuxArm64("shortPlatform") { compilations.get("main").cinterops.create("intPropertyInterop") { header(file("libs/shortPlatform.h")) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AbstractFunctionOrPropertyCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AbstractFunctionOrPropertyCommonizer.kt index 3ecda0e5fd5..a6deae24e44 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AbstractFunctionOrPropertyCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AbstractFunctionOrPropertyCommonizer.kt @@ -31,7 +31,7 @@ class FunctionOrPropertyBaseCommonizer( val extensionReceiver: CirExtensionReceiver?, val returnType: CirType, val typeParameters: List, - val additionalAnnotations: List, + val annotations: List, ) override fun invoke(values: List): FunctionOrProperty? { @@ -57,6 +57,9 @@ class FunctionOrPropertyBaseCommonizer( commonizedType = returnType, ) + val annotations = AnnotationsCommonizer.commonize(values.map { it.annotations }).orEmpty() + .plus(listOfNotNull(unsafeNumberAnnotation)) + return FunctionOrProperty( name = values.first().name, kind = values.singleDistinctValueOrNull { it.kind } ?: return null, @@ -65,7 +68,7 @@ class FunctionOrPropertyBaseCommonizer( extensionReceiver = (extensionReceiverCommonizer(values.map { it.extensionReceiver }) ?: return null).receiver, returnType = returnTypeCommonizer(values) ?: return null, typeParameters = TypeParameterListCommonizer(typeCommonizer).commonize(values.map { it.typeParameters }) ?: return null, - additionalAnnotations = listOfNotNull(unsafeNumberAnnotation) + annotations = annotations ) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/FunctionCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/FunctionCommonizer.kt index 2db4b62f074..ceba7ecba5f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/FunctionCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/FunctionCommonizer.kt @@ -16,9 +16,7 @@ class FunctionCommonizer( val functionOrProperty = functionOrPropertyBaseCommonizer(values) ?: return null val valueParametersResult = CallableValueParametersCommonizer(typeCommonizer).commonize(values) ?: return null return CirFunction( - annotations = AnnotationsCommonizer.commonize(values.map { it.annotations.toList() }) - ?.plus(functionOrProperty.additionalAnnotations) - ?: return null, + annotations = functionOrProperty.annotations, name = values.first().name, typeParameters = functionOrProperty.typeParameters, visibility = functionOrProperty.visibility, diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt index cc0eda93a64..e22d55c4aca 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt @@ -29,7 +29,7 @@ class PropertyCommonizer( val constCompileTimeInitializer = (constCommonizationState as? ConstSameValue)?.compileTimeInitializer return CirProperty( - annotations = functionOrPropertyBase.additionalAnnotations, + annotations = functionOrPropertyBase.annotations, name = functionOrPropertyBase.name, typeParameters = functionOrPropertyBase.typeParameters, visibility = functionOrPropertyBase.visibility, diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPropertyCommonizationTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPropertyCommonizationTest.kt index b94eaba8efd..9b6457823c1 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPropertyCommonizationTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/hierarchical/HierarchicalPropertyCommonizationTest.kt @@ -242,4 +242,22 @@ class HierarchicalPropertyCommonizationTest : AbstractInlineSourcesCommonization """.trimIndent() ) } + + fun `test property with annotations`() { + val result = commonize { + outputTarget("(a, b)") + registerDependency("a", "b", "(a, b)") { + source(""" + annotation class A1 + annotation class A2 + annotation class A3 + """.trimIndent()) + } + + simpleSingleSourceTarget("a", """@A1 @A2 @A3 val x: Int = 42""") + simpleSingleSourceTarget("b", """@A1 @A2 val x: Int = 42""") + } + + result.assertCommonized("(a, b)", """@A1 @A2 expect val x: Int""") + } }