[Swift Export] KT-70883: Rectify modality-visibility-overrides in SirTree

Merge-request: KT-MR-17903
Merged-by: Gleb Lukianets <Gleb.Lukianets@jetbrains.com>
diff --git a/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt b/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt
index fe2bddf..47f2189 100644
--- a/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt
+++ b/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt
@@ -9,6 +9,7 @@
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.builder.*
 import org.jetbrains.kotlin.sir.util.SirSwiftModule
+import org.jetbrains.kotlin.sir.util.addChild
 import org.jetbrains.kotlin.test.services.JUnit5Assertions
 import org.jetbrains.kotlin.test.util.KtTestUtil
 import java.io.File
@@ -106,41 +107,60 @@
     val kind = BridgeRequestKind.valueOf(properties.getProperty("kind", "FUNCTION"))
 
     val callable = when (kind) {
-        BridgeRequestKind.FUNCTION -> buildFunction {
-            this.name = fqName.last()
-            this.returnType = returnType
-            this.parameters += parameters
-            this.kind = SirCallableKind.FUNCTION
-        }
-        BridgeRequestKind.PROPERTY_GETTER -> {
-            val getter = buildGetter {
-                this.kind = SirCallableKind.FUNCTION
+        BridgeRequestKind.FUNCTION -> {
+            val function = buildFunction {
+                this.name = fqName.last()
+                this.returnType = returnType
+                this.parameters += parameters
             }
 
-            getter.parent = buildVariable {
+            buildModule {
+                name = "BridgeTest"
+            }.apply {
+                addChild { function }
+            }
+
+            function
+        }
+        BridgeRequestKind.PROPERTY_GETTER -> {
+            val getter = buildGetter {}
+
+            val variable = buildVariable {
                 this.name = fqName.last()
                 this.type = returnType
                 check(parameters.isEmpty())
                 this.getter = getter
             }
 
+            getter.parent = variable
+
+            buildModule {
+                name = "BridgeTest"
+            }.apply {
+                addChild { variable }
+            }
+
             getter
         }
         BridgeRequestKind.PROPERTY_SETTER -> {
-            val setter = buildSetter {
-                this.kind = SirCallableKind.FUNCTION
-            }
+            val setter = buildSetter {}
 
-            setter.parent = buildVariable {
+            val variable = buildVariable {
                 this.name = fqName.last()
                 this.type = returnType
                 check(parameters.isEmpty())
-                this.getter = buildGetter {
-                    this.kind = SirCallableKind.FUNCTION
-                }
+                this.getter = buildGetter {}
                 this.setter = setter
             }
 
+            setter.parent = variable
+
+            buildModule {
+                name = "BridgeTest"
+            }.apply {
+                addChild { variable }
+            }
+
             setter
         }
     }
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/extensions/KtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/extensions/KtSymbol.kt
index 3cb83d6..540813a 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/extensions/KtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/extensions/KtSymbol.kt
@@ -5,12 +5,10 @@
 
 package org.jetbrains.sir.lightclasses.extensions
 
-import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
-import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
-import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolLocation
-import org.jetbrains.kotlin.analysis.api.symbols.psiSafe
+import org.jetbrains.kotlin.analysis.api.symbols.*
 import org.jetbrains.kotlin.psi.KtDeclaration
 import org.jetbrains.kotlin.sir.SirCallableKind
+import org.jetbrains.kotlin.sir.SirModality
 
 internal val KaCallableSymbol.sirCallableKind: SirCallableKind
     get() = when (location) {
@@ -19,7 +17,7 @@
             if (isRootPackage == true) {
                 SirCallableKind.FUNCTION
             } else {
-                SirCallableKind.STATIC_METHOD
+                SirCallableKind.CLASS_METHOD
             }
         }
         KaSymbolLocation.CLASS, KaSymbolLocation.PROPERTY,
@@ -29,3 +27,10 @@
     }
 
 internal fun KaSymbol.documentation(): String? = this.psiSafe<KtDeclaration>()?.docComment?.text
+
+internal val KaSymbolModality.sirModality: SirModality
+    get() = when (this) {
+        KaSymbolModality.FINAL -> SirModality.FINAL
+        KaSymbolModality.SEALED -> SirModality.UNSPECIFIED
+        KaSymbolModality.OPEN, KaSymbolModality.ABSTRACT -> SirModality.OPEN
+    }
\ No newline at end of file
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
index 571e159..8b4a9e3 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
@@ -11,9 +11,7 @@
 import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol
 import org.jetbrains.kotlin.analysis.api.symbols.KaNamedClassSymbol
 import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolModality
-import org.jetbrains.kotlin.analysis.api.types.KaClassType
 import org.jetbrains.kotlin.analysis.api.types.symbol
-import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.builder.buildGetter
 import org.jetbrains.kotlin.sir.builder.buildInit
@@ -42,11 +40,11 @@
     override val visibility: SirVisibility by lazy {
         SirVisibility.PUBLIC
     }
-    override val modality: SirClassModality by lazy {
+    override val modality: SirModality by lazy {
         when (ktSymbol.modality) {
-            KaSymbolModality.OPEN -> SirClassModality.OPEN
-            KaSymbolModality.FINAL -> SirClassModality.FINAL
-            KaSymbolModality.SEALED, KaSymbolModality.ABSTRACT -> SirClassModality.UNSPECIFIED
+            KaSymbolModality.OPEN -> SirModality.OPEN
+            KaSymbolModality.FINAL -> SirModality.FINAL
+            KaSymbolModality.SEALED, KaSymbolModality.ABSTRACT -> SirModality.UNSPECIFIED
         }
     }
 
@@ -94,7 +92,6 @@
 
     private fun kotlinBaseInitDeclaration(): SirDeclaration = buildInit {
         origin = SirOrigin.KotlinBaseInitOverride(`for` = KotlinSource(ktSymbol))
-        kind = SirCallableKind.CLASS_METHOD
         isFailable = false
         initKind = SirInitializerKind.ORDINARY
         isOverride = true
@@ -112,7 +109,6 @@
             buildInit {
                 origin = SirOrigin.PrivateObjectInit(`for` = KotlinSource(ktSymbol))
                 visibility = SirVisibility.PRIVATE
-                kind = SirCallableKind.CLASS_METHOD
                 isFailable = false
                 initKind = SirInitializerKind.ORDINARY
                 isOverride = computeIsOverrideForDesignatedInit(this@SirClassFromKtSymbol, emptyList())
@@ -122,9 +118,9 @@
                 visibility = SirVisibility.PUBLIC
                 type = SirNominalType(this@SirClassFromKtSymbol)
                 name = "shared"
-                getter = buildGetter {
-                    kind = SirCallableKind.STATIC_METHOD
-                }
+                isInstance = false
+                modality = SirModality.FINAL
+                getter = buildGetter {}
             }.also {
                 it.getter.parent = it
             }
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirFunctionFromKtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirFunctionFromKtSymbol.kt
index 3853766..d8e9b8b 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirFunctionFromKtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirFunctionFromKtSymbol.kt
@@ -7,13 +7,14 @@
 
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
 import org.jetbrains.kotlin.analysis.api.symbols.KaFunctionSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.isTopLevel
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.providers.SirSession
 import org.jetbrains.kotlin.sir.providers.source.KotlinSource
 import org.jetbrains.sir.lightclasses.SirFromKtSymbol
+import org.jetbrains.sir.lightclasses.extensions.*
 import org.jetbrains.sir.lightclasses.extensions.documentation
 import org.jetbrains.sir.lightclasses.extensions.lazyWithSessions
-import org.jetbrains.sir.lightclasses.extensions.sirCallableKind
 import org.jetbrains.sir.lightclasses.extensions.withSessions
 import org.jetbrains.sir.lightclasses.utils.translateParameters
 import org.jetbrains.sir.lightclasses.utils.translateReturnType
@@ -28,9 +29,6 @@
     override val origin: SirOrigin by lazy {
         KotlinSource(ktSymbol)
     }
-    override val kind: SirCallableKind by lazy {
-        ktSymbol.sirCallableKind
-    }
     override val name: String by lazyWithSessions {
         ktSymbol.sirDeclarationName()
     }
@@ -50,6 +48,15 @@
         }
         set(_) = Unit
 
+    override val isOverride: Boolean
+        get() = false // TODO: KT-66845
+
+    override val isInstance: Boolean
+        get() = !ktSymbol.isTopLevel
+
+    override val modality: SirModality
+        get() = ktSymbol.modality.sirModality
+
     override val attributes: MutableList<SirAttribute> = mutableListOf()
 
     override var body: SirFunctionBody? = null
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirInitFromKtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirInitFromKtSymbol.kt
index fe48776..07170d7 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirInitFromKtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirInitFromKtSymbol.kt
@@ -30,9 +30,6 @@
     override val origin: SirOrigin by lazy {
         KotlinSource(ktSymbol)
     }
-    override val kind: SirCallableKind by lazy {
-        SirCallableKind.CLASS_METHOD
-    }
     override val parameters: List<SirParameter> by lazy {
         translateParameters()
     }
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirVariableFromKtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirVariableFromKtSymbol.kt
index a97924c..927b562 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirVariableFromKtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirVariableFromKtSymbol.kt
@@ -7,15 +7,16 @@
 
 import org.jetbrains.kotlin.analysis.api.projectStructure.KaModule
 import org.jetbrains.kotlin.analysis.api.symbols.KaVariableSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.isTopLevel
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.builder.buildGetter
 import org.jetbrains.kotlin.sir.builder.buildSetter
 import org.jetbrains.kotlin.sir.providers.SirSession
 import org.jetbrains.kotlin.sir.providers.source.KotlinSource
 import org.jetbrains.sir.lightclasses.SirFromKtSymbol
+import org.jetbrains.sir.lightclasses.extensions.*
 import org.jetbrains.sir.lightclasses.extensions.documentation
 import org.jetbrains.sir.lightclasses.extensions.lazyWithSessions
-import org.jetbrains.sir.lightclasses.extensions.sirCallableKind
 import org.jetbrains.sir.lightclasses.extensions.withSessions
 import org.jetbrains.sir.lightclasses.utils.translateReturnType
 
@@ -37,17 +38,13 @@
         translateReturnType()
     }
     override val getter: SirGetter by lazy {
-        buildGetter {
-            kind = accessorKind
-        }.also {
+        buildGetter {}.also {
             it.parent = this@SirVariableFromKtSymbol
         }
     }
     override val setter: SirSetter? by lazy {
         if (!ktSymbol.isVal) {
-            buildSetter {
-                kind = accessorKind
-            }.also {
+            buildSetter {}.also {
                 it.parent = this@SirVariableFromKtSymbol
             }
         } else {
@@ -66,7 +63,12 @@
 
     override val attributes: MutableList<SirAttribute> = mutableListOf()
 
-    private val accessorKind by lazy {
-        ktSymbol.sirCallableKind
-    }
+    override val isOverride: Boolean
+        get() = false // TODO: KT-66845
+
+    override val isInstance: Boolean
+        get() = !ktSymbol.isTopLevel
+
+    override val modality: SirModality
+        get() = ktSymbol.modality.sirModality
 }
diff --git a/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt b/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt
index a89641a..13550fd 100644
--- a/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt
+++ b/native/swift/sir-printer/src/org/jetbrains/sir/printer/SirAsSwiftSourcesPrinter.kt
@@ -156,8 +156,7 @@
     private fun SirVariable.print() {
         printDocumentation()
         printAttributes()
-        printVisibility()
-        kind.print()
+        printModifiers()
         print(
             "var ",
             name.swiftIdentifier,
@@ -175,7 +174,7 @@
     private fun SirCallable.print() {
         printDocumentation()
         printAttributes()
-        printVisibility()
+        printModifiers()
         printOverride()
         printPreNameKeywords()
         printName()
@@ -247,9 +246,43 @@
             ?: ""
     )
 
+    private fun SirClassMemberDeclaration.printModifiers() {
+        when (effectiveModality) {
+            SirModality.OPEN -> {
+                if (visibility == SirVisibility.PUBLIC) {
+                    print("open ")
+                } else {
+                    // Swift properties and methods are internally inheritable
+                    // by default – no need to print "open"
+                    printVisibility()
+                }
+                if (callableKind == SirCallableKind.CLASS_METHOD) {
+                    print("class ")
+                }
+            }
+            SirModality.FINAL -> {
+                printVisibility()
+                if (callableKind == SirCallableKind.CLASS_METHOD) {
+                    print("static ")
+                } else if (callableKind != SirCallableKind.FUNCTION) {
+                    // to reduce noise we don't print 'final' when it's implied
+                    if ((parent as? SirClass)?.modality != SirModality.FINAL) {
+                        print("final ")
+                    }
+                }
+            }
+            SirModality.UNSPECIFIED -> {
+                printVisibility()
+                if (callableKind == SirCallableKind.CLASS_METHOD) {
+                    print("class ")
+                }
+            }
+        }
+    }
+
     private fun SirClass.printModifiers() {
         when (modality) {
-            SirClassModality.OPEN -> {
+            SirModality.OPEN -> {
                 if (visibility == SirVisibility.PUBLIC) {
                     print("open ")
                 } else {
@@ -258,19 +291,29 @@
                     printVisibility()
                 }
             }
-            SirClassModality.FINAL -> {
+            SirModality.FINAL -> {
                 printVisibility()
                 print("final ")
             }
-            SirClassModality.UNSPECIFIED -> {
+            SirModality.UNSPECIFIED -> {
                 printVisibility()
             }
         }
     }
 
+    private fun SirDeclaration.printModifiers() {
+        if (this is SirClassMemberDeclaration) {
+            printModifiers()
+        } else if (this is SirClass) {
+            printModifiers()
+        } else {
+            printVisibility()
+        }
+    }
+
     private fun SirCallable.printPreNameKeywords() = when (this) {
         is SirInit -> initKind.print()
-        is SirFunction -> kind.print()
+        is SirFunction -> {}
         is SirGetter -> print("get")
         is SirSetter -> print("set")
     }
@@ -339,15 +382,6 @@
         .forEach {
             println(it)
         }
-
-    private fun SirCallableKind.print() = print(
-        when (this) {
-            SirCallableKind.FUNCTION -> ""
-            SirCallableKind.INSTANCE_METHOD -> ""
-            SirCallableKind.CLASS_METHOD -> "class "
-            SirCallableKind.STATIC_METHOD -> "static "
-        }
-    )
 }
 
 private val SirVisibility.swift
@@ -373,4 +407,10 @@
         typeArguments.first().swiftRender + "?"
     } else {
         swiftName
-    }
\ No newline at end of file
+    }
+
+private val SirClassMemberDeclaration.callableKind: SirCallableKind
+    get() = when (this) {
+        is SirVariable -> kind
+        is SirCallable -> (this as SirCallable).kind
+    }
diff --git a/native/swift/sir-printer/testData/class_function.golden.swift b/native/swift/sir-printer/testData/class_function.golden.swift
index dc1fe40..3e1cc25 100644
--- a/native/swift/sir-printer/testData/class_function.golden.swift
+++ b/native/swift/sir-printer/testData/class_function.golden.swift
@@ -1,5 +1,7 @@
-public class func foo(
-    arg1: Swift.Int32
-) -> Swift.Bool {
-    return foo_wrapped(arg1)
+public class Foo {
+    public class func foo(
+        arg1: Swift.Int32
+    ) -> Swift.Bool {
+        return foo_wrapped(arg1)
+    }
 }
\ No newline at end of file
diff --git a/native/swift/sir-printer/testData/static_function.golden.swift b/native/swift/sir-printer/testData/static_function.golden.swift
index cad6e6e..786a3a2 100644
--- a/native/swift/sir-printer/testData/static_function.golden.swift
+++ b/native/swift/sir-printer/testData/static_function.golden.swift
@@ -1,5 +1,7 @@
-public static func foo(
-    arg1: Swift.Int32
-) -> Swift.Bool {
-    return foo_wrapped(arg1)
+public class Foo {
+    public static func foo(
+        arg1: Swift.Int32
+    ) -> Swift.Bool {
+        return foo_wrapped(arg1)
+    }
 }
\ No newline at end of file
diff --git a/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt b/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt
index 3f6c7d7..6647976 100644
--- a/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt
+++ b/native/swift/sir-printer/tests/org/jetbrains/kotlin/sir/printer/SirAsSwiftSourcesPrinterTests.kt
@@ -26,13 +26,12 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     returnType = SirNominalType(SirSwiftModule.bool)
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -47,7 +46,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo1"
                     returnType = SirNominalType(SirSwiftModule.bool)
@@ -56,13 +54,12 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo2"
                     returnType = SirNominalType(SirSwiftModule.bool)
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -77,7 +74,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     parameters.add(
@@ -89,7 +85,7 @@
                     returnType = SirNominalType(SirSwiftModule.bool)
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -105,7 +101,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     parameters.add(
@@ -123,7 +118,7 @@
                     returnType = SirNominalType(SirSwiftModule.bool)
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -139,7 +134,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     parameters.addAll(
@@ -185,7 +179,7 @@
                     returnType = SirNominalType(SirSwiftModule.bool)
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -201,7 +195,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     parameters.add(
@@ -214,7 +207,7 @@
                     body = SirFunctionBody(listOf("return foo_wrapped(arg1)"))
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -228,22 +221,28 @@
         val module = buildModule {
             name = "Test"
             declarations.add(
-                buildFunction {
-                    origin = SirOrigin.Unknown
-                    kind = SirCallableKind.STATIC_METHOD
-                    visibility = SirVisibility.PUBLIC
-                    name = "foo"
-                    parameters.add(
-                        SirParameter(
-                            argumentName = "arg1",
-                            type = SirNominalType(SirSwiftModule.int32)
-                        )
+                buildClass {
+                    name = "Foo"
+                    declarations.add(
+                        buildFunction {
+                            origin = SirOrigin.Unknown
+                            isInstance = false
+                            modality = SirModality.FINAL
+                            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)"))
+                        }
                     )
-                    returnType = SirNominalType(SirSwiftModule.bool)
-                    body = SirFunctionBody(listOf("return foo_wrapped(arg1)"))
-                }
+                }.attachDeclarations()
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -257,22 +256,27 @@
         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)
-                        )
+                buildClass {
+                    name = "Foo"
+                    declarations.add(
+                        buildFunction {
+                            origin = SirOrigin.Unknown
+                            isInstance = false
+                            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)"))
+                        }
                     )
-                    returnType = SirNominalType(SirSwiftModule.bool)
-                    body = SirFunctionBody(listOf("return foo_wrapped(arg1)"))
-                }
+                }.attachDeclarations()
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -288,7 +292,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     parameters.add(
@@ -306,7 +309,7 @@
                         """.trimIndent()
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -378,9 +381,7 @@
                 buildVariable {
                     name = "myVariable"
                     type = SirNominalType(SirSwiftModule.bool)
-                    getter = buildGetter {
-                        kind = SirCallableKind.INSTANCE_METHOD
-                    }
+                    getter = buildGetter {}
                     documentation = """
                             /// Function foo description.
                             /// - Parameters:
@@ -389,7 +390,7 @@
                         """.trimIndent()
                 }
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -480,7 +481,6 @@
                     declarations.add(
                         buildFunction {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.INSTANCE_METHOD
                             visibility = SirVisibility.PUBLIC
                             name = "foo"
                             parameters.addAll(
@@ -526,7 +526,6 @@
                     declarations.add(
                         buildFunction {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.INSTANCE_METHOD
                             visibility = SirVisibility.PUBLIC
                             name = "bar"
                             parameters.addAll(
@@ -552,7 +551,7 @@
                             returnType = SirNominalType(SirSwiftModule.bool)
                         }
                     )
-                }
+                }.attachDeclarations()
             )
         }
 
@@ -575,7 +574,6 @@
                     declarations.add(
                         buildInit {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.INSTANCE_METHOD
                             initKind = SirInitializerKind.ORDINARY
                             visibility = SirVisibility.PUBLIC
                             isFailable = true
@@ -622,7 +620,6 @@
                     declarations.add(
                         buildInit {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.INSTANCE_METHOD
                             initKind = SirInitializerKind.ORDINARY
                             visibility = SirVisibility.PUBLIC
                             isFailable = false
@@ -653,7 +650,6 @@
                     declarations.add(
                         buildInit {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.INSTANCE_METHOD
                             initKind = SirInitializerKind.REQUIRED
                             visibility = SirVisibility.PUBLIC
                             isFailable = false
@@ -684,7 +680,6 @@
                     declarations.add(
                         buildInit {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.INSTANCE_METHOD
                             initKind = SirInitializerKind.CONVENIENCE
                             visibility = SirVisibility.PUBLIC
                             isFailable = false
@@ -735,9 +730,7 @@
                         buildVariable {
                             name = "my_variable1"
                             type = SirNominalType(SirSwiftModule.bool)
-                            getter = buildGetter {
-                                kind = SirCallableKind.INSTANCE_METHOD
-                            }
+                            getter = buildGetter {}
                         }
                     )
 
@@ -745,9 +738,7 @@
                         buildVariable {
                             name = "my_variable2"
                             type = SirNominalType(SirSwiftModule.int8)
-                            getter = buildGetter {
-                                kind = SirCallableKind.INSTANCE_METHOD
-                            }
+                            getter = buildGetter {}
                         }
                     )
                     declarations.add(
@@ -756,14 +747,12 @@
                             type = SirNominalType(
                                 SirSwiftModule.int32,
                             ).optional()
-                            getter = buildGetter {
-                                kind = SirCallableKind.INSTANCE_METHOD
-                            }
+                            getter = buildGetter {}
                         }
                     )
-                }
+                }.attachDeclarations()
             )
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -825,7 +814,7 @@
             )
         }.apply {
             externalDefinedEnum.parent = this
-        }
+        }.attachDeclarations()
 
         val enum: SirEnum
         val module = buildModule {
@@ -874,7 +863,6 @@
                     declarations.add(
                         buildFunction {
                             origin = SirOrigin.Unknown
-                            kind = SirCallableKind.FUNCTION
                             visibility = SirVisibility.PUBLIC
                             name = "foo"
                             returnType = SirNominalType(SirSwiftModule.bool)
@@ -885,12 +873,10 @@
                         buildVariable {
                             name = "my_variable1"
                             type = SirNominalType(SirSwiftModule.bool)
-                            getter = buildGetter {
-                                kind = SirCallableKind.INSTANCE_METHOD
-                            }
+                            getter = buildGetter {}
                         }
                     )
-                }
+                }.attachDeclarations()
             )
 
             enum = buildEnum {
@@ -910,7 +896,7 @@
                             name = "Foo"
                         }
                     )
-                }
+                }.attachDeclarations()
             )
 
             declarations.add(
@@ -923,11 +909,11 @@
                             name = "Foo"
                         }
                     )
-                }
+                }.attachDeclarations()
             )
         }.apply {
             enum.parent = this
-        }
+        }.attachDeclarations()
 
         runTest(
             module,
@@ -976,13 +962,13 @@
                     name = "OPEN_PUBLIC"
                     origin = SirOrigin.Unknown
                     visibility = SirVisibility.PUBLIC
-                    modality = SirClassModality.OPEN
+                    modality = SirModality.OPEN
                 },
                 buildClass {
                     name = "FINAL_PUBLIC"
                     origin = SirOrigin.Unknown
                     visibility = SirVisibility.PUBLIC
-                    modality = SirClassModality.FINAL
+                    modality = SirModality.FINAL
                 },
                 buildClass {
                     name = "UNSPECIDIED_PUBLIC"
@@ -993,13 +979,13 @@
                     name = "OPEN_INTERNAL"
                     origin = SirOrigin.Unknown
                     visibility = SirVisibility.INTERNAL
-                    modality = SirClassModality.OPEN
+                    modality = SirModality.OPEN
                 },
                 buildClass {
                     name = "FINAL_INTERNAL"
                     origin = SirOrigin.Unknown
                     visibility = SirVisibility.INTERNAL
-                    modality = SirClassModality.FINAL
+                    modality = SirModality.FINAL
                 },
                 buildClass {
                     name = "UNSPECIFIED_INTERNAL"
@@ -1024,14 +1010,13 @@
             attributes += SirAttribute.Available(message = "Deprecated class", deprecated = true, obsoleted = false)
             declarations += buildFunction {
                 origin = SirOrigin.Unknown
-                kind = SirCallableKind.FUNCTION
                 visibility = SirVisibility.PUBLIC
                 name = "method"
                 returnType = SirNominalType(SirSwiftModule.bool)
                 documentation = "// Check that nested attributes handled properly"
                 attributes += SirAttribute.Available(message = "Available method", deprecated = false, obsoleted = false)
             }
-        }
+        }.attachDeclarations()
 
         val module = buildModule {
             name = "Test"
@@ -1039,7 +1024,6 @@
             addChild {
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     returnType = SirNominalType(SirSwiftModule.bool)
@@ -1050,9 +1034,7 @@
                 buildVariable {
                     name = "myVariable"
                     type = SirNominalType(SirSwiftModule.bool)
-                    getter = buildGetter {
-                        kind = SirCallableKind.INSTANCE_METHOD
-                    }
+                    getter = buildGetter {}
                     documentation = """
                             /// Example docstring
                         """.trimIndent()
@@ -1062,7 +1044,8 @@
             addChild {
                 clazz
             }
-        }
+        }.attachDeclarations()
+
         runTest(
             module,
             "testData/attributes"
@@ -1076,7 +1059,6 @@
             declarations.add(
                 buildFunction {
                     origin = SirOrigin.Unknown
-                    kind = SirCallableKind.FUNCTION
                     visibility = SirVisibility.PUBLIC
                     name = "foo"
                     returnType = SirNominalType(
@@ -1084,10 +1066,13 @@
                     ).optional()
                 }
             )
-        }
+        }.attachDeclarations()
+
         runTest(
             module,
             "testData/simple_function_returns_nullable"
         )
     }
 }
+
+private fun <T : SirDeclarationContainer> T.attachDeclarations(): T = also { declarations.forEach { it.parent = this } }
\ No newline at end of file
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineFunction.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineFunction.kt
index a19b29ab..d8b4d57 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineFunction.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineFunction.kt
@@ -16,9 +16,11 @@
     override val origin: SirOrigin get() = SirOrigin.Trampoline(source)
     override val visibility: SirVisibility get() = source.visibility
     override val documentation: String? get() = source.documentation
-    override val kind: SirCallableKind get() = SirCallableKind.FUNCTION
     override val name: String get() = source.name
     override val returnType: SirType get() = source.returnType
+    override val isOverride: Boolean get() = false
+    override val isInstance: Boolean get() = false
+    override val modality: SirModality get() = SirModality.UNSPECIFIED
 
     override val attributes: MutableList<SirAttribute> get() = source.attributes
 
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineVariable.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineVariable.kt
index 65e2628..47776df 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineVariable.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/nodes/SirTrampolineVariable.kt
@@ -19,11 +19,13 @@
     override val documentation: String? get() = source.documentation
     override val name: String get() = source.name
     override val type: SirType get() = source.type
+    override val isOverride: Boolean get() = false
+    override val isInstance: Boolean get() = false
+    override val modality: SirModality get() = SirModality.UNSPECIFIED
     override val attributes: MutableList<SirAttribute> get() = source.attributes
     override val getter: SirGetter by lazy {
         buildGetterCopy(source.getter) {
             origin = SirOrigin.Trampoline(source.getter)
-            kind = SirCallableKind.FUNCTION
             body = SirFunctionBody(
                 listOf(
                     source.swiftFqName
@@ -36,7 +38,6 @@
         source.setter?.let { setter ->
             buildSetterCopy(setter) {
                 origin = SirOrigin.Trampoline(setter)
-                kind = SirCallableKind.FUNCTION
                 body = SirFunctionBody(
                     listOf(
                         "${source.swiftFqName} = newValue"
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt
index 39a05886..70d2906 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/KotlinRuntimeModule.kt
@@ -33,14 +33,12 @@
             origin = KotlinRuntimeElement()
             declarations += buildInit {
                 origin = KotlinRuntimeElement()
-                kind = SirCallableKind.CLASS_METHOD
                 isFailable = false
                 initKind = SirInitializerKind.ORDINARY
                 isOverride = false
             }
             declarations += buildInit {
                 origin = KotlinRuntimeElement()
-                kind = SirCallableKind.CLASS_METHOD
                 isFailable = false
                 initKind = SirInitializerKind.ORDINARY
                 isOverride = false
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirAccessor.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirAccessor.kt
index dd51726..4905373 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirAccessor.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirAccessor.kt
@@ -11,12 +11,11 @@
 /**
  * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.accessor]
  */
-sealed class SirAccessor : SirCallable() {
+sealed class SirAccessor : SirElementBase(), SirCallable {
     abstract override val origin: SirOrigin
     abstract override val visibility: SirVisibility
     abstract override val documentation: String?
     abstract override var parent: SirDeclarationParent
     abstract override val attributes: MutableList<SirAttribute>
-    abstract override val kind: SirCallableKind
     abstract override var body: SirFunctionBody?
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirCallable.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirCallable.kt
index 40f5e44..3541b7f 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirCallable.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirCallable.kt
@@ -11,12 +11,11 @@
 /**
  * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.callable]
  */
-sealed class SirCallable : SirElementBase(), SirDeclaration {
-    abstract override val origin: SirOrigin
-    abstract override val visibility: SirVisibility
-    abstract override val documentation: String?
-    abstract override var parent: SirDeclarationParent
-    abstract override val attributes: MutableList<SirAttribute>
-    abstract val kind: SirCallableKind
-    abstract var body: SirFunctionBody?
+sealed interface SirCallable : SirDeclaration {
+    override val origin: SirOrigin
+    override val visibility: SirVisibility
+    override val documentation: String?
+    override var parent: SirDeclarationParent
+    override val attributes: MutableList<SirAttribute>
+    var body: SirFunctionBody?
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt
index 75b13ef..43a0170 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClass.kt
@@ -20,5 +20,5 @@
     abstract override val name: String
     abstract override val declarations: List<SirDeclaration>
     abstract val superClass: SirType?
-    abstract val modality: SirClassModality
+    abstract val modality: SirModality
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClassMemberDeclaration.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClassMemberDeclaration.kt
new file mode 100644
index 0000000..504248b
--- /dev/null
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirClassMemberDeclaration.kt
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+// This file was generated automatically. See native/swift/sir/tree-generator/Readme.md.
+// DO NOT MODIFY IT MANUALLY.
+
+package org.jetbrains.kotlin.sir
+
+/**
+ * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.classMemberDeclaration]
+ */
+sealed interface SirClassMemberDeclaration : SirDeclaration {
+    override val origin: SirOrigin
+    override val visibility: SirVisibility
+    override val documentation: String?
+    override var parent: SirDeclarationParent
+    override val attributes: MutableList<SirAttribute>
+    val isOverride: Boolean
+    val isInstance: Boolean
+    val modality: SirModality
+}
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt
index 6ac9ff9..9dba67f 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirFunction.kt
@@ -11,14 +11,16 @@
 /**
  * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.function]
  */
-abstract class SirFunction : SirCallable() {
+abstract class SirFunction : SirElementBase(), SirCallable, SirClassMemberDeclaration {
     abstract override val origin: SirOrigin
     abstract override val visibility: SirVisibility
     abstract override val documentation: String?
     abstract override var parent: SirDeclarationParent
     abstract override val attributes: MutableList<SirAttribute>
-    abstract override val kind: SirCallableKind
     abstract override var body: SirFunctionBody?
+    abstract override val isOverride: Boolean
+    abstract override val isInstance: Boolean
+    abstract override val modality: SirModality
     abstract val name: String
     abstract val parameters: List<SirParameter>
     abstract val returnType: SirType
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirGetter.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirGetter.kt
index 585c04b..7f99c35 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirGetter.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirGetter.kt
@@ -17,6 +17,5 @@
     abstract override val documentation: String?
     abstract override var parent: SirDeclarationParent
     abstract override val attributes: MutableList<SirAttribute>
-    abstract override val kind: SirCallableKind
     abstract override var body: SirFunctionBody?
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirInit.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirInit.kt
index f79b617..a6da7a8 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirInit.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirInit.kt
@@ -11,13 +11,12 @@
 /**
  * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.init]
  */
-abstract class SirInit : SirCallable() {
+abstract class SirInit : SirElementBase(), SirCallable {
     abstract override val origin: SirOrigin
     abstract override val visibility: SirVisibility
     abstract override val documentation: String?
     abstract override var parent: SirDeclarationParent
     abstract override val attributes: MutableList<SirAttribute>
-    abstract override val kind: SirCallableKind
     abstract override var body: SirFunctionBody?
     abstract val isFailable: Boolean
     abstract val parameters: List<SirParameter>
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirSetter.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirSetter.kt
index 574eb9f..4007dc2 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirSetter.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirSetter.kt
@@ -17,7 +17,6 @@
     abstract override val documentation: String?
     abstract override var parent: SirDeclarationParent
     abstract override val attributes: MutableList<SirAttribute>
-    abstract override val kind: SirCallableKind
     abstract override var body: SirFunctionBody?
     abstract val parameterName: String
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirVariable.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirVariable.kt
index e39ef34..3c16ac2 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirVariable.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirVariable.kt
@@ -11,12 +11,15 @@
 /**
  * Generated from: [org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree.variable]
  */
-abstract class SirVariable : SirElementBase(), SirDeclaration, SirDeclarationParent {
+abstract class SirVariable : SirElementBase(), SirDeclaration, SirDeclarationParent, SirClassMemberDeclaration {
     abstract override val origin: SirOrigin
     abstract override val visibility: SirVisibility
     abstract override val documentation: String?
     abstract override var parent: SirDeclarationParent
     abstract override val attributes: MutableList<SirAttribute>
+    abstract override val isOverride: Boolean
+    abstract override val isInstance: Boolean
+    abstract override val modality: SirModality
     abstract val name: String
     abstract val type: SirType
     abstract val getter: SirGetter
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt
index b7800c9..5c095c5 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirClassBuilder.kt
@@ -23,7 +23,7 @@
     lateinit var name: String
     val declarations: MutableList<SirDeclaration> = mutableListOf()
     var superClass: SirType? = null
-    var modality: SirClassModality = SirClassModality.UNSPECIFIED
+    var modality: SirModality = SirModality.UNSPECIFIED
 
     fun build(): SirClass {
         return SirClassImpl(
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt
index 8cfbceb..81c4cde 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirFunctionBuilder.kt
@@ -20,8 +20,10 @@
     var visibility: SirVisibility = SirVisibility.PUBLIC
     var documentation: String? = null
     val attributes: MutableList<SirAttribute> = mutableListOf()
-    lateinit var kind: SirCallableKind
     var body: SirFunctionBody? = null
+    var isOverride: Boolean = false
+    var isInstance: Boolean = true
+    var modality: SirModality = SirModality.UNSPECIFIED
     lateinit var name: String
     val parameters: MutableList<SirParameter> = mutableListOf()
     lateinit var returnType: SirType
@@ -32,8 +34,10 @@
             visibility,
             documentation,
             attributes,
-            kind,
             body,
+            isOverride,
+            isInstance,
+            modality,
             name,
             parameters,
             returnType,
@@ -60,8 +64,10 @@
     copyBuilder.visibility = original.visibility
     copyBuilder.documentation = original.documentation
     copyBuilder.attributes.addAll(original.attributes)
-    copyBuilder.kind = original.kind
     copyBuilder.body = original.body
+    copyBuilder.isOverride = original.isOverride
+    copyBuilder.isInstance = original.isInstance
+    copyBuilder.modality = original.modality
     copyBuilder.name = original.name
     copyBuilder.parameters.addAll(original.parameters)
     copyBuilder.returnType = original.returnType
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirGetterBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirGetterBuilder.kt
index be48634..edc303b 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirGetterBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirGetterBuilder.kt
@@ -20,7 +20,6 @@
     var visibility: SirVisibility = SirVisibility.PUBLIC
     var documentation: String? = null
     val attributes: MutableList<SirAttribute> = mutableListOf()
-    lateinit var kind: SirCallableKind
     var body: SirFunctionBody? = null
 
     fun build(): SirGetter {
@@ -29,7 +28,6 @@
             visibility,
             documentation,
             attributes,
-            kind,
             body,
         )
     }
@@ -37,7 +35,7 @@
 }
 
 @OptIn(ExperimentalContracts::class)
-inline fun buildGetter(init: SirGetterBuilder.() -> Unit): SirGetter {
+inline fun buildGetter(init: SirGetterBuilder.() -> Unit = {}): SirGetter {
     contract {
         callsInPlace(init, InvocationKind.EXACTLY_ONCE)
     }
@@ -45,7 +43,7 @@
 }
 
 @OptIn(ExperimentalContracts::class)
-inline fun buildGetterCopy(original: SirGetter, init: SirGetterBuilder.() -> Unit): SirGetter {
+inline fun buildGetterCopy(original: SirGetter, init: SirGetterBuilder.() -> Unit = {}): SirGetter {
     contract {
         callsInPlace(init, InvocationKind.EXACTLY_ONCE)
     }
@@ -54,7 +52,6 @@
     copyBuilder.visibility = original.visibility
     copyBuilder.documentation = original.documentation
     copyBuilder.attributes.addAll(original.attributes)
-    copyBuilder.kind = original.kind
     copyBuilder.body = original.body
     return copyBuilder.apply(init).build()
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirInitBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirInitBuilder.kt
index e456ce4..b94ed49 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirInitBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirInitBuilder.kt
@@ -20,12 +20,11 @@
     var visibility: SirVisibility = SirVisibility.PUBLIC
     var documentation: String? = null
     val attributes: MutableList<SirAttribute> = mutableListOf()
-    lateinit var kind: SirCallableKind
     var body: SirFunctionBody? = null
     var isFailable: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
     val parameters: MutableList<SirParameter> = mutableListOf()
     lateinit var initKind: SirInitializerKind
-    var isOverride: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
+    var isOverride: Boolean = false
 
     fun build(): SirInit {
         return SirInitImpl(
@@ -33,7 +32,6 @@
             visibility,
             documentation,
             attributes,
-            kind,
             body,
             isFailable,
             parameters,
@@ -62,7 +60,6 @@
     copyBuilder.visibility = original.visibility
     copyBuilder.documentation = original.documentation
     copyBuilder.attributes.addAll(original.attributes)
-    copyBuilder.kind = original.kind
     copyBuilder.body = original.body
     copyBuilder.isFailable = original.isFailable
     copyBuilder.parameters.addAll(original.parameters)
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirSetterBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirSetterBuilder.kt
index b9a6c66..5c64cbf 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirSetterBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirSetterBuilder.kt
@@ -20,7 +20,6 @@
     var visibility: SirVisibility = SirVisibility.PUBLIC
     var documentation: String? = null
     val attributes: MutableList<SirAttribute> = mutableListOf()
-    lateinit var kind: SirCallableKind
     var body: SirFunctionBody? = null
     var parameterName: String = "newValue"
 
@@ -30,7 +29,6 @@
             visibility,
             documentation,
             attributes,
-            kind,
             body,
             parameterName,
         )
@@ -39,7 +37,7 @@
 }
 
 @OptIn(ExperimentalContracts::class)
-inline fun buildSetter(init: SirSetterBuilder.() -> Unit): SirSetter {
+inline fun buildSetter(init: SirSetterBuilder.() -> Unit = {}): SirSetter {
     contract {
         callsInPlace(init, InvocationKind.EXACTLY_ONCE)
     }
@@ -47,7 +45,7 @@
 }
 
 @OptIn(ExperimentalContracts::class)
-inline fun buildSetterCopy(original: SirSetter, init: SirSetterBuilder.() -> Unit): SirSetter {
+inline fun buildSetterCopy(original: SirSetter, init: SirSetterBuilder.() -> Unit = {}): SirSetter {
     contract {
         callsInPlace(init, InvocationKind.EXACTLY_ONCE)
     }
@@ -56,7 +54,6 @@
     copyBuilder.visibility = original.visibility
     copyBuilder.documentation = original.documentation
     copyBuilder.attributes.addAll(original.attributes)
-    copyBuilder.kind = original.kind
     copyBuilder.body = original.body
     copyBuilder.parameterName = original.parameterName
     return copyBuilder.apply(init).build()
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirVariableBuilder.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirVariableBuilder.kt
index e90dacf..bd3f55b 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirVariableBuilder.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/builder/SirVariableBuilder.kt
@@ -20,6 +20,9 @@
     var visibility: SirVisibility = SirVisibility.PUBLIC
     var documentation: String? = null
     val attributes: MutableList<SirAttribute> = mutableListOf()
+    var isOverride: Boolean = false
+    var isInstance: Boolean = true
+    var modality: SirModality = SirModality.UNSPECIFIED
     lateinit var name: String
     lateinit var type: SirType
     lateinit var getter: SirGetter
@@ -31,6 +34,9 @@
             visibility,
             documentation,
             attributes,
+            isOverride,
+            isInstance,
+            modality,
             name,
             type,
             getter,
@@ -58,6 +64,9 @@
     copyBuilder.visibility = original.visibility
     copyBuilder.documentation = original.documentation
     copyBuilder.attributes.addAll(original.attributes)
+    copyBuilder.isOverride = original.isOverride
+    copyBuilder.isInstance = original.isInstance
+    copyBuilder.modality = original.modality
     copyBuilder.name = original.name
     copyBuilder.type = original.type
     copyBuilder.getter = original.getter
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt
index affe120..0a01aca 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirClassImpl.kt
@@ -20,7 +20,7 @@
     override val name: String,
     override val declarations: MutableList<SirDeclaration>,
     override val superClass: SirType?,
-    override val modality: SirClassModality,
+    override val modality: SirModality,
 ) : SirClass() {
     override lateinit var parent: SirDeclarationParent
 }
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt
index bfb9181..a888ff7 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirFunctionImpl.kt
@@ -17,8 +17,10 @@
     override val visibility: SirVisibility,
     override val documentation: String?,
     override val attributes: MutableList<SirAttribute>,
-    override val kind: SirCallableKind,
     override var body: SirFunctionBody?,
+    override val isOverride: Boolean,
+    override val isInstance: Boolean,
+    override val modality: SirModality,
     override val name: String,
     override val parameters: MutableList<SirParameter>,
     override val returnType: SirType,
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirGetterImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirGetterImpl.kt
index 8f0f59f..4f254b4 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirGetterImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirGetterImpl.kt
@@ -17,7 +17,6 @@
     override val visibility: SirVisibility,
     override val documentation: String?,
     override val attributes: MutableList<SirAttribute>,
-    override val kind: SirCallableKind,
     override var body: SirFunctionBody?,
 ) : SirGetter() {
     override lateinit var parent: SirDeclarationParent
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirInitImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirInitImpl.kt
index fbcbd47..7486855 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirInitImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirInitImpl.kt
@@ -17,7 +17,6 @@
     override val visibility: SirVisibility,
     override val documentation: String?,
     override val attributes: MutableList<SirAttribute>,
-    override val kind: SirCallableKind,
     override var body: SirFunctionBody?,
     override val isFailable: Boolean,
     override val parameters: MutableList<SirParameter>,
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirSetterImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirSetterImpl.kt
index 4f7cc84..f6fa9c7 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirSetterImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirSetterImpl.kt
@@ -17,7 +17,6 @@
     override val visibility: SirVisibility,
     override val documentation: String?,
     override val attributes: MutableList<SirAttribute>,
-    override val kind: SirCallableKind,
     override var body: SirFunctionBody?,
     override val parameterName: String,
 ) : SirSetter() {
diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirVariableImpl.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirVariableImpl.kt
index fbd2393..be7e3f2 100644
--- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirVariableImpl.kt
+++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/impl/SirVariableImpl.kt
@@ -17,6 +17,9 @@
     override val visibility: SirVisibility,
     override val documentation: String?,
     override val attributes: MutableList<SirAttribute>,
+    override val isOverride: Boolean,
+    override val isInstance: Boolean,
+    override val modality: SirModality,
     override val name: String,
     override val type: SirType,
     override val getter: SirGetter,
diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirCallableKind.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirCallableKind.kt
index c7e753a..0eb06f6 100644
--- a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirCallableKind.kt
+++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirCallableKind.kt
@@ -9,8 +9,19 @@
     FUNCTION,
     INSTANCE_METHOD,
     CLASS_METHOD,
-    STATIC_METHOD,
 }
 
-val SirVariable.kind: SirCallableKind
-    get() = getter.kind
+val SirCallable.kind: SirCallableKind
+    get() = when (this) {
+        is SirSetter, is SirGetter -> (parent as SirVariable).kind
+        is SirFunction -> (this as SirClassMemberDeclaration).kind
+        is SirInit -> SirCallableKind.CLASS_METHOD
+    }
+
+val SirClassMemberDeclaration.kind: SirCallableKind
+    get() = if (parent is SirModule)
+        SirCallableKind.FUNCTION
+    else if (isInstance)
+        SirCallableKind.INSTANCE_METHOD
+    else
+        SirCallableKind.CLASS_METHOD
\ No newline at end of file
diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirClassModality.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirClassModality.kt
deleted file mode 100644
index afe642b..0000000
--- a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirClassModality.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * 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 SirClassModality {
-    OPEN,
-    FINAL,
-    UNSPECIFIED,
-}
\ No newline at end of file
diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/SirModality.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirModality.kt
new file mode 100644
index 0000000..d5dfc65
--- /dev/null
+++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/SirModality.kt
@@ -0,0 +1,18 @@
+/*
+ * 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 SirModality {
+    OPEN,
+    FINAL,
+    UNSPECIFIED,
+}
+
+val SirClassMemberDeclaration.effectiveModality: SirModality
+    get() = when ((this.parent as? SirClass)?.modality) {
+        SirModality.FINAL -> SirModality.FINAL
+        else -> this.modality
+    }
\ No newline at end of file
diff --git a/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirExtensions.kt b/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirExtensions.kt
index 2e85713..7fbff95 100644
--- a/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirExtensions.kt
+++ b/native/swift/sir/src/org/jetbrains/kotlin/sir/util/SirExtensions.kt
@@ -74,4 +74,4 @@
     get() = swiftParentNamePrefix?.let { "$it.$name" } ?: name
 
 val SirVariable.swiftFqName: String
-    get() = swiftParentNamePrefix?.let { "$it.$name" } ?: name
\ No newline at end of file
+    get() = swiftParentNamePrefix?.let { "$it.$name" } ?: name
diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/BuilderConfigurator.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/BuilderConfigurator.kt
index be106e4..5240803 100644
--- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/BuilderConfigurator.kt
+++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/BuilderConfigurator.kt
@@ -23,8 +23,16 @@
             default(it, "SirVisibility.PUBLIC")
         }
 
+        configureFieldInAllLeafBuilders("isOverride") {
+            default(it, "false")
+        }
+
+        configureFieldInAllLeafBuilders("isInstance") {
+            default(it, "true")
+        }
+
         configureFieldInAllLeafBuilders("modality") {
-            default(it, "SirClassModality.UNSPECIFIED")
+            default(it, "SirModality.UNSPECIFIED")
         }
 
         builder(setter) {
diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt
index b657ab8..0e29453 100644
--- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt
+++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/SwiftIrTree.kt
@@ -53,6 +53,15 @@
         +listField("attributes", attributeType, isMutableList = true)
     }
 
+    val classMemberDeclaration by sealedElement {
+        customParentInVisitor = declaration
+        parent(declaration)
+
+        +field("isOverride", boolean)
+        +field("isInstance", boolean)
+        +field("modality", modalityKind)
+    }
+
     val extension: Element by element {
         customParentInVisitor = declaration
         parent(declaration)
@@ -106,7 +115,6 @@
     val callable by sealedElement {
         parent(declaration)
 
-        +field("kind", callableKind)
         +field("body", functionBodyType, nullable = true, mutable = true)
     }
 
@@ -125,6 +133,7 @@
     val function by element {
         customParentInVisitor = callable
         parent(callable)
+        parent(classMemberDeclaration)
 
         +field("name", string)
         +listField("parameters", parameterType)
@@ -150,6 +159,7 @@
         customParentInVisitor = declaration
         parent(declaration)
         parent(declarationParent)
+        parent(classMemberDeclaration)
 
         +field("name", string)
         +field("type", typeType)
diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt
index 684df11..c33b78f 100644
--- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt
+++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt
@@ -18,7 +18,7 @@
 val callableKind = type(BASE_PACKAGE, "SirCallableKind", TypeKind.Class)
 val initKind = type(BASE_PACKAGE, "SirInitializerKind", TypeKind.Class)
 val importType = type(BASE_PACKAGE, "SirImport", TypeKind.Class)
-val modalityKind = type(BASE_PACKAGE, "SirClassModality", TypeKind.Class)
+val modalityKind = type(BASE_PACKAGE, "SirModality", TypeKind.Class)
 val attributeType = type(BASE_PACKAGE, "SirAttribute", TypeKind.Class)
 
 val swiftIrImplementationDetailAnnotation = type(BASE_PACKAGE, "SirImplementationDetail", TypeKind.Class)