Extracted some common code.
Sometimes it would be nice to know context during IR rewriting, this is when IrElementTransformerVoidWithContext comes in handy.
This commit is contained in:
+44
@@ -0,0 +1,44 @@
|
|||||||
|
package org.jetbrains.kotlin.backend.common
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
|
|
||||||
|
abstract class IrElementTransformerVoidWithContext(): IrElementTransformerVoid() {
|
||||||
|
private fun <E> MutableList<E>.push(element: E) = this.add(element)
|
||||||
|
|
||||||
|
private fun <E> MutableList<E>.pop() = this.removeAt(size - 1)
|
||||||
|
|
||||||
|
private fun <E> MutableList<E>.peek(): E? = if (size == 0) null else this[size - 1]
|
||||||
|
|
||||||
|
private val functionsStack = mutableListOf<FunctionDescriptor>()
|
||||||
|
private val classesStack = mutableListOf<ClassDescriptor>()
|
||||||
|
|
||||||
|
override final fun visitFunction(declaration: IrFunction): IrStatement {
|
||||||
|
functionsStack.push(declaration.descriptor)
|
||||||
|
val result = visitFunctionNew(declaration)
|
||||||
|
functionsStack.pop()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
override final fun visitClass(declaration: IrClass): IrStatement {
|
||||||
|
classesStack.push(declaration.descriptor)
|
||||||
|
val result = visitClassNew(declaration)
|
||||||
|
classesStack.pop()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
protected val currentFunction get() = functionsStack.peek()
|
||||||
|
protected val currentClass get() = classesStack.peek()
|
||||||
|
|
||||||
|
open fun visitFunctionNew(declaration: IrFunction) : IrStatement {
|
||||||
|
return super.visitFunction(declaration)
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun visitClassNew(declaration: IrClass) : IrStatement {
|
||||||
|
return super.visitClass(declaration)
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-20
@@ -1,14 +1,13 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.lower
|
package org.jetbrains.kotlin.backend.konan.lower
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
||||||
|
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||||
import org.jetbrains.kotlin.backend.common.lower.callsSuper
|
import org.jetbrains.kotlin.backend.common.lower.callsSuper
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
@@ -17,7 +16,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
|||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
|
||||||
import org.jetbrains.kotlin.ir.util.transformFlat
|
import org.jetbrains.kotlin.ir.util.transformFlat
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver
|
||||||
@@ -84,22 +82,7 @@ internal class InnerClassLowering(val context: Context) : ClassLoweringPass {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun lowerOuterThisReferences() {
|
private fun lowerOuterThisReferences() {
|
||||||
irClass.transformChildrenVoid(object : IrElementTransformerVoid() {
|
irClass.transformChildrenVoid(object : IrElementTransformerVoidWithContext() {
|
||||||
private fun <E> MutableList<E>.push(element: E) = this.add(element)
|
|
||||||
|
|
||||||
private fun <E> MutableList<E>.pop() = this.removeAt(size - 1)
|
|
||||||
|
|
||||||
private fun <E> MutableList<E>.peek(): E? = if (size == 0) null else this[size - 1]
|
|
||||||
|
|
||||||
private val functionsStack = mutableListOf<FunctionDescriptor>()
|
|
||||||
|
|
||||||
override fun visitFunction(declaration: IrFunction): IrStatement {
|
|
||||||
functionsStack.push(declaration.descriptor)
|
|
||||||
val result = super.visitFunction(declaration)
|
|
||||||
functionsStack.pop()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitGetValue(expression: IrGetValue): IrExpression {
|
override fun visitGetValue(expression: IrGetValue): IrExpression {
|
||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
|
|
||||||
@@ -108,7 +91,7 @@ internal class InnerClassLowering(val context: Context) : ClassLoweringPass {
|
|||||||
|
|
||||||
if (implicitThisClass == classDescriptor) return expression
|
if (implicitThisClass == classDescriptor) return expression
|
||||||
|
|
||||||
val constructorDescriptor = functionsStack.peek()!! as? ConstructorDescriptor
|
val constructorDescriptor = currentFunction!! as? ConstructorDescriptor
|
||||||
|
|
||||||
val startOffset = expression.startOffset
|
val startOffset = expression.startOffset
|
||||||
val endOffset = expression.endOffset
|
val endOffset = expression.endOffset
|
||||||
|
|||||||
Reference in New Issue
Block a user