From cd9812b504f0bb5d1f3e4ee83402d0f69434708c Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Fri, 7 Feb 2020 16:27:17 +0700 Subject: [PATCH] [Interop][Metadata] Mangle global properties names --- .../native/interop/gen/KotlinCodeModel.kt | 17 +++--------- .../kotlin/native/interop/gen/StubIrDriver.kt | 6 ++--- .../interop/gen/StubIrMetadataEmitter.kt | 26 ++++++++++++++----- .../native/interop/gen/StubIrTextEmitter.kt | 4 --- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/KotlinCodeModel.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/KotlinCodeModel.kt index 80ca3c393e9..a5e1d4295df 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/KotlinCodeModel.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/KotlinCodeModel.kt @@ -331,17 +331,6 @@ abstract class KotlinFile( } -data class KotlinParameter( - val name: String, - val type: KotlinType, - val isVararg: Boolean, - val annotations: List -) { - fun render(scope: KotlinScope) = buildString { - annotations.forEach { append("$it ") } - if (isVararg) append("vararg ") - append(name.asSimpleName()) - append(": ") - append(type.render(scope)) - } -} +// Try to use the provided name. If failed, mangle it with underscore and try again: +internal tailrec fun getTopLevelPropertyDeclarationName(scope: KotlinScope, name: String): String = + scope.declareProperty(name) ?: getTopLevelPropertyDeclarationName(scope, name + "_") \ No newline at end of file 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 81220ace75a..a7f045e5720 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 @@ -129,7 +129,7 @@ class StubIrDriver( GenerationMode.SOURCE_CODE -> { emitSourceCode(outKtFile(), builderResult, bridgeBuilderResult) } - GenerationMode.METADATA -> emitMetadata(builderResult, moduleName) + GenerationMode.METADATA -> emitMetadata(builderResult, moduleName, bridgeBuilderResult.kotlinFile) } } @@ -142,8 +142,8 @@ class StubIrDriver( return Result.SourceCode } - private fun emitMetadata(builderResult: StubIrBuilderResult, moduleName: String) = - Result.Metadata(StubIrMetadataEmitter(context, builderResult, moduleName).emit()) + private fun emitMetadata(builderResult: StubIrBuilderResult, moduleName: String, scope: KotlinScope) = + Result.Metadata(StubIrMetadataEmitter(context, builderResult, moduleName, scope).emit()) private fun emitCFile(context: StubIrContext, cFile: Appendable, entryPoint: String?, nativeBridges: NativeBridges) { val out = { it: String -> cFile.appendln(it) } diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt index 54ceb804388..674d7aa14e2 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt @@ -12,18 +12,20 @@ import org.jetbrains.kotlin.utils.addIfNotNull class StubIrMetadataEmitter( private val context: StubIrContext, private val builderResult: StubIrBuilderResult, - private val moduleName: String + private val moduleName: String, + private val scope: KotlinScope ) { fun emit(): KlibModuleMetadata { val annotations = emptyList() - val fragments = emitModuleFragments() + val fragments = emitModuleFragments(scope) return KlibModuleMetadata(moduleName, fragments, annotations) } - private fun emitModuleFragments(): List = + private fun emitModuleFragments(scope: KotlinScope): List = ModuleMetadataEmitter( context.configuration.pkgName, - builderResult.stubs + builderResult.stubs, + scope ).emit().let { kmModuleFragment -> // We need to create module fragment for each part of package name. val pkgName = context.configuration.pkgName @@ -43,7 +45,8 @@ class StubIrMetadataEmitter( */ internal class ModuleMetadataEmitter( private val packageFqName: String, - private val module: SimpleStubContainer + private val module: SimpleStubContainer, + private val scope: KotlinScope ) { fun emit(): KmModuleFragment { @@ -88,6 +91,16 @@ internal class ModuleMetadataEmitter( val typeParametersInterner: Interner = Interner() ) + private fun isTopLevelContainer(container: StubContainer?): Boolean = + container == null + + private fun getPropertyNameInScope(originalName: String, container: StubContainer?): String = + if (isTopLevelContainer(container)) { + getTopLevelPropertyDeclarationName(scope, originalName) + } else { + originalName + } + private val visitor = object : StubIrVisitor { override fun visitClass(element: ClassStub, data: VisitingContext): List { @@ -146,7 +159,8 @@ internal class ModuleMetadataEmitter( override fun visitProperty(element: PropertyStub, data: VisitingContext) = with (MappingExtensions(data.typeParametersInterner)) { - KmProperty(element.flags, element.name, element.getterFlags, element.setterFlags).also { km -> + val name = getPropertyNameInScope(element.name, data.container) + KmProperty(element.flags, name, element.getterFlags, element.setterFlags).also { km -> element.annotations.mapTo(km.annotations) { it.map() } km.uniqId = data.uniqIds.uniqIdForProperty(element) km.returnType = element.type.map() 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 7ca07e0c0d1..736c7e254b5 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 @@ -279,10 +279,6 @@ class StubIrTextEmitter( } } - // Try to use the provided name. If failed, mangle it with underscore and try again: - private tailrec fun getTopLevelPropertyDeclarationName(scope: KotlinScope, name: String): String = - scope.declareProperty(name) ?: getTopLevelPropertyDeclarationName(scope, name + "_") - private fun emitProperty(element: PropertyStub, owner: StubContainer?) { if (element in bridgeBuilderResult.excludedStubs) return