KT-63273: Swift IR passes to support functions with numeric parameters

Merge-request: KT-MR-13290
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2023-12-08 14:07:42 +00:00
committed by Space Team
parent 7d685522ce
commit 38d5e56530
15 changed files with 386 additions and 41 deletions
@@ -6,17 +6,13 @@
package org.jetbrains.kotlin.sir.analysisapi
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
import org.jetbrains.kotlin.psi.psiUtil.isPublic
import org.jetbrains.kotlin.sir.SirOrigin
import org.jetbrains.kotlin.sir.SirDeclaration
import org.jetbrains.kotlin.sir.SirForeignFunction
import org.jetbrains.kotlin.sir.SirVisibility
import org.jetbrains.kotlin.sir.builder.SirForeignFunctionBuilder
import org.jetbrains.kotlin.sir.builder.buildForeignFunction
import org.jetbrains.kotlin.sir.analysisapi.transformers.toForeignFunction
/**
* A root interface for classes that produce Swift IR elements.
@@ -37,17 +33,8 @@ class SirGenerator : SirFactory {
super.visitNamedFunction(function)
function
.takeIf { function.isPublic }
?.fqName
?.pathSegments()
?.toListString()
?.let { names -> buildForeignFunction {
origin = SirOrigin.KotlinEntity(names)
visibility = SirVisibility.PUBLIC
}
}
?.toForeignFunction()
?.let { res.add(it) }
}
}
}
private fun List<Name>.toListString() = map { it.asString() }
@@ -0,0 +1,54 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.sir.analysisapi.transformers
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.sir.*
import org.jetbrains.kotlin.sir.builder.buildForeignFunction
internal fun KtNamedFunction.toForeignFunction(): SirForeignFunction = buildForeignFunction {
origin = SirOrigin.ForeignEntity(
AAFunction(this@toForeignFunction)
)
}
private fun KtValueParameterSymbol.toSirParam(): KotlinParameter = AAParameter(
name = name.toString(),
type = AAKotlinType(name = returnType.toString())
)
private class AAFunction(
private val originalFunction: KtNamedFunction
) : KotlinFunction {
override val fqName: List<String>
get() = originalFunction.fqName?.pathSegments()?.toListString() ?: emptyList()
override val parameters: List<KotlinParameter>
get() = analyze(originalFunction) {
val function = originalFunction.getFunctionLikeSymbol()
function.valueParameters.map { it.toSirParam() }
}
override val returnType: KotlinType
get() = analyze(originalFunction) {
val function = originalFunction.getFunctionLikeSymbol()
AAKotlinType(name = function.returnType.toString())
}
}
private data class AAParameter(
override val name: String,
override val type: KotlinType
) : KotlinParameter
private data class AAKotlinType(
override val name: String
) : KotlinType
private fun List<Name>.toListString() = map { it.asString() }
@@ -12,11 +12,9 @@ import org.jetbrains.kotlin.analysis.test.framework.test.configurators.*
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind
import org.jetbrains.kotlin.platform.konan.NativePlatforms
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.sir.SirDeclaration
import org.jetbrains.kotlin.sir.SirForeignFunction
import org.jetbrains.kotlin.sir.SirModule
import org.jetbrains.kotlin.sir.KotlinFunction
import org.jetbrains.kotlin.sir.SirOrigin
import org.jetbrains.kotlin.sir.builder.SirModuleBuilder
import org.jetbrains.kotlin.sir.builder.buildModule
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.services.TestModuleStructure
@@ -62,7 +60,8 @@ abstract class AbstractKotlinSirContextTestBase : AbstractAnalysisApiBasedTest()
module.declarations
.filterIsInstance<SirForeignFunction>()
.forEach {
appendLine("${(it.origin as SirOrigin.KotlinEntity).path}")
val function = (it.origin as SirOrigin.ForeignEntity).entity as KotlinFunction
appendLine("${function.fqName}")
}
}