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:
+2
-15
@@ -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() }
|
||||
|
||||
+54
@@ -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() }
|
||||
+3
-4
@@ -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}")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user