KT-65897: add exporting of kotlin constructors as Swift constructors #KT-65897 fixed

Merge-request: KT-MR-14734
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2024-03-14 12:21:39 +00:00
committed by Space Team
parent bbcc5c9aed
commit fcc4470b74
18 changed files with 544 additions and 19 deletions
@@ -34,6 +34,8 @@ private abstract class PsiToSirTranslation<T>(
) : KtVisitor<T, Unit?>() {
abstract override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit?): T
abstract override fun visitNamedFunction(function: KtNamedFunction, data: Unit?): T
abstract override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor, data: Unit?): T
abstract override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Unit?): T
abstract override fun visitProperty(property: KtProperty, data: Unit?): T
}
@@ -51,6 +53,14 @@ private class PsiToSirTranslationCollector(
function.checkAndTranslate(null)
}
override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor) {
constructor.checkAndTranslate(null)
}
override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor) {
constructor.checkAndTranslate(null)
}
override fun visitProperty(property: KtProperty) {
property.checkAndTranslate(null)
}
@@ -82,9 +92,21 @@ private class PsiToSirTranslatableChecker(
return functionIsPublicAndTopLevel && functionSymbolIsTranslatable
}
override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor, data: Unit?): Boolean {
return constructor.isConsumable()
}
override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Unit?): Boolean {
return constructor.isConsumable()
}
override fun visitProperty(property: KtProperty, data: Unit?): Boolean {
return property.isPublic
}
private fun KtConstructor<*>.isConsumable(): Boolean {
return isPublic
}
}
private class PsiToSirElementTranslation(
@@ -99,6 +121,14 @@ private class PsiToSirElementTranslation(
buildSirFunctionFromPsi(function)
}
override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor, data: Unit?): SirDeclaration = with(analysisSession) {
buildSirConstructorFromPsi(constructor)
}
override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Unit?): SirDeclaration = with(analysisSession) {
buildSirConstructorFromPsi(constructor)
}
override fun visitProperty(property: KtProperty, data: Unit?): SirDeclaration = with(analysisSession) {
buildSirVariableFromPsi(property)
}
@@ -118,6 +148,32 @@ internal fun buildSirClassFromPsi(classOrObject: KtClassOrObject): SirNamedDecla
PsiToSirElementTranslation(analysisSession),
)
)
// HACK to support default constructors.
// todo: We should rework builder from PSI to AnalysisApi during KT-66310
val constructors = symbol.getMemberScope().getConstructors()
if (constructors.count() == 1 && constructors.first().psi == classOrObject) {
declarations.add(
0,
buildInit {
val constructorSymbol = constructors.first()
origin = KotlinSource(constructorSymbol)
kind = constructorSymbol.sirCallableKind
isFailable = false
initKind = SirInitializerKind.ORDINARY
constructorSymbol.valueParameters.mapTo(parameters) {
SirParameter(
argumentName = it.name.asString(),
type = buildSirNominalType(it.returnType)
)
}
documentation = null
}
)
}
}.also { resultedClass ->
resultedClass.declarations.forEach { decl -> decl.parent = resultedClass }
}
@@ -143,6 +199,25 @@ internal fun buildSirFunctionFromPsi(function: KtNamedFunction): SirFunction = b
documentation = function.docComment?.text
}
context(KtAnalysisSession)
internal fun buildSirConstructorFromPsi(function: KtConstructor<*>): SirInit = buildInit {
val symbol = function.getConstructorSymbol()
origin = KotlinSource(symbol)
kind = symbol.sirCallableKind
isFailable = false
initKind = SirInitializerKind.ORDINARY
symbol.valueParameters.mapTo(parameters) {
SirParameter(
argumentName = it.name.asString(),
type = buildSirNominalType(it.returnType)
)
}
documentation = function.docComment?.text
}
context(KtAnalysisSession)
internal fun buildSirVariableFromPsi(variable: KtProperty): SirVariable = buildVariable {
val symbol = variable.getVariableSymbol()
@@ -213,8 +288,9 @@ private val KtCallableSymbol.sirCallableKind: SirCallableKind
SirCallableKind.STATIC_METHOD
}
}
KtSymbolKind.CLASS_MEMBER, KtSymbolKind.ACCESSOR -> SirCallableKind.INSTANCE_METHOD
KtSymbolKind.CLASS_MEMBER, KtSymbolKind.ACCESSOR
-> SirCallableKind.INSTANCE_METHOD
KtSymbolKind.LOCAL,
KtSymbolKind.SAM_CONSTRUCTOR ->
TODO("encountered callable kind($symbolKind) that is not translatable currently. Fix this crash during KT-65980.")
KtSymbolKind.SAM_CONSTRUCTOR
-> TODO("encountered callable kind($symbolKind) that is not translatable currently. Fix this crash during KT-65980.")
}