From 289f540530dc3f67be4675454e37b47f68dffcfe Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 4 Oct 2022 15:45:21 +0300 Subject: [PATCH] [Commonizer] workaround for CoreGraphics from Xcode 14 --- .../org/jetbrains/kotlin/commonizer/facade.kt | 37 ++++++++++++++++++- .../mergedtree/CirKnownClassifiers.kt | 6 +-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt index d142cabc35b..e7881c03f87 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.commonizer import kotlinx.metadata.klib.ChunkedKlibModuleFragmentWriteStrategy import org.jetbrains.kotlin.commonizer.ResultsConsumer.Status +import org.jetbrains.kotlin.commonizer.cir.CirEntityId import org.jetbrains.kotlin.commonizer.core.CommonizationVisitor import org.jetbrains.kotlin.commonizer.mergedtree.CirClassifierIndex import org.jetbrains.kotlin.commonizer.mergedtree.CirCommonizedClassifierNodes @@ -56,7 +57,7 @@ internal fun commonizeTarget( val classifiers = CirKnownClassifiers( classifierIndices = availableTrees.mapValue(::CirClassifierIndex), targetDependencies = availableTrees.mapValue(CirTreeRoot::dependencies), - commonizedNodes = CirCommonizedClassifierNodes.default(), + commonizedNodes = CirCommonizedClassifierNodes.default(allowedDuplicates = allowedDuplicates), commonDependencies = parameters.dependencyClassifiers(output) ) @@ -98,3 +99,37 @@ internal fun serializeTarget( } parameters.resultsConsumer.targetConsumed(parameters, outputTarget) } + +// iOS, tvOS, watchOS SDKs from Xcode 14 moved some declarations from CoreGraphics to CoreFoundation (CFCGTypes.h). +// Unfortunately (1), for Kotlin/Native cinterop this is a breaking change, so CFCGTypes platform library with `platform.CoreGraphics` +// package was introduced to mitigate this problem. +// Unfortunately (2), macOS SDK does not have this change and commonizer fails on commonizing (macOS, *OS), +// because it was written in assumption that different platform klibs contain different packages. +// We workaround this problem by allowing some classifiers to clash in `CirCommonizedClassifierNodes`. +// Fortunately (1), macOS SDK from Xcode 14.1 should have CFCGTypes.h, so this hack can be removed soon. +// TODO: Remove hack after Xcode 14.1. +private val allowedDuplicates = run { + val cfcgTypesClassifiers = setOf( + "platform/CoreGraphics/CGAffineTransform", + "platform/CoreGraphics/CGAffineTransform.Companion", + "platform/CoreGraphics/CGFloat", + "platform/CoreGraphics/CGFloatVar", + "platform/CoreGraphics/CGPoint", + "platform/CoreGraphics/CGPoint.Companion", + "platform/CoreGraphics/CGRect", + "platform/CoreGraphics/CGRect.Companion", + "platform/CoreGraphics/CGRectEdge", + "platform/CoreGraphics/CGRectEdge.CGRectMaxXEdge", + "platform/CoreGraphics/CGRectEdge.CGRectMaxYEdge", + "platform/CoreGraphics/CGRectEdge.CGRectMinXEdge", + "platform/CoreGraphics/CGRectEdge.CGRectMinYEdge", + "platform/CoreGraphics/CGRectEdge.Companion", + "platform/CoreGraphics/CGRectEdge.Var", + "platform/CoreGraphics/CGRectEdge.Var.Companion", + "platform/CoreGraphics/CGSize", + "platform/CoreGraphics/CGSize.Companion", + "platform/CoreGraphics/CGVector", + "platform/CoreGraphics/CGVector.Companion", + ) + cfcgTypesClassifiers.map { CirEntityId.create(it) }.toSet() +} \ No newline at end of file diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt index 4e5d826a9e5..0f896f4d4cc 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt @@ -29,7 +29,7 @@ interface CirCommonizedClassifierNodes { fun addTypeAliasNode(typeAliasId: CirEntityId, node: CirTypeAliasNode) companion object { - fun default() = object : CirCommonizedClassifierNodes { + fun default(allowedDuplicates: Set = setOf()) = object : CirCommonizedClassifierNodes { private val classNodes = THashMap() private val typeAliases = THashMap() @@ -38,12 +38,12 @@ interface CirCommonizedClassifierNodes { override fun addClassNode(classId: CirEntityId, node: CirClassNode) { val oldNode = classNodes.put(classId, node) - check(oldNode == null) { "Rewriting class node $classId" } + check(oldNode == null || classId in allowedDuplicates) { "Rewriting class node $classId" } } override fun addTypeAliasNode(typeAliasId: CirEntityId, node: CirTypeAliasNode) { val oldNode = typeAliases.put(typeAliasId, node) - check(oldNode == null) { "Rewriting type alias node $typeAliasId" } + check(oldNode == null || typeAliasId in allowedDuplicates) { "Rewriting type alias node $typeAliasId" } } } }