Raw FIR: add initializers to primary constructor properties

This commit is contained in:
Mikhail Glukhikh
2019-03-26 17:05:17 +03:00
parent 1f2d31dffb
commit 4187ea1f86
21 changed files with 64 additions and 39 deletions
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.labels.FirLabelImpl
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirExplicitSuperReference
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -260,7 +257,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
return firValueParameter
}
private fun KtParameter.toFirProperty(): FirProperty {
private fun KtParameter.toFirProperty(firParameter: FirValueParameter): FirProperty {
require(hasValOrVar())
val type = typeReference.toFirOrErrorType()
val firProperty = FirMemberPropertyImpl(
@@ -278,7 +275,11 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
receiverTypeRef = null,
returnTypeRef = type,
isVar = isMutable,
initializer = null,
initializer = FirQualifiedAccessExpressionImpl(session, this).apply {
calleeReference = FirPropertyFromParameterCallableReference(
this@RawFirBuilder.session, this@toFirProperty, nameAsSafeName, firParameter.symbol
)
},
getter = FirDefaultPropertyGetter(session, this, type, visibility),
setter = FirDefaultPropertySetter(session, this, type, visibility),
delegate = null
@@ -511,15 +512,19 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
classOrObject.extractTypeParametersTo(firClass)
val delegatedSelfType = classOrObject.toDelegatedSelfType(firClass)
val delegatedSuperType = classOrObject.extractSuperTypeListEntriesTo(firClass, delegatedSelfType)
classOrObject.primaryConstructor?.valueParameters?.forEach {
if (it.hasValOrVar()) {
firClass.declarations += it.toFirProperty()
val primaryConstructor = classOrObject.primaryConstructor
val firPrimaryConstructor = firClass.declarations.firstOrNull() as? FirConstructor
if (primaryConstructor != null && firPrimaryConstructor != null) {
primaryConstructor.valueParameters.zip(firPrimaryConstructor.valueParameters).forEach { (ktParameter, firParameter) ->
if (ktParameter.hasValOrVar()) {
firClass.declarations += ktParameter.toFirProperty(firParameter)
}
}
}
for (declaration in classOrObject.declarations) {
firClass.declarations += declaration.toFirDeclaration(
delegatedSuperType, delegatedSelfType, hasPrimaryConstructor = classOrObject.primaryConstructor != null
delegatedSuperType, delegatedSelfType, hasPrimaryConstructor = primaryConstructor != null
)
}
@@ -2,7 +2,7 @@ FILE: derivedClass.kt
<T> public? open class Base : kotlin/Any {
public? constructor(x: T): super<kotlin/Any>()
public? final? val x: T
public? final? val x: T = R|<local>/x|
public? get(): T
}
@@ -21,10 +21,10 @@ FILE: enums.kt
public? final? enum class Planet : kotlin/Enum {
public? constructor(m: Double, r: Double): super<kotlin/Enum>()
public? final? val m: Double
public? final? val m: Double = R|<local>/m|
public? get(): Double
internal final? val r: Double
internal final? val r: Double = R|<local>/r|
internal get(): Double
public? final enum entry MERCURY : Planet {
@@ -12,7 +12,7 @@ FILE: enums2.kt
public? final? enum class SomeEnum : kotlin/Enum {
public? constructor(x: Some): super<kotlin/Enum>()
public? final? val x: Some
public? final? val x: Some = R|<local>/x|
public? get(): Some
public? final enum entry FIRST : SomeEnum {
@@ -2,7 +2,7 @@ FILE: nestedClass.kt
public? abstract class Base : kotlin/Any {
public? constructor(s: String): super<kotlin/Any>()
public? final? val s: String
public? final? val s: String = R|<local>/s|
public? get(): String
}
@@ -7,7 +7,7 @@ FILE: arrayAccess.kt
public? final? class Wrapper : kotlin/Any {
public? constructor(v: IntArray): super<kotlin/Any>()
public? final? val v: IntArray
public? final? val v: IntArray = R|<local>/v|
public? get(): IntArray
}
@@ -11,7 +11,7 @@ FILE: calls.kt
public? final? class My : kotlin/Any {
public? constructor(x: Int): super<kotlin/Any>()
public? final? var x: Int
public? final? var x: Int = R|<local>/x|
public? get(): Int
public? set(value: Int): kotlin/Unit
@@ -2,21 +2,21 @@ FILE: collectionLiterals.kt
public? final? annotation class Ann1 : kotlin/Any {
public? constructor(arr: IntArray): super<kotlin/Any>()
public? final? val arr: IntArray
public? final? val arr: IntArray = R|<local>/arr|
public? get(): IntArray
}
public? final? annotation class Ann2 : kotlin/Any {
public? constructor(arr: DoubleArray): super<kotlin/Any>()
public? final? val arr: DoubleArray
public? final? val arr: DoubleArray = R|<local>/arr|
public? get(): DoubleArray
}
public? final? annotation class Ann3 : kotlin/Any {
public? constructor(arr: Array<String>): super<kotlin/Any>()
public? final? val arr: Array<String>
public? final? val arr: Array<String> = R|<local>/arr|
public? get(): Array<String>
}
@@ -2,13 +2,13 @@ FILE: destructuring.kt
public? final? data class Some : kotlin/Any {
public? constructor(first: Int, second: Double, third: String): super<kotlin/Any>()
public? final? val first: Int
public? final? val first: Int = R|<local>/first|
public? get(): Int
public? final? val second: Double
public? final? val second: Double = R|<local>/second|
public? get(): Double
public? final? val third: String
public? final? val third: String = R|<local>/third|
public? get(): String
}
@@ -27,10 +27,10 @@ FILE: for.kt
public? final? data class Some : kotlin/Any {
public? constructor(x: Int, y: Int): super<kotlin/Any>()
public? final? val x: Int
public? final? val x: Int = R|<local>/x|
public? get(): Int
public? final? val y: Int
public? final? val y: Int = R|<local>/y|
public? get(): Int
}
@@ -2,10 +2,10 @@ FILE: lambda.kt
public? final? data class Tuple : kotlin/Any {
public? constructor(x: Int, y: Int): super<kotlin/Any>()
public? final? val x: Int
public? final? val x: Int = R|<local>/x|
public? get(): Int
public? final? val y: Int
public? final? val y: Int = R|<local>/y|
public? get(): Int
}
@@ -3,7 +3,7 @@ FILE: locals.kt
public? final? class Local : kotlin/Any {
public? constructor(pp: Int): super<kotlin/Any>()
public? final? val pp: Int
public? final? val pp: Int = R|<local>/pp|
public? get(): Int
public? final? fun diff(): <implicit> {
@@ -37,7 +37,7 @@ FILE: unary.kt
public? final? class X : kotlin/Any {
public? constructor(i: Int): super<kotlin/Any>()
public? final? val i: Int
public? final? val i: Int = R|<local>/i|
public? get(): Int
}
@@ -74,7 +74,7 @@ FILE: unary.kt
public? final? class Y : kotlin/Any {
public? constructor(arr: Array<Int>): super<kotlin/Any>()
public? final? val arr: Array<Int>
public? final? val arr: Array<Int> = R|<local>/arr|
public? get(): Array<Int>
}