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.backend.common.phaser.makeIrFilePhase
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
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.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.*
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
object SYNTHESIZED_INIT_BLOCK: IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK")
|
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(
|
fun makeInitializersPhase(origin: IrDeclarationOrigin, clinitNeeded: Boolean)= makeIrFilePhase(
|
||||||
{ context -> InitializersLowering(context, origin, clinitNeeded) },
|
{ context -> InitializersLowering(context, origin, clinitNeeded) },
|
||||||
name = "Initializers",
|
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(
|
class InitializersLowering(
|
||||||
val context: CommonBackendContext,
|
val context: CommonBackendContext,
|
||||||
val declarationOrigin: IrDeclarationOrigin,
|
val declarationOrigin: IrDeclarationOrigin,
|
||||||
@@ -48,6 +63,7 @@ class InitializersLowering(
|
|||||||
val staticInitializerStatements = handleStatics(irClass)
|
val staticInitializerStatements = handleStatics(irClass)
|
||||||
if (clinitNeeded && staticInitializerStatements.isNotEmpty())
|
if (clinitNeeded && staticInitializerStatements.isNotEmpty())
|
||||||
createStaticInitializationMethod(irClass, staticInitializerStatements)
|
createStaticInitializationMethod(irClass, staticInitializerStatements)
|
||||||
|
irClass.declarations.removeAll { it is IrAnonymousInitializer }
|
||||||
irClass.patchDeclarationParents(irClass.parent)
|
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.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
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.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.*
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
fun makePropertiesPhase(originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?) = makeIrFilePhase(
|
fun makePropertiesPhase(originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?) = makeIrFilePhase(
|
||||||
{ context -> PropertiesLowering(context, originOfSyntheticMethodForAnnotations) },
|
{ context -> PropertiesLowering(context, originOfSyntheticMethodForAnnotations) },
|
||||||
name = "Properties",
|
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(
|
class PropertiesLowering(
|
||||||
private val context: BackendContext,
|
private val context: BackendContext,
|
||||||
private val originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?
|
private val originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?
|
||||||
@@ -49,6 +64,7 @@ class PropertiesLowering(
|
|||||||
override fun visitClass(declaration: IrClass): IrStatement {
|
override fun visitClass(declaration: IrClass): IrStatement {
|
||||||
declaration.transformChildrenVoid(this)
|
declaration.transformChildrenVoid(this)
|
||||||
declaration.transformDeclarationsFlat { lowerProperty(it, declaration.kind) }
|
declaration.transformDeclarationsFlat { lowerProperty(it, declaration.kind) }
|
||||||
|
declaration.declarations.removeAll { it is IrProperty }
|
||||||
return declaration
|
return declaration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -39,9 +39,14 @@ import java.util.*
|
|||||||
internal val fileClassPhase = makeIrFilePhase(
|
internal val fileClassPhase = makeIrFilePhase(
|
||||||
::FileClassLowering,
|
::FileClassLowering,
|
||||||
name = "FileClass",
|
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 {
|
private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass {
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
val classes = ArrayList<IrClass>()
|
val classes = ArrayList<IrClass>()
|
||||||
|
|||||||
Reference in New Issue
Block a user