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:
@@ -18,6 +18,7 @@ sealed class SirAccessor : SirCallable() {
|
||||
abstract override val origin: SirOrigin
|
||||
abstract override val visibility: SirVisibility
|
||||
abstract override var parent: SirDeclarationParent
|
||||
abstract override val kind: SirCallableKind
|
||||
abstract var body: SirFunctionBody?
|
||||
|
||||
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 visibility: SirVisibility
|
||||
abstract override var parent: SirDeclarationParent
|
||||
abstract val kind: SirCallableKind
|
||||
|
||||
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
|
||||
visitor.visitCallable(this, data)
|
||||
|
||||
@@ -18,7 +18,7 @@ abstract class SirFunction : SirCallable() {
|
||||
abstract override val origin: SirOrigin
|
||||
abstract override val visibility: SirVisibility
|
||||
abstract override var parent: SirDeclarationParent
|
||||
abstract val isStatic: Boolean
|
||||
abstract override val kind: SirCallableKind
|
||||
abstract val name: String
|
||||
abstract val parameters: List<SirParameter>
|
||||
abstract val returnType: SirType
|
||||
|
||||
@@ -18,6 +18,7 @@ abstract class SirGetter : SirAccessor() {
|
||||
abstract override val origin: SirOrigin
|
||||
abstract override val visibility: SirVisibility
|
||||
abstract override var parent: SirDeclarationParent
|
||||
abstract override val kind: SirCallableKind
|
||||
abstract override var body: SirFunctionBody?
|
||||
|
||||
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 visibility: SirVisibility
|
||||
abstract override var parent: SirDeclarationParent
|
||||
abstract override val kind: SirCallableKind
|
||||
abstract override var body: SirFunctionBody?
|
||||
abstract val parameterName: String
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ abstract class SirVariable : SirDeclarationParent(), SirDeclaration {
|
||||
abstract val type: SirType
|
||||
abstract val getter: SirGetter
|
||||
abstract val setter: SirSetter?
|
||||
abstract val isStatic: Boolean
|
||||
|
||||
override fun <R, D> accept(visitor: SirVisitor<R, D>, data: D): R =
|
||||
visitor.visitVariable(this, data)
|
||||
|
||||
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.sir.impl.SirFunctionImpl
|
||||
class SirFunctionBuilder {
|
||||
var origin: SirOrigin = SirOrigin.Unknown
|
||||
var visibility: SirVisibility = SirVisibility.PUBLIC
|
||||
var isStatic: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||
lateinit var kind: SirCallableKind
|
||||
lateinit var name: String
|
||||
val parameters: MutableList<SirParameter> = mutableListOf()
|
||||
lateinit var returnType: SirType
|
||||
@@ -29,7 +29,7 @@ class SirFunctionBuilder {
|
||||
return SirFunctionImpl(
|
||||
origin,
|
||||
visibility,
|
||||
isStatic,
|
||||
kind,
|
||||
name,
|
||||
parameters,
|
||||
returnType,
|
||||
@@ -56,7 +56,7 @@ inline fun buildFunctionCopy(original: SirFunction, init: SirFunctionBuilder.()
|
||||
val copyBuilder = SirFunctionBuilder()
|
||||
copyBuilder.origin = original.origin
|
||||
copyBuilder.visibility = original.visibility
|
||||
copyBuilder.isStatic = original.isStatic
|
||||
copyBuilder.kind = original.kind
|
||||
copyBuilder.name = original.name
|
||||
copyBuilder.parameters.addAll(original.parameters)
|
||||
copyBuilder.returnType = original.returnType
|
||||
|
||||
@@ -18,12 +18,14 @@ import org.jetbrains.kotlin.sir.impl.SirGetterImpl
|
||||
class SirGetterBuilder {
|
||||
var origin: SirOrigin = SirOrigin.Unknown
|
||||
var visibility: SirVisibility = SirVisibility.PUBLIC
|
||||
lateinit var kind: SirCallableKind
|
||||
var body: SirFunctionBody? = null
|
||||
|
||||
fun build(): SirGetter {
|
||||
return SirGetterImpl(
|
||||
origin,
|
||||
visibility,
|
||||
kind,
|
||||
body,
|
||||
)
|
||||
}
|
||||
@@ -31,7 +33,7 @@ class SirGetterBuilder {
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildGetter(init: SirGetterBuilder.() -> Unit = {}): SirGetter {
|
||||
inline fun buildGetter(init: SirGetterBuilder.() -> Unit): SirGetter {
|
||||
contract {
|
||||
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
@@ -39,13 +41,14 @@ inline fun buildGetter(init: SirGetterBuilder.() -> Unit = {}): SirGetter {
|
||||
}
|
||||
|
||||
@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)
|
||||
}
|
||||
val copyBuilder = SirGetterBuilder()
|
||||
copyBuilder.origin = original.origin
|
||||
copyBuilder.visibility = original.visibility
|
||||
copyBuilder.kind = original.kind
|
||||
copyBuilder.body = original.body
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.sir.impl.SirSetterImpl
|
||||
class SirSetterBuilder {
|
||||
var origin: SirOrigin = SirOrigin.Unknown
|
||||
var visibility: SirVisibility = SirVisibility.PUBLIC
|
||||
lateinit var kind: SirCallableKind
|
||||
var body: SirFunctionBody? = null
|
||||
var parameterName: String = "newValue"
|
||||
|
||||
@@ -25,6 +26,7 @@ class SirSetterBuilder {
|
||||
return SirSetterImpl(
|
||||
origin,
|
||||
visibility,
|
||||
kind,
|
||||
body,
|
||||
parameterName,
|
||||
)
|
||||
@@ -33,7 +35,7 @@ class SirSetterBuilder {
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
inline fun buildSetter(init: SirSetterBuilder.() -> Unit = {}): SirSetter {
|
||||
inline fun buildSetter(init: SirSetterBuilder.() -> Unit): SirSetter {
|
||||
contract {
|
||||
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
|
||||
}
|
||||
@@ -41,13 +43,14 @@ inline fun buildSetter(init: SirSetterBuilder.() -> Unit = {}): SirSetter {
|
||||
}
|
||||
|
||||
@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)
|
||||
}
|
||||
val copyBuilder = SirSetterBuilder()
|
||||
copyBuilder.origin = original.origin
|
||||
copyBuilder.visibility = original.visibility
|
||||
copyBuilder.kind = original.kind
|
||||
copyBuilder.body = original.body
|
||||
copyBuilder.parameterName = original.parameterName
|
||||
return copyBuilder.apply(init).build()
|
||||
|
||||
@@ -22,7 +22,6 @@ class SirVariableBuilder {
|
||||
lateinit var type: SirType
|
||||
lateinit var getter: SirGetter
|
||||
var setter: SirSetter? = null
|
||||
var isStatic: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
|
||||
|
||||
fun build(): SirVariable {
|
||||
return SirVariableImpl(
|
||||
@@ -32,7 +31,6 @@ class SirVariableBuilder {
|
||||
type,
|
||||
getter,
|
||||
setter,
|
||||
isStatic,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -58,6 +56,5 @@ inline fun buildVariableCopy(original: SirVariable, init: SirVariableBuilder.()
|
||||
copyBuilder.type = original.type
|
||||
copyBuilder.getter = original.getter
|
||||
copyBuilder.setter = original.setter
|
||||
copyBuilder.isStatic = original.isStatic
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
|
||||
internal class SirFunctionImpl(
|
||||
override val origin: SirOrigin,
|
||||
override val visibility: SirVisibility,
|
||||
override val isStatic: Boolean,
|
||||
override val kind: SirCallableKind,
|
||||
override val name: String,
|
||||
override val parameters: MutableList<SirParameter>,
|
||||
override val returnType: SirType,
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
|
||||
internal class SirGetterImpl(
|
||||
override val origin: SirOrigin,
|
||||
override val visibility: SirVisibility,
|
||||
override val kind: SirCallableKind,
|
||||
override var body: SirFunctionBody?,
|
||||
) : SirGetter() {
|
||||
override lateinit var parent: SirDeclarationParent
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.sir.visitors.SirVisitor
|
||||
internal class SirSetterImpl(
|
||||
override val origin: SirOrigin,
|
||||
override val visibility: SirVisibility,
|
||||
override val kind: SirCallableKind,
|
||||
override var body: SirFunctionBody?,
|
||||
override val parameterName: String,
|
||||
) : SirSetter() {
|
||||
|
||||
@@ -21,7 +21,6 @@ internal class SirVariableImpl(
|
||||
override val type: SirType,
|
||||
override val getter: SirGetter,
|
||||
override val setter: SirSetter?,
|
||||
override val isStatic: Boolean,
|
||||
) : SirVariable() {
|
||||
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)
|
||||
*/
|
||||
data object Unknown : SirOrigin
|
||||
}
|
||||
}
|
||||
|
||||
+2
-3
@@ -76,13 +76,14 @@ object SwiftIrTree : AbstractSwiftIrTreeBuilder() {
|
||||
|
||||
val callable by sealedElement {
|
||||
parent(declaration)
|
||||
|
||||
+field("kind", callableKind)
|
||||
}
|
||||
|
||||
val function by element {
|
||||
customParentInVisitor = callable
|
||||
parent(callable)
|
||||
|
||||
+field("isStatic", boolean) // todo: KT-65046 Method|function distinction in SIR
|
||||
+field("name", string)
|
||||
+listField("parameters", parameterType)
|
||||
+field("returnType", typeType)
|
||||
@@ -118,8 +119,6 @@ object SwiftIrTree : AbstractSwiftIrTreeBuilder() {
|
||||
|
||||
+field("getter", getter)
|
||||
+field("setter", setter, nullable = true)
|
||||
|
||||
+field("isStatic", boolean) // todo: KT-65046 Method|function distinction in SIR
|
||||
}
|
||||
|
||||
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 enumCaseType = type(BASE_PACKAGE, "SirEnumCase", 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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user