add distinction between functions and methods in SIR #KT-65046 fixed

Merge-request: KT-MR-14667
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2024-02-29 12:52:10 +00:00
committed by Space Team
parent 12552e4e04
commit e6705e9db2
23 changed files with 138 additions and 63 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.sir.bridge package org.jetbrains.kotlin.sir.bridge
import com.intellij.testFramework.TestDataFile import com.intellij.testFramework.TestDataFile
import org.jetbrains.kotlin.sir.SirCallableKind
import org.jetbrains.kotlin.sir.SirNominalType import org.jetbrains.kotlin.sir.SirNominalType
import org.jetbrains.kotlin.sir.SirParameter import org.jetbrains.kotlin.sir.SirParameter
import org.jetbrains.kotlin.sir.SirType import org.jetbrains.kotlin.sir.SirType
@@ -97,30 +98,34 @@ private fun readRequestFromFile(file: File): BridgeRequest {
this.name = fqName.last() this.name = fqName.last()
this.returnType = returnType this.returnType = returnType
this.parameters += parameters this.parameters += parameters
this.isStatic = false this.kind = SirCallableKind.FUNCTION
} }
BridgeRequestKind.PROPERTY_GETTER -> { BridgeRequestKind.PROPERTY_GETTER -> {
val getter = buildGetter() val getter = buildGetter {
this.kind = SirCallableKind.FUNCTION
}
getter.parent = buildVariable { getter.parent = buildVariable {
this.name = fqName.last() this.name = fqName.last()
this.type = returnType this.type = returnType
check(parameters.isEmpty()) check(parameters.isEmpty())
this.isStatic = false
this.getter = getter this.getter = getter
} }
getter getter
} }
BridgeRequestKind.PROPERTY_SETTER -> { BridgeRequestKind.PROPERTY_SETTER -> {
val setter = buildSetter() val setter = buildSetter {
this.kind = SirCallableKind.FUNCTION
}
setter.parent = buildVariable { setter.parent = buildVariable {
this.name = fqName.last() this.name = fqName.last()
this.type = returnType this.type = returnType
check(parameters.isEmpty()) check(parameters.isEmpty())
this.isStatic = false this.getter = buildGetter {
this.getter = buildGetter() this.kind = SirCallableKind.FUNCTION
}
this.setter = setter this.setter = setter
} }
@@ -5,13 +5,13 @@
package org.jetbrains.sir.passes.builder package org.jetbrains.sir.passes.builder
import com.sun.org.apache.xpath.internal.operations.Bool
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.isPublic import org.jetbrains.kotlin.psi.psiUtil.isPublic
import org.jetbrains.kotlin.sir.* import org.jetbrains.kotlin.sir.*
@@ -124,14 +124,7 @@ internal fun buildSirFunctionFromPsi(function: KtNamedFunction): SirFunction = b
val callableId = symbol.callableIdIfNonLocal val callableId = symbol.callableIdIfNonLocal
origin = KotlinSource(symbol) origin = KotlinSource(symbol)
// this check is not ideal. We assume that there will be no further moves of the declaration, kind = symbol.sirCallableKind
// especially that there will be no changes in "static" quality.
// That is not fully true. For example, during KT-65127
// we may end up removing the whole enum structure at top of the declaration, and that will
// lift the need to keep it static.
// this problem will be addressed somewhere in the future
val isRootPackage = callableId?.packageName?.isRoot
isStatic = if (isRootPackage == true) false else function.isTopLevel
name = callableId?.callableName?.asString() ?: "UNKNOWN_FUNCTION_NAME" name = callableId?.callableName?.asString() ?: "UNKNOWN_FUNCTION_NAME"
@@ -151,21 +144,18 @@ internal fun buildSirVariableFromPsi(variable: KtProperty): SirVariable = buildV
val callableId = symbol.callableIdIfNonLocal val callableId = symbol.callableIdIfNonLocal
origin = KotlinSource(symbol) origin = KotlinSource(symbol)
// this check is not ideal. We assume that there will be no further moves of the declaration, val accessorKind = symbol.sirCallableKind
// especially that there will be no changes in "static" quality.
// That is not fully true. For example, during KT-65127
// we may end up removing the whole enum structure at top of the declaration, and that will
// lift the need to keep it static.
// this problem will be addressed somewhere in the future
val isRootPackage = callableId?.packageName?.isRoot
isStatic = if (isRootPackage == true) false else variable.isTopLevel
name = callableId?.callableName?.asString() ?: "UNKNOWN_VARIABLE_NAME" name = callableId?.callableName?.asString() ?: "UNKNOWN_VARIABLE_NAME"
type = buildSirNominalType(symbol.returnType) type = buildSirNominalType(symbol.returnType)
getter = buildGetter {} getter = buildGetter {
setter = if (variable.isVar) buildSetter {} else null kind = accessorKind
}
setter = if (variable.isVar) buildSetter {
kind = accessorKind
} else null
}.also { }.also {
it.getter.parent = it it.getter.parent = it
it.setter?.parent = it it.setter?.parent = it
@@ -207,3 +197,19 @@ private fun KtNamedClassOrObjectSymbol.isConsumableBySirBuilder(): Boolean =
&& !isData && !isData
&& !isInline && !isInline
&& modality == Modality.FINAL && modality == Modality.FINAL
private val KtCallableSymbol.sirCallableKind: SirCallableKind
get() = when (symbolKind) {
KtSymbolKind.TOP_LEVEL -> {
val isRootPackage = callableIdIfNonLocal?.packageName?.isRoot
if (isRootPackage == true) {
SirCallableKind.FUNCTION
} else {
SirCallableKind.STATIC_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.")
}
@@ -56,8 +56,8 @@ public class SirAsSwiftSourcesPrinter(private val printer: SmartPrinter) : SirVi
override fun visitVariable(variable: SirVariable): Unit = with(printer) { override fun visitVariable(variable: SirVariable): Unit = with(printer) {
printVisibility(variable) printVisibility(variable)
printCallableKind(variable.kind)
print( print(
if (variable.isStatic) "static " else "",
"var ", "var ",
variable.name.swiftIdentifier, variable.name.swiftIdentifier,
": ", ": ",
@@ -96,12 +96,8 @@ public class SirAsSwiftSourcesPrinter(private val printer: SmartPrinter) : SirVi
override fun visitFunction(function: SirFunction): Unit = with(printer) { override fun visitFunction(function: SirFunction): Unit = with(printer) {
function.documentation?.let { println(it) } function.documentation?.let { println(it) }
printVisibility(function) printVisibility(function)
printCallableKind(function.kind)
print( print(
if (function.isStatic) {
"static "
} else {
""
},
"func ", "func ",
function.name.swiftIdentifier, function.name.swiftIdentifier,
"(" "("
@@ -186,4 +182,15 @@ internal fun SmartPrinter.printVisibility(decl: SirDeclaration) {
print( print(
decl.visibility.takeIf { it != SirVisibility.INTERNAL }?.let { "${it.swift} " } ?: "" decl.visibility.takeIf { it != SirVisibility.INTERNAL }?.let { "${it.swift} " } ?: ""
) )
} }
internal fun SmartPrinter.printCallableKind(callableKind: SirCallableKind) {
print(
when (callableKind) {
SirCallableKind.FUNCTION -> ""
SirCallableKind.INSTANCE_METHOD -> ""
SirCallableKind.CLASS_METHOD -> "class "
SirCallableKind.STATIC_METHOD -> "static "
}
)
}
@@ -0,0 +1,5 @@
public class func foo(
arg1: Swift.Int32
) -> Swift.Bool {
return foo_wrapped(arg1)
}
@@ -26,7 +26,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
returnType = SirNominalType(SirSwiftModule.bool) returnType = SirNominalType(SirSwiftModule.bool)
@@ -47,7 +47,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo1" name = "foo1"
returnType = SirNominalType(SirSwiftModule.bool) returnType = SirNominalType(SirSwiftModule.bool)
@@ -56,7 +56,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo2" name = "foo2"
returnType = SirNominalType(SirSwiftModule.bool) returnType = SirNominalType(SirSwiftModule.bool)
@@ -77,7 +77,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
parameters.add( parameters.add(
@@ -105,7 +105,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
parameters.add( parameters.add(
@@ -139,7 +139,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
parameters.addAll( parameters.addAll(
@@ -193,7 +193,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
parameters.add( parameters.add(
@@ -215,14 +215,14 @@ class SirAsSwiftSourcesPrinterTests {
} }
@Test @Test
fun `should print static`() { fun `should print static function`() {
val module = buildModule { val module = buildModule {
name = "Test" name = "Test"
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = true kind = SirCallableKind.STATIC_METHOD
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
parameters.add( parameters.add(
@@ -243,6 +243,35 @@ class SirAsSwiftSourcesPrinterTests {
) )
} }
@Test
fun `should print class function`() {
val module = buildModule {
name = "Test"
declarations.add(
buildFunction {
origin = SirOrigin.Unknown
kind = SirCallableKind.CLASS_METHOD
visibility = SirVisibility.PUBLIC
name = "foo"
parameters.add(
SirParameter(
argumentName = "arg1",
type = SirNominalType(SirSwiftModule.int32)
)
)
returnType = SirNominalType(SirSwiftModule.bool)
body = SirFunctionBody(listOf("return foo_wrapped(arg1)"))
}
)
}
runTest(
module,
"testData/class_function"
)
}
@Test @Test
fun `should print DocC comment`() { fun `should print DocC comment`() {
@@ -251,7 +280,7 @@ class SirAsSwiftSourcesPrinterTests {
declarations.add( declarations.add(
buildFunction { buildFunction {
origin = SirOrigin.Unknown origin = SirOrigin.Unknown
isStatic = false kind = SirCallableKind.FUNCTION
visibility = SirVisibility.PUBLIC visibility = SirVisibility.PUBLIC
name = "foo" name = "foo"
parameters.add( parameters.add(
@@ -18,6 +18,7 @@ sealed class SirAccessor : SirCallable() {
abstract override val origin: SirOrigin abstract override val origin: SirOrigin
abstract override val visibility: SirVisibility abstract override val visibility: SirVisibility
abstract override var parent: SirDeclarationParent abstract override var parent: SirDeclarationParent
abstract override val kind: SirCallableKind
abstract var body: SirFunctionBody? abstract var body: SirFunctionBody?
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
@@ -18,6 +18,7 @@ sealed class SirCallable : SirElementBase(), SirDeclaration {
abstract override val origin: SirOrigin abstract override val origin: SirOrigin
abstract override val visibility: SirVisibility abstract override val visibility: SirVisibility
abstract override var parent: SirDeclarationParent abstract override var parent: SirDeclarationParent
abstract val kind: SirCallableKind
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
visitor.visitCallable(this, data) visitor.visitCallable(this, data)
@@ -18,7 +18,7 @@ abstract class SirFunction : SirCallable() {
abstract override val origin: SirOrigin abstract override val origin: SirOrigin
abstract override val visibility: SirVisibility abstract override val visibility: SirVisibility
abstract override var parent: SirDeclarationParent abstract override var parent: SirDeclarationParent
abstract val isStatic: Boolean abstract override val kind: SirCallableKind
abstract val name: String abstract val name: String
abstract val parameters: List<SirParameter> abstract val parameters: List<SirParameter>
abstract val returnType: SirType abstract val returnType: SirType
@@ -18,6 +18,7 @@ abstract class SirGetter : SirAccessor() {
abstract override val origin: SirOrigin abstract override val origin: SirOrigin
abstract override val visibility: SirVisibility abstract override val visibility: SirVisibility
abstract override var parent: SirDeclarationParent abstract override var parent: SirDeclarationParent
abstract override val kind: SirCallableKind
abstract override var body: SirFunctionBody? abstract override var body: SirFunctionBody?
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
@@ -18,6 +18,7 @@ abstract class SirSetter : SirAccessor() {
abstract override val origin: SirOrigin abstract override val origin: SirOrigin
abstract override val visibility: SirVisibility abstract override val visibility: SirVisibility
abstract override var parent: SirDeclarationParent abstract override var parent: SirDeclarationParent
abstract override val kind: SirCallableKind
abstract override var body: SirFunctionBody? abstract override var body: SirFunctionBody?
abstract val parameterName: String abstract val parameterName: String
@@ -22,7 +22,6 @@ abstract class SirVariable : SirDeclarationParent(), SirDeclaration {
abstract val type: SirType abstract val type: SirType
abstract val getter: SirGetter abstract val getter: SirGetter
abstract val setter: SirSetter? abstract val setter: SirSetter?
abstract val isStatic: Boolean
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
visitor.visitVariable(this, data) visitor.visitVariable(this, data)
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.sir.impl.SirFunctionImpl
class SirFunctionBuilder { class SirFunctionBuilder {
var origin: SirOrigin = SirOrigin.Unknown var origin: SirOrigin = SirOrigin.Unknown
var visibility: SirVisibility = SirVisibility.PUBLIC var visibility: SirVisibility = SirVisibility.PUBLIC
var isStatic: Boolean by kotlin.properties.Delegates.notNull<Boolean>() lateinit var kind: SirCallableKind
lateinit var name: String lateinit var name: String
val parameters: MutableList<SirParameter> = mutableListOf() val parameters: MutableList<SirParameter> = mutableListOf()
lateinit var returnType: SirType lateinit var returnType: SirType
@@ -29,7 +29,7 @@ class SirFunctionBuilder {
return SirFunctionImpl( return SirFunctionImpl(
origin, origin,
visibility, visibility,
isStatic, kind,
name, name,
parameters, parameters,
returnType, returnType,
@@ -56,7 +56,7 @@ inline fun buildFunctionCopy(original: SirFunction, init: SirFunctionBuilder.()
val copyBuilder = SirFunctionBuilder() val copyBuilder = SirFunctionBuilder()
copyBuilder.origin = original.origin copyBuilder.origin = original.origin
copyBuilder.visibility = original.visibility copyBuilder.visibility = original.visibility
copyBuilder.isStatic = original.isStatic copyBuilder.kind = original.kind
copyBuilder.name = original.name copyBuilder.name = original.name
copyBuilder.parameters.addAll(original.parameters) copyBuilder.parameters.addAll(original.parameters)
copyBuilder.returnType = original.returnType copyBuilder.returnType = original.returnType
@@ -18,12 +18,14 @@ import org.jetbrains.kotlin.sir.impl.SirGetterImpl
class SirGetterBuilder { class SirGetterBuilder {
var origin: SirOrigin = SirOrigin.Unknown var origin: SirOrigin = SirOrigin.Unknown
var visibility: SirVisibility = SirVisibility.PUBLIC var visibility: SirVisibility = SirVisibility.PUBLIC
lateinit var kind: SirCallableKind
var body: SirFunctionBody? = null var body: SirFunctionBody? = null
fun build(): SirGetter { fun build(): SirGetter {
return SirGetterImpl( return SirGetterImpl(
origin, origin,
visibility, visibility,
kind,
body, body,
) )
} }
@@ -31,7 +33,7 @@ class SirGetterBuilder {
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
inline fun buildGetter(init: SirGetterBuilder.() -> Unit = {}): SirGetter { inline fun buildGetter(init: SirGetterBuilder.() -> Unit): SirGetter {
contract { contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE) callsInPlace(init, InvocationKind.EXACTLY_ONCE)
} }
@@ -39,13 +41,14 @@ inline fun buildGetter(init: SirGetterBuilder.() -> Unit = {}): SirGetter {
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
inline fun buildGetterCopy(original: SirGetter, init: SirGetterBuilder.() -> Unit = {}): SirGetter { inline fun buildGetterCopy(original: SirGetter, init: SirGetterBuilder.() -> Unit): SirGetter {
contract { contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE) callsInPlace(init, InvocationKind.EXACTLY_ONCE)
} }
val copyBuilder = SirGetterBuilder() val copyBuilder = SirGetterBuilder()
copyBuilder.origin = original.origin copyBuilder.origin = original.origin
copyBuilder.visibility = original.visibility copyBuilder.visibility = original.visibility
copyBuilder.kind = original.kind
copyBuilder.body = original.body copyBuilder.body = original.body
return copyBuilder.apply(init).build() return copyBuilder.apply(init).build()
} }
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.sir.impl.SirSetterImpl
class SirSetterBuilder { class SirSetterBuilder {
var origin: SirOrigin = SirOrigin.Unknown var origin: SirOrigin = SirOrigin.Unknown
var visibility: SirVisibility = SirVisibility.PUBLIC var visibility: SirVisibility = SirVisibility.PUBLIC
lateinit var kind: SirCallableKind
var body: SirFunctionBody? = null var body: SirFunctionBody? = null
var parameterName: String = "newValue" var parameterName: String = "newValue"
@@ -25,6 +26,7 @@ class SirSetterBuilder {
return SirSetterImpl( return SirSetterImpl(
origin, origin,
visibility, visibility,
kind,
body, body,
parameterName, parameterName,
) )
@@ -33,7 +35,7 @@ class SirSetterBuilder {
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
inline fun buildSetter(init: SirSetterBuilder.() -> Unit = {}): SirSetter { inline fun buildSetter(init: SirSetterBuilder.() -> Unit): SirSetter {
contract { contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE) callsInPlace(init, InvocationKind.EXACTLY_ONCE)
} }
@@ -41,13 +43,14 @@ inline fun buildSetter(init: SirSetterBuilder.() -> Unit = {}): SirSetter {
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
inline fun buildSetterCopy(original: SirSetter, init: SirSetterBuilder.() -> Unit = {}): SirSetter { inline fun buildSetterCopy(original: SirSetter, init: SirSetterBuilder.() -> Unit): SirSetter {
contract { contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE) callsInPlace(init, InvocationKind.EXACTLY_ONCE)
} }
val copyBuilder = SirSetterBuilder() val copyBuilder = SirSetterBuilder()
copyBuilder.origin = original.origin copyBuilder.origin = original.origin
copyBuilder.visibility = original.visibility copyBuilder.visibility = original.visibility
copyBuilder.kind = original.kind
copyBuilder.body = original.body copyBuilder.body = original.body
copyBuilder.parameterName = original.parameterName copyBuilder.parameterName = original.parameterName
return copyBuilder.apply(init).build() return copyBuilder.apply(init).build()
@@ -22,7 +22,6 @@ class SirVariableBuilder {
lateinit var type: SirType lateinit var type: SirType
lateinit var getter: SirGetter lateinit var getter: SirGetter
var setter: SirSetter? = null var setter: SirSetter? = null
var isStatic: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
fun build(): SirVariable { fun build(): SirVariable {
return SirVariableImpl( return SirVariableImpl(
@@ -32,7 +31,6 @@ class SirVariableBuilder {
type, type,
getter, getter,
setter, setter,
isStatic,
) )
} }
@@ -58,6 +56,5 @@ inline fun buildVariableCopy(original: SirVariable, init: SirVariableBuilder.()
copyBuilder.type = original.type copyBuilder.type = original.type
copyBuilder.getter = original.getter copyBuilder.getter = original.getter
copyBuilder.setter = original.setter copyBuilder.setter = original.setter
copyBuilder.isStatic = original.isStatic
return copyBuilder.apply(init).build() return copyBuilder.apply(init).build()
} }
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
internal class SirFunctionImpl( internal class SirFunctionImpl(
override val origin: SirOrigin, override val origin: SirOrigin,
override val visibility: SirVisibility, override val visibility: SirVisibility,
override val isStatic: Boolean, override val kind: SirCallableKind,
override val name: String, override val name: String,
override val parameters: MutableList<SirParameter>, override val parameters: MutableList<SirParameter>,
override val returnType: SirType, override val returnType: SirType,
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
internal class SirGetterImpl( internal class SirGetterImpl(
override val origin: SirOrigin, override val origin: SirOrigin,
override val visibility: SirVisibility, override val visibility: SirVisibility,
override val kind: SirCallableKind,
override var body: SirFunctionBody?, override var body: SirFunctionBody?,
) : SirGetter() { ) : SirGetter() {
override lateinit var parent: SirDeclarationParent override lateinit var parent: SirDeclarationParent
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
internal class SirSetterImpl( internal class SirSetterImpl(
override val origin: SirOrigin, override val origin: SirOrigin,
override val visibility: SirVisibility, override val visibility: SirVisibility,
override val kind: SirCallableKind,
override var body: SirFunctionBody?, override var body: SirFunctionBody?,
override val parameterName: String, override val parameterName: String,
) : SirSetter() { ) : SirSetter() {
@@ -21,7 +21,6 @@ internal class SirVariableImpl(
override val type: SirType, override val type: SirType,
override val getter: SirGetter, override val getter: SirGetter,
override val setter: SirSetter?, override val setter: SirSetter?,
override val isStatic: Boolean,
) : SirVariable() { ) : SirVariable() {
override lateinit var parent: SirDeclarationParent override lateinit var parent: SirDeclarationParent
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2024 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
enum class SirCallableKind {
FUNCTION,
INSTANCE_METHOD,
CLASS_METHOD,
STATIC_METHOD,
}
val SirVariable.kind: SirCallableKind
get() = getter.kind
@@ -22,4 +22,4 @@ sealed interface SirOrigin {
* (e.g. objects created in/for tests) * (e.g. objects created in/for tests)
*/ */
data object Unknown : SirOrigin data object Unknown : SirOrigin
} }
@@ -76,13 +76,14 @@ object SwiftIrTree : AbstractSwiftIrTreeBuilder() {
val callable by sealedElement { val callable by sealedElement {
parent(declaration) parent(declaration)
+field("kind", callableKind)
} }
val function by element { val function by element {
customParentInVisitor = callable customParentInVisitor = callable
parent(callable) parent(callable)
+field("isStatic", boolean) // todo: KT-65046 Method|function distinction in SIR
+field("name", string) +field("name", string)
+listField("parameters", parameterType) +listField("parameters", parameterType)
+field("returnType", typeType) +field("returnType", typeType)
@@ -118,8 +119,6 @@ object SwiftIrTree : AbstractSwiftIrTreeBuilder() {
+field("getter", getter) +field("getter", getter)
+field("setter", setter, nullable = true) +field("setter", setter, nullable = true)
+field("isStatic", boolean) // todo: KT-65046 Method|function distinction in SIR
} }
val import by element { val import by element {
@@ -15,6 +15,7 @@ val parameterType = type(BASE_PACKAGE, "SirParameter", TypeKind.Class)
val typeType = type(BASE_PACKAGE, "SirType", TypeKind.Class) val typeType = type(BASE_PACKAGE, "SirType", TypeKind.Class)
val enumCaseType = type(BASE_PACKAGE, "SirEnumCase", TypeKind.Class) val enumCaseType = type(BASE_PACKAGE, "SirEnumCase", TypeKind.Class)
val functionBodyType = type(BASE_PACKAGE, "SirFunctionBody", TypeKind.Class) val functionBodyType = type(BASE_PACKAGE, "SirFunctionBody", TypeKind.Class)
val callableKind = type(BASE_PACKAGE, "SirCallableKind", TypeKind.Class)
private const val VISITORS_PACKAGE = "$BASE_PACKAGE.visitors" private const val VISITORS_PACKAGE = "$BASE_PACKAGE.visitors"