Default arguments stored in function declarations.
This commit is contained in:
committed by
Dmitry Petrov
parent
2d2100b1b5
commit
865d2c43c7
@@ -22,7 +22,7 @@ const val ARGUMENT0_SLOT = 0
|
||||
const val ARGUMENT1_SLOT = 1
|
||||
const val DISPATCH_RECEIVER_SLOT = -1
|
||||
const val EXTENSION_RECEIVER_SLOT = -2
|
||||
const val FUNCTION_BODY_SLOT = 0
|
||||
const val FUNCTION_BODY_SLOT = -1
|
||||
const val MODULE_SLOT = 0
|
||||
const val INITIALIZER_SLOT = 0
|
||||
const val IF_CONDITION_SLOT = 0
|
||||
|
||||
+34
-3
@@ -17,11 +17,14 @@
|
||||
package org.jetbrains.kotlin.ir.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import java.util.*
|
||||
|
||||
interface IrFunction : IrDeclaration {
|
||||
interface IrGeneralFunction : IrDeclaration {
|
||||
override val descriptor: FunctionDescriptor
|
||||
val body: IrBody?
|
||||
|
||||
@@ -29,11 +32,16 @@ interface IrFunction : IrDeclaration {
|
||||
get() = IrDeclarationKind.FUNCTION
|
||||
}
|
||||
|
||||
abstract class IrFunctionBase(
|
||||
interface IrFunction : IrGeneralFunction {
|
||||
fun putDefault(parameter: ValueParameterDescriptor, expressionBody: IrExpressionBody)
|
||||
fun getDefault(parameter: ValueParameterDescriptor): IrExpressionBody?
|
||||
}
|
||||
|
||||
abstract class IrGeneralFunctionBase(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin
|
||||
) : IrDeclarationBase(startOffset, endOffset, origin), IrFunction {
|
||||
) : IrDeclarationBase(startOffset, endOffset, origin), IrGeneralFunction {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
@@ -69,6 +77,29 @@ abstract class IrFunctionBase(
|
||||
}
|
||||
}
|
||||
|
||||
abstract class IrFunctionBase(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin
|
||||
) : IrGeneralFunctionBase(startOffset, endOffset, origin), IrFunction {
|
||||
private val defaults = LinkedHashMap<ValueParameterDescriptor, IrExpressionBody>()
|
||||
|
||||
override fun getDefault(parameter: ValueParameterDescriptor): IrExpressionBody? =
|
||||
defaults[parameter]
|
||||
|
||||
override fun putDefault(parameter: ValueParameterDescriptor, expressionBody: IrExpressionBody) {
|
||||
expressionBody.assertDetached()
|
||||
defaults[parameter]?.detach()
|
||||
defaults[parameter] = expressionBody
|
||||
expressionBody.setTreeLocation(this, parameter.index)
|
||||
}
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
defaults.values.forEach { it.accept(visitor, data) }
|
||||
body?.accept(visitor, data)
|
||||
}
|
||||
}
|
||||
|
||||
class IrFunctionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
|
||||
interface IrPropertyAccessor : IrFunction {
|
||||
interface IrPropertyAccessor : IrGeneralFunction {
|
||||
override val descriptor: PropertyAccessorDescriptor
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ abstract class IrPropertyAccessorBase(
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
body: IrBody
|
||||
) : IrFunctionBase(startOffset, endOffset, origin, body), IrPropertyAccessor
|
||||
) : IrGeneralFunctionBase(startOffset, endOffset, origin, body), IrPropertyAccessor
|
||||
|
||||
class IrPropertyGetterImpl(
|
||||
startOffset: Int,
|
||||
|
||||
@@ -18,9 +18,7 @@ package org.jetbrains.kotlin.ir.util
|
||||
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.SourceLocationManager
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.utils.Printer
|
||||
@@ -45,6 +43,23 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor<Unit, String> {
|
||||
element.dumpLabeledSubTree(data)
|
||||
}
|
||||
|
||||
override fun visitFunction(declaration: IrFunction, data: String) {
|
||||
visitFunctionWithParameters(declaration, data)
|
||||
}
|
||||
|
||||
override fun visitConstructor(declaration: IrConstructor, data: String) {
|
||||
visitFunctionWithParameters(declaration, data)
|
||||
}
|
||||
|
||||
private fun visitFunctionWithParameters(declaration: IrFunction, data: String) {
|
||||
declaration.dumpLabeledElementWith(data) {
|
||||
declaration.descriptor.valueParameters.forEach { valueParameter ->
|
||||
declaration.getDefault(valueParameter)?.accept(this, valueParameter.name.asString())
|
||||
}
|
||||
declaration.body?.accept(this, "")
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitClass(declaration: IrClass, data: String) {
|
||||
declaration.dumpLabeledElementWith(data) {
|
||||
declaration.nestedInitializers?.accept(this, "nestedInitializers")
|
||||
|
||||
@@ -42,6 +42,9 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
override fun visitFunction(declaration: IrFunction, data: Nothing?): String =
|
||||
"FUN ${declaration.descriptor.render()}"
|
||||
|
||||
override fun visitConstructor(declaration: IrConstructor, data: Nothing?): String =
|
||||
"CONSTRUCTOR ${declaration.descriptor.render()}"
|
||||
|
||||
override fun visitProperty(declaration: IrProperty, data: Nothing?): String =
|
||||
"PROPERTY ${declaration.descriptor.render()}"
|
||||
|
||||
|
||||
@@ -28,10 +28,11 @@ interface IrElementVisitor<out R, in D> {
|
||||
fun visitDeclaration(declaration: IrDeclaration, data: D): R = visitElement(declaration, data)
|
||||
fun visitClass(declaration: IrClass, data: D): R = visitDeclaration(declaration, data)
|
||||
fun visitTypeAlias(declaration: IrTypeAlias, data: D): R = visitDeclaration(declaration, data)
|
||||
fun visitFunction(declaration: IrFunction, data: D): R = visitDeclaration(declaration, data)
|
||||
fun visitPropertyGetter(declaration: IrPropertyGetter, data: D): R = visitFunction(declaration, data)
|
||||
fun visitPropertySetter(declaration: IrPropertySetter, data: D): R = visitFunction(declaration, data)
|
||||
fun visitConstructor(declaration: IrConstructor, data: D): R = visitFunction(declaration, data)
|
||||
fun visitGeneralFunction(declaration: IrGeneralFunction, data: D) = visitDeclaration(declaration, data)
|
||||
fun visitFunction(declaration: IrFunction, data: D): R = visitGeneralFunction(declaration, data)
|
||||
fun visitPropertyGetter(declaration: IrPropertyGetter, data: D): R = visitGeneralFunction(declaration, data)
|
||||
fun visitPropertySetter(declaration: IrPropertySetter, data: D): R = visitGeneralFunction(declaration, data)
|
||||
fun visitConstructor(declaration: IrConstructor, data: D): R = visitGeneralFunction(declaration, data)
|
||||
fun visitProperty(declaration: IrProperty, data: D): R = visitDeclaration(declaration, data)
|
||||
fun visitSimpleProperty(declaration: IrSimpleProperty, data: D): R = visitProperty(declaration, data)
|
||||
fun visitDelegatedProperty(declaration: IrDelegatedProperty, data: D): R = visitProperty(declaration, data)
|
||||
|
||||
Reference in New Issue
Block a user