Add some phase checkers
This commit is contained in:
+17
-1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.common.ir.SetDeclarationsParentVisitor
|
||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.visitors.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
object SYNTHESIZED_INIT_BLOCK: IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK")
|
||||
@@ -33,9 +35,22 @@ object SYNTHESIZED_INIT_BLOCK: IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK")
|
||||
fun makeInitializersPhase(origin: IrDeclarationOrigin, clinitNeeded: Boolean)= makeIrFilePhase(
|
||||
{ context -> InitializersLowering(context, origin, clinitNeeded) },
|
||||
name = "Initializers",
|
||||
description = "Handle initializer statements"
|
||||
description = "Handle initializer statements",
|
||||
stickyPostconditions = setOf(::checkNonAnonymousInitializers)
|
||||
)
|
||||
|
||||
fun checkNonAnonymousInitializers(irFile: IrFile) {
|
||||
irFile.acceptVoid(object : IrElementVisitorVoid {
|
||||
override fun visitElement(element: IrElement) {
|
||||
element.acceptChildrenVoid(this)
|
||||
}
|
||||
|
||||
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
|
||||
error("No anonymous initializers should remain at this stage")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
class InitializersLowering(
|
||||
val context: CommonBackendContext,
|
||||
val declarationOrigin: IrDeclarationOrigin,
|
||||
@@ -48,6 +63,7 @@ class InitializersLowering(
|
||||
val staticInitializerStatements = handleStatics(irClass)
|
||||
if (clinitNeeded && staticInitializerStatements.isNotEmpty())
|
||||
createStaticInitializationMethod(irClass, staticInitializerStatements)
|
||||
irClass.declarations.removeAll { it is IrAnonymousInitializer }
|
||||
irClass.patchDeclarationParents(irClass.parent)
|
||||
}
|
||||
|
||||
|
||||
+17
-1
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||
@@ -23,15 +24,29 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.ir.visitors.*
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import java.util.*
|
||||
|
||||
fun makePropertiesPhase(originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?) = makeIrFilePhase(
|
||||
{ context -> PropertiesLowering(context, originOfSyntheticMethodForAnnotations) },
|
||||
name = "Properties",
|
||||
description = "Move fields and accessors for properties to their classes"
|
||||
description = "Move fields and accessors for properties to their classes",
|
||||
stickyPostconditions = setOf(::checkNoProperties)
|
||||
)
|
||||
|
||||
fun checkNoProperties(irFile: IrFile) {
|
||||
irFile.acceptVoid(object : IrElementVisitorVoid {
|
||||
override fun visitElement(element: IrElement) {
|
||||
element.acceptChildrenVoid(this)
|
||||
}
|
||||
|
||||
override fun visitProperty(declaration: IrProperty) {
|
||||
error("No properties should remain at this stage")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
class PropertiesLowering(
|
||||
private val context: BackendContext,
|
||||
private val originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?
|
||||
@@ -49,6 +64,7 @@ class PropertiesLowering(
|
||||
override fun visitClass(declaration: IrClass): IrStatement {
|
||||
declaration.transformChildrenVoid(this)
|
||||
declaration.transformDeclarationsFlat { lowerProperty(it, declaration.kind) }
|
||||
declaration.declarations.removeAll { it is IrProperty }
|
||||
return declaration
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -39,9 +39,14 @@ import java.util.*
|
||||
internal val fileClassPhase = makeIrFilePhase(
|
||||
::FileClassLowering,
|
||||
name = "FileClass",
|
||||
description = "Put file level function and property declaration into a class"
|
||||
description = "Put file level function and property declaration into a class",
|
||||
stickyPostconditions = setOf(::checkAllFileLevelDeclarationsAreClasses)
|
||||
)
|
||||
|
||||
private fun checkAllFileLevelDeclarationsAreClasses(irFile: IrFile) {
|
||||
assert(irFile.declarations.all { it is IrClass })
|
||||
}
|
||||
|
||||
private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
|
||||
override fun lower(irFile: IrFile) {
|
||||
val classes = ArrayList<IrClass>()
|
||||
|
||||
Reference in New Issue
Block a user