From 8a816adcbe77096026abeb5051113a8d0062acaa Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 4 Jul 2019 18:41:15 +0700 Subject: [PATCH] Skip elements for which we cannot generate bridge. --- .../native/interop/gen/StubIrBridgeBuilder.kt | 44 ++++++++++++------- .../native/interop/gen/StubIrBuilder.kt | 25 ++++------- .../kotlin/native/interop/gen/StubIrDriver.kt | 8 ++-- .../native/interop/gen/StubIrTextEmitter.kt | 4 ++ .../kotlin/native/interop/gen/jvm/main.kt | 10 ++++- 5 files changed, 52 insertions(+), 39 deletions(-) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt index 5644e5317dc..6eb7624da22 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt @@ -12,7 +12,8 @@ class BridgeBuilderResult( val kotlinFile: KotlinFile, val nativeBridges: NativeBridges, val propertyAccessorBridgeBodies: Map, - val functionBridgeBodies: Map> + val functionBridgeBodies: Map>, + val excludedStubs: Set ) /** @@ -64,6 +65,7 @@ class StubIrBridgeBuilder( private val propertyAccessorBridgeBodies = mutableMapOf() private val functionBridgeBodies = mutableMapOf>() + private val excludedStubs = mutableSetOf() private val bridgeGeneratingVisitor = object : StubIrVisitor { override fun visitClass(element: ClassStub, owner: StubContainer?) { @@ -83,11 +85,16 @@ class StubIrBridgeBuilder( } override fun visitFunction(element: FunctionStub, owner: StubContainer?) { - when { - element.external -> tryProcessCCallAnnotation(element) - element.isOptionalObjCMethod() -> {} - owner != null && owner.isInterface -> {} - else -> generateBridgeBody(element) + try { + when { + element.external -> tryProcessCCallAnnotation(element) + element.isOptionalObjCMethod() -> { } + owner != null && owner.isInterface -> { } + else -> generateBridgeBody(element) + } + } catch (e: Throwable) { + context.log("Warning: cannot generate bridge for ${element.name}.") + excludedStubs += element } } @@ -106,15 +113,21 @@ class StubIrBridgeBuilder( } override fun visitProperty(element: PropertyStub, owner: StubContainer?) { - when (val kind = element.kind) { - is PropertyStub.Kind.Constant -> { } - is PropertyStub.Kind.Val -> { - visitPropertyAccessor(kind.getter, owner) - } - is PropertyStub.Kind.Var -> { - visitPropertyAccessor(kind.getter, owner) - visitPropertyAccessor(kind.setter, owner) + try { + when (val kind = element.kind) { + is PropertyStub.Kind.Constant -> { + } + is PropertyStub.Kind.Val -> { + visitPropertyAccessor(kind.getter, owner) + } + is PropertyStub.Kind.Var -> { + visitPropertyAccessor(kind.getter, owner) + visitPropertyAccessor(kind.setter, owner) + } } + } catch (e: Throwable) { + context.log("Warning: cannot generate bridge for ${element.name}.") + excludedStubs += element } } @@ -274,7 +287,8 @@ class StubIrBridgeBuilder( kotlinFile, simpleBridgeGenerator.prepare(), propertyAccessorBridgeBodies.toMap(), - functionBridgeBodies.toMap() + functionBridgeBodies.toMap(), + excludedStubs.toSet() ) } } diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt index 3d978e34408..20276e384e5 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt @@ -229,10 +229,7 @@ data class StubIrBuilderResult( /** * Produces [StubIrBuilderResult] for given [KotlinPlatform] using [InteropConfiguration]. */ -class StubIrBuilder( - private val context: StubIrContext, - private val verbose: Boolean = false -) { +class StubIrBuilder(private val context: StubIrContext) { private val configuration = context.configuration private val nativeIndex: NativeIndex = context.nativeIndex @@ -292,17 +289,11 @@ class StubIrBuilder( ) } - private fun log(message: String) { - if (verbose) { - println(message) - } - } - private fun generateStubsForWrappedMacro(macro: WrappedMacroDef) { try { generateStubsForGlobal(GlobalDecl(macro.name, macro.type, isConst = true)) } catch (e: Throwable) { - log("Warning: cannot generate stubs for macro ${macro.name}") + context.log("Warning: cannot generate stubs for macro ${macro.name}") } } @@ -310,7 +301,7 @@ class StubIrBuilder( try { addStubs(MacroConstantStubBuilder(buildingContext, constant).build()) } catch (e: Throwable) { - log("Warning: cannot generate stubs for constant ${constant.name}") + context.log("Warning: cannot generate stubs for constant ${constant.name}") } } @@ -318,7 +309,7 @@ class StubIrBuilder( try { addStubs(EnumStubBuilder(buildingContext, enumDef).build()) } catch (e: Throwable) { - log("Warning: cannot generate definition for enum ${enumDef.spelling}") + context.log("Warning: cannot generate definition for enum ${enumDef.spelling}") } } @@ -326,7 +317,7 @@ class StubIrBuilder( try { addStubs(FunctionStubBuilder(buildingContext, func).build()) } catch (e: Throwable) { - log("Warning: cannot generate stubs for function ${func.name}") + context.log("Warning: cannot generate stubs for function ${func.name}") } } @@ -334,7 +325,7 @@ class StubIrBuilder( try { addStubs(StructStubBuilder(buildingContext, decl).build()) } catch (e: Throwable) { - log("Warning: cannot generate definition for struct ${decl.spelling}") + context.log("Warning: cannot generate definition for struct ${decl.spelling}") } } @@ -342,7 +333,7 @@ class StubIrBuilder( try { addStubs(TypedefStubBuilder(buildingContext, typedefDef).build()) } catch (e: Throwable) { - log("Warning: cannot generate typedef ${typedefDef.name}") + context.log("Warning: cannot generate typedef ${typedefDef.name}") } } @@ -350,7 +341,7 @@ class StubIrBuilder( try { addStubs(GlobalStubBuilder(buildingContext, global).build()) } catch (e: Throwable) { - log("Warning: cannot generate stubs for global ${global.name}") + context.log("Warning: cannot generate stubs for global ${global.name}") } } diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt index ff1bf0f95c5..38da841d11a 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt @@ -11,6 +11,7 @@ import java.io.File import java.util.* class StubIrContext( + val log: (String) -> Unit, val configuration: InteropConfiguration, val nativeIndex: NativeIndex, val imports: Imports, @@ -85,12 +86,9 @@ class StubIrContext( } } -class StubIrDriver( - private val context: StubIrContext, - private val verbose: Boolean = false -) { +class StubIrDriver(private val context: StubIrContext) { fun run(outKtFile: File, outCFile: File, entryPoint: String?) { - val builderResult = StubIrBuilder(context, verbose).build() + val builderResult = StubIrBuilder(context).build() val bridgeBuilderResult = StubIrBridgeBuilder(context, builderResult).build() outKtFile.bufferedWriter().use { ktFile -> File(outCFile.absolutePath).bufferedWriter().use { cFile -> diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrTextEmitter.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrTextEmitter.kt index d0cc7a9fbc9..fed7ff7b7b5 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrTextEmitter.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrTextEmitter.kt @@ -215,6 +215,8 @@ class StubIrTextEmitter( } override fun visitFunction(element: FunctionStub, owner: StubContainer?) { + if (element in bridgeBuilderResult.excludedStubs) return + val modality = renderMemberModality(element.modality, owner) element.annotations.forEach { out(renderAnnotation(it)) @@ -242,6 +244,8 @@ class StubIrTextEmitter( } override fun visitProperty(element: PropertyStub, owner: StubContainer?) { + if (element in bridgeBuilderResult.excludedStubs) return + val modality = renderMemberModality(element.modality, owner) val receiver = if (element.receiverType != null) "${renderStubType(element.receiverType)}." else "" val name = if (owner?.isTopLevelContainer == true) { diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 9b3f1e61522..e3c3d05faa5 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -239,8 +239,14 @@ private fun processCLib(args: Array, additionalArgs: Map = File(nativeLibsDir).mkdirs() val outCFile = tempFiles.create(libName, ".${language.sourceFileExtension}") - val stubIrContext = StubIrContext(configuration, nativeIndex, imports, flavor, libName) - val stubIrDriver = StubIrDriver(stubIrContext, verbose) + val logger = if (verbose) { + { message: String -> println(message) } + } else { + {} + } + + val stubIrContext = StubIrContext(logger, configuration, nativeIndex, imports, flavor, libName) + val stubIrDriver = StubIrDriver(stubIrContext) stubIrDriver.run(outKtFile, File(outCFile.absolutePath), entryPoint) // TODO: if a library has partially included headers, then it shouldn't be used as a dependency.