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:
+11
-6
@@ -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)
|
||||||
|
}
|
||||||
+39
-10
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -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"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user