FIR: introduce delegate field initializers

Before this commit we initialized delegate fields in primary constructor,
that could provoke NPE in case delegate is used in initializer of
some property backing field.
Now we initialize delegate fields directly instead.
This commit is contained in:
Mikhail Glukhikh
2021-02-02 17:51:11 +03:00
parent 2cbdad0bb1
commit d4b0688690
69 changed files with 928 additions and 356 deletions
@@ -0,0 +1,65 @@
class FirSession {
constructor(name: String) /* primary */ {
super/*Any*/()
/* <init>() */
}
val name: String
field = name
get
}
interface Fir2IrComponents {
abstract val session: FirSession
abstract get
abstract val classifierStorage: Fir2IrClassifierStorage
abstract get
}
class Fir2IrComponentsStorage : Fir2IrComponents {
constructor(session: FirSession) /* primary */ {
super/*Any*/()
/* <init>() */
}
override val session: FirSession
field = session
override get
override lateinit var classifierStorage: Fir2IrClassifierStorage
override get
open set
}
class Fir2IrClassifierStorage : Fir2IrComponents {
constructor(components: Fir2IrComponents) /* primary */ {
super/*Any*/()
/* <init>() */
}
private val components: Fir2IrComponents
field = components
private get
override val classifierStorage: Fir2IrClassifierStorage
override get(): Fir2IrClassifierStorage {
return <this>.#components.<get-classifierStorage>()
}
override val session: FirSession
override get(): FirSession {
return <this>.#components.<get-session>()
}
private val name: String
field = <this>.<get-session>().<get-name>()
private get
}