diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt index e8001fcf74a..edb27b49e84 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt @@ -7,9 +7,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner -import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode +import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode import org.jetbrains.kotlin.descriptors.commonizer.utils.intern +import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderStandardKotlinPackages import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.* @@ -64,6 +65,12 @@ internal fun checkSupportedInCommonization(constantValue: ConstantValue<*>, loca is EnumValue -> { // OK } + is AnnotationValue -> { + if (constantValue.value.fqName?.isUnderStandardKotlinPackages != true) + error("Only ${constantValue::class.java} const values from Kotlin standard packages are supported, $constantValue at ${location()}") + + Unit + } is ArrayValue -> { constantValue.value.forEachIndexed { index, innerConstantValue -> checkSupportedInCommonization(innerConstantValue) { "${location()}[$index]" } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt index e796a57b68a..97848bb385b 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.core.Commonizer import org.jetbrains.kotlin.descriptors.commonizer.utils.* import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameWithTypeParameters import org.jetbrains.kotlin.descriptors.commonizer.utils.isBlacklistedDarwinFunction -import org.jetbrains.kotlin.descriptors.commonizer.utils.isDeprecated +import org.jetbrains.kotlin.descriptors.commonizer.utils.isDeprecatedTopLevelFunction import org.jetbrains.kotlin.descriptors.commonizer.utils.isKniBridgeFunction import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -57,7 +57,7 @@ internal inline fun FunctionCollector( ): (DeclarationDescriptor) -> Boolean = Collector { candidate -> if (candidate.kind.isReal && !candidate.isKniBridgeFunction() - && !candidate.isDeprecated() + && !candidate.isDeprecatedTopLevelFunction() && !candidate.isBlacklistedDarwinFunction() ) { typedCollector(candidate) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt index c089090d4e2..b59109b6a37 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt @@ -15,8 +15,8 @@ private val DEPRECATED_ANNOTATION_FQN = FqName(Deprecated::class.java.name) internal fun SimpleFunctionDescriptor.isKniBridgeFunction() = name.asString().startsWith("kniBridge") -internal fun SimpleFunctionDescriptor.isDeprecated() = - annotations.hasAnnotation(DEPRECATED_ANNOTATION_FQN) +internal fun SimpleFunctionDescriptor.isDeprecatedTopLevelFunction() = + containingDeclaration is PackageFragmentDescriptor && annotations.hasAnnotation(DEPRECATED_ANNOTATION_FQN) // the following logic determines Kotlin functions with conflicting overloads in Darwin library: internal fun SimpleFunctionDescriptor.isBlacklistedDarwinFunction(): Boolean { diff --git a/native/commonizer/testData/functionCommonization/specifics/commonized/common/package_root.kt b/native/commonizer/testData/functionCommonization/specifics/commonized/common/package_root.kt index 43d5aa82a9f..4711ca2507e 100644 --- a/native/commonizer/testData/functionCommonization/specifics/commonized/common/package_root.kt +++ b/native/commonizer/testData/functionCommonization/specifics/commonized/common/package_root.kt @@ -16,3 +16,8 @@ expect fun externalFunction2() expect inline fun inlineFunction1() {} expect fun inlineFunction2() {} + +expect class Holder() { + expect fun deprecatedFunction1() + expect fun nonDeprecatedFunction1() +} diff --git a/native/commonizer/testData/functionCommonization/specifics/commonized/js/package_root.kt b/native/commonizer/testData/functionCommonization/specifics/commonized/js/package_root.kt index b4d1d29b05b..c07798f3e7d 100644 --- a/native/commonizer/testData/functionCommonization/specifics/commonized/js/package_root.kt +++ b/native/commonizer/testData/functionCommonization/specifics/commonized/js/package_root.kt @@ -17,3 +17,13 @@ actual external fun externalFunction2() actual inline fun inlineFunction1() {} actual inline fun inlineFunction2() {} + +actual class Holder actual constructor() { + @Deprecated("This function is deprecated") + actual fun deprecatedFunction1() {} + @Deprecated("This function is deprecated") + fun deprecatedFunction2() {} + + actual fun nonDeprecatedFunction1() {} + fun nonDeprecatedFunction2() {} +} diff --git a/native/commonizer/testData/functionCommonization/specifics/commonized/jvm/package_root.kt b/native/commonizer/testData/functionCommonization/specifics/commonized/jvm/package_root.kt index 9559cf2288a..0eb81473183 100644 --- a/native/commonizer/testData/functionCommonization/specifics/commonized/jvm/package_root.kt +++ b/native/commonizer/testData/functionCommonization/specifics/commonized/jvm/package_root.kt @@ -17,3 +17,13 @@ actual fun externalFunction2() {} actual inline fun inlineFunction1() {} actual fun inlineFunction2() {} + +actual class Holder actual constructor() { + @Deprecated("This function is deprecated") + actual fun deprecatedFunction1() {} + @Deprecated("This function is deprecated") + fun deprecatedFunction3() {} + + actual fun nonDeprecatedFunction1() {} + fun nonDeprecatedFunction3() {} +} diff --git a/native/commonizer/testData/functionCommonization/specifics/original/js/package_root.kt b/native/commonizer/testData/functionCommonization/specifics/original/js/package_root.kt index b7be16676e1..b0580e2367c 100644 --- a/native/commonizer/testData/functionCommonization/specifics/original/js/package_root.kt +++ b/native/commonizer/testData/functionCommonization/specifics/original/js/package_root.kt @@ -18,7 +18,17 @@ external fun externalFunction2() inline fun inlineFunction1() {} inline fun inlineFunction2() {} -@Deprecated +@Deprecated("This function is deprecated") fun deprecatedFunction1() {} -@Deprecated +@Deprecated("This function is deprecated") fun deprecatedFunction2() {} + +class Holder { + @Deprecated("This function is deprecated") + fun deprecatedFunction1() {} + @Deprecated("This function is deprecated") + fun deprecatedFunction2() {} + + fun nonDeprecatedFunction1() {} + fun nonDeprecatedFunction2() {} +} diff --git a/native/commonizer/testData/functionCommonization/specifics/original/jvm/package_root.kt b/native/commonizer/testData/functionCommonization/specifics/original/jvm/package_root.kt index 58f31ed2baf..9bd00b7f5fa 100644 --- a/native/commonizer/testData/functionCommonization/specifics/original/jvm/package_root.kt +++ b/native/commonizer/testData/functionCommonization/specifics/original/jvm/package_root.kt @@ -18,7 +18,17 @@ fun externalFunction2() {} inline fun inlineFunction1() {} fun inlineFunction2() {} -@Deprecated +@Deprecated("This function is deprecated") fun deprecatedFunction1() {} -@Deprecated +@Deprecated("This function is deprecated") fun deprecatedFunction3() {} + +class Holder { + @Deprecated("This function is deprecated") + fun deprecatedFunction1() {} + @Deprecated("This function is deprecated") + fun deprecatedFunction3() {} + + fun nonDeprecatedFunction1() {} + fun nonDeprecatedFunction3() {} +}