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>
}
+1 -1
View File
@@ -2,7 +2,7 @@ FILE: derivedClass.kt
<T> public open class Base : R|kotlin/Any| {
public constructor(x: R|T|): super<R|kotlin/Any|>()
public final val x: R|T|
public final val x: R|T| = R|<local>/x|
public get(): R|T|
}
+1 -1
View File
@@ -12,7 +12,7 @@ FILE: enum.kt
public final enum class SomeEnum : R|kotlin/Enum| {
private constructor(x: R|Some|): super<R|kotlin/Enum|>()
public final val x: R|Some|
public final val x: R|Some| = R|<local>/x|
public get(): R|Some|
public final enum entry FIRST : R|SomeEnum| {
@@ -21,10 +21,10 @@ FILE: enums.kt
public final enum class Planet : R|kotlin/Enum| {
private constructor(m: R|kotlin/Double|, r: R|kotlin/Double|): super<R|kotlin/Enum|>()
public final val m: R|kotlin/Double|
public final val m: R|kotlin/Double| = R|<local>/m|
public get(): R|kotlin/Double|
internal final val r: R|kotlin/Double|
internal final val r: R|kotlin/Double| = R|<local>/r|
internal get(): R|kotlin/Double|
public final enum entry MERCURY : R|Planet| {
@@ -12,7 +12,7 @@ FILE: Annotations.kt
@R|annotations/WithString|(String(xyz)) public final class Second : @R|annotations/WithInt|(Int(0)) R|test/First| {
public constructor(y: R|kotlin/Char|): super<@R|annotations/WithInt|(Int(0)) R|test/First|>()
public final val y: R|kotlin/Char|
public final val y: R|kotlin/Char| = R|<local>/y|
public get(): R|kotlin/Char|
public final override fun foo(arg: R|kotlin/Double|): R|kotlin/Unit| {
+1 -1
View File
@@ -2,7 +2,7 @@ FILE: nestedClass.kt
public abstract class Base : R|kotlin/Any| {
public constructor(s: R|kotlin/String|): super<R|kotlin/Any|>()
public final val s: R|kotlin/String|
public final val s: R|kotlin/String| = R|<local>/s|
public get(): R|kotlin/String|
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.references
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirAbstractElement
import org.jetbrains.kotlin.fir.FirResolvedCallableReference
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.Name
class FirPropertyFromParameterCallableReference(
session: FirSession,
psi: PsiElement?,
override val name: Name,
override val callableSymbol: FirVariableSymbol
) : FirAbstractElement(session, psi), FirResolvedCallableReference
+2 -2
View File
@@ -2,14 +2,14 @@ FILE: base.kt
public final class Hello : R|kotlin/Any| {
public constructor(msg: R|kotlin/String|): super<R|kotlin/Any|>()
public final val msg: R|kotlin/String|
public final val msg: R|kotlin/String| = R|<local>/msg|
public get(): R|kotlin/String|
}
public final class Test : R|kotlin/Any| {
public constructor(set: R|java/util/Set<*>|): super<R|kotlin/Any|>()
public final val set: R|java/util/Set<*>|
public final val set: R|java/util/Set<*>| = R|<local>/set|
public get(): R|java/util/Set<*>|
}
@@ -8,7 +8,7 @@ FILE: common.kt
public open class Wrapper : R|kotlin/Any| {
public constructor(list: R|MyList|): super<R|kotlin/Any|>()
public final val list: R|MyList|
public final val list: R|MyList| = R|<local>/list|
public get(): R|MyList|
}