Implement property references in JVM_IR

This commit is contained in:
pyos
2019-03-08 14:59:54 +01:00
committed by max-kammerer
parent 43be01bbc8
commit 330c4648cb
11 changed files with 406 additions and 48 deletions
@@ -159,11 +159,6 @@ class ClosureAnnotator(declaration: IrDeclaration) {
includeInParent(closureBuilder)
}
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) {
// Getter and setter of local delegated properties are special generated functions and don't have closure.
declaration.delegate.initializer?.acceptVoid(this)
}
override fun visitVariableAccess(expression: IrValueAccessExpression) {
closuresStack.peek()?.seeVariable(expression.symbol)
super.visitVariableAccess(expression)
@@ -199,7 +194,11 @@ class ClosureAnnotator(declaration: IrDeclaration) {
processMemberAccess(expression.symbol.owner)
}
// override fun visitPropertyReference(expression: IrPropertyReference) = processMemberAccess(expression.)
override fun visitPropertyReference(expression: IrPropertyReference) {
expression.acceptChildrenVoid(this)
expression.getter?.let { processMemberAccess(it.owner) }
expression.setter?.let { processMemberAccess(it.owner) }
}
private fun processMemberAccess(declaration: IrDeclaration) {
if (DescriptorUtils.isLocal(declaration.descriptor)) {
@@ -230,6 +230,9 @@ class LocalDeclarationsLowering(
}
private inner class FunctionBodiesRewriter(val localContext: LocalContext?) : IrElementTransformerVoid() {
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) =
// Both accessors extracted as closures.
declaration.delegate.transform(this, null)
override fun visitClass(declaration: IrClass) = if (declaration in localClasses) {
// Replace local class definition with an empty composite.
@@ -742,11 +745,6 @@ class LocalDeclarationsLowering(
val localClassContext = LocalClassContext(declaration)
localClasses[declaration] = localClassContext
}
override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) {
// Getter and setter of local delegated properties are special generated functions and don't have closure.
declaration.delegate.initializer?.acceptVoid(this)
}
})
}
}