diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index b5cdf81bbe4..fb248fc43dd 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -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 ) } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/derivedClass.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/derivedClass.txt index bd708b3d515..c399ef45a13 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/derivedClass.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/derivedClass.txt @@ -2,7 +2,7 @@ FILE: derivedClass.kt public? open class Base : kotlin/Any { public? constructor(x: T): super() - public? final? val x: T + public? final? val x: T = R|/x| public? get(): T } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt index 35426487ae7..eb8df5b168f 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums.txt @@ -21,10 +21,10 @@ FILE: enums.kt public? final? enum class Planet : kotlin/Enum { public? constructor(m: Double, r: Double): super() - public? final? val m: Double + public? final? val m: Double = R|/m| public? get(): Double - internal final? val r: Double + internal final? val r: Double = R|/r| internal get(): Double public? final enum entry MERCURY : Planet { diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt index c57037734bf..95f7d83408d 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/enums2.txt @@ -12,7 +12,7 @@ FILE: enums2.kt public? final? enum class SomeEnum : kotlin/Enum { public? constructor(x: Some): super() - public? final? val x: Some + public? final? val x: Some = R|/x| public? get(): Some public? final enum entry FIRST : SomeEnum { diff --git a/compiler/fir/psi2fir/testData/rawBuilder/declarations/nestedClass.txt b/compiler/fir/psi2fir/testData/rawBuilder/declarations/nestedClass.txt index 6443925fd02..7802a8ad7b8 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/declarations/nestedClass.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/declarations/nestedClass.txt @@ -2,7 +2,7 @@ FILE: nestedClass.kt public? abstract class Base : kotlin/Any { public? constructor(s: String): super() - public? final? val s: String + public? final? val s: String = R|/s| public? get(): String } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt index bc7dae246fe..4a37e3f4553 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt @@ -7,7 +7,7 @@ FILE: arrayAccess.kt public? final? class Wrapper : kotlin/Any { public? constructor(v: IntArray): super() - public? final? val v: IntArray + public? final? val v: IntArray = R|/v| public? get(): IntArray } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/calls.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/calls.txt index 0da3741b560..44054b56427 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/calls.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/calls.txt @@ -11,7 +11,7 @@ FILE: calls.kt public? final? class My : kotlin/Any { public? constructor(x: Int): super() - public? final? var x: Int + public? final? var x: Int = R|/x| public? get(): Int public? set(value: Int): kotlin/Unit diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/collectionLiterals.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/collectionLiterals.txt index f3e3bc2eeb4..c9f56b8d8ee 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/collectionLiterals.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/collectionLiterals.txt @@ -2,21 +2,21 @@ FILE: collectionLiterals.kt public? final? annotation class Ann1 : kotlin/Any { public? constructor(arr: IntArray): super() - public? final? val arr: IntArray + public? final? val arr: IntArray = R|/arr| public? get(): IntArray } public? final? annotation class Ann2 : kotlin/Any { public? constructor(arr: DoubleArray): super() - public? final? val arr: DoubleArray + public? final? val arr: DoubleArray = R|/arr| public? get(): DoubleArray } public? final? annotation class Ann3 : kotlin/Any { public? constructor(arr: Array): super() - public? final? val arr: Array + public? final? val arr: Array = R|/arr| public? get(): Array } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt index 51924a394ae..16434895593 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt @@ -2,13 +2,13 @@ FILE: destructuring.kt public? final? data class Some : kotlin/Any { public? constructor(first: Int, second: Double, third: String): super() - public? final? val first: Int + public? final? val first: Int = R|/first| public? get(): Int - public? final? val second: Double + public? final? val second: Double = R|/second| public? get(): Double - public? final? val third: String + public? final? val third: String = R|/third| public? get(): String } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt index 6611c3b32c4..9bb5b27628e 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt @@ -27,10 +27,10 @@ FILE: for.kt public? final? data class Some : kotlin/Any { public? constructor(x: Int, y: Int): super() - public? final? val x: Int + public? final? val x: Int = R|/x| public? get(): Int - public? final? val y: Int + public? final? val y: Int = R|/y| public? get(): Int } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt index 8d83ba8e260..ad20de869e7 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt @@ -2,10 +2,10 @@ FILE: lambda.kt public? final? data class Tuple : kotlin/Any { public? constructor(x: Int, y: Int): super() - public? final? val x: Int + public? final? val x: Int = R|/x| public? get(): Int - public? final? val y: Int + public? final? val y: Int = R|/y| public? get(): Int } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/locals.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/locals.txt index 47329cfc592..88f8ddd81eb 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/locals.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/locals.txt @@ -3,7 +3,7 @@ FILE: locals.kt public? final? class Local : kotlin/Any { public? constructor(pp: Int): super() - public? final? val pp: Int + public? final? val pp: Int = R|/pp| public? get(): Int public? final? fun diff(): { diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt index 8fd39386beb..33529cddca1 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt @@ -37,7 +37,7 @@ FILE: unary.kt public? final? class X : kotlin/Any { public? constructor(i: Int): super() - public? final? val i: Int + public? final? val i: Int = R|/i| public? get(): Int } @@ -74,7 +74,7 @@ FILE: unary.kt public? final? class Y : kotlin/Any { public? constructor(arr: Array): super() - public? final? val arr: Array + public? final? val arr: Array = R|/arr| public? get(): Array } diff --git a/compiler/fir/resolve/testData/resolve/derivedClass.txt b/compiler/fir/resolve/testData/resolve/derivedClass.txt index e0aab072474..32ca627f0d1 100644 --- a/compiler/fir/resolve/testData/resolve/derivedClass.txt +++ b/compiler/fir/resolve/testData/resolve/derivedClass.txt @@ -2,7 +2,7 @@ FILE: derivedClass.kt public open class Base : R|kotlin/Any| { public constructor(x: R|T|): super() - public final val x: R|T| + public final val x: R|T| = R|/x| public get(): R|T| } diff --git a/compiler/fir/resolve/testData/resolve/enum.txt b/compiler/fir/resolve/testData/resolve/enum.txt index 8637c6e11d0..d5c2ddcca1c 100644 --- a/compiler/fir/resolve/testData/resolve/enum.txt +++ b/compiler/fir/resolve/testData/resolve/enum.txt @@ -12,7 +12,7 @@ FILE: enum.kt public final enum class SomeEnum : R|kotlin/Enum| { private constructor(x: R|Some|): super() - public final val x: R|Some| + public final val x: R|Some| = R|/x| public get(): R|Some| public final enum entry FIRST : R|SomeEnum| { diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt index f585283668d..a84bbf590a2 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt @@ -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() - public final val m: R|kotlin/Double| + public final val m: R|kotlin/Double| = R|/m| public get(): R|kotlin/Double| - internal final val r: R|kotlin/Double| + internal final val r: R|kotlin/Double| = R|/r| internal get(): R|kotlin/Double| public final enum entry MERCURY : R|Planet| { diff --git a/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt b/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt index c736e475683..8f6bffe1325 100644 --- a/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt +++ b/compiler/fir/resolve/testData/resolve/multifile/Annotations.txt @@ -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|/y| public get(): R|kotlin/Char| public final override fun foo(arg: R|kotlin/Double|): R|kotlin/Unit| { diff --git a/compiler/fir/resolve/testData/resolve/nestedClass.txt b/compiler/fir/resolve/testData/resolve/nestedClass.txt index 1b9e7db5d34..c2716f33ddf 100644 --- a/compiler/fir/resolve/testData/resolve/nestedClass.txt +++ b/compiler/fir/resolve/testData/resolve/nestedClass.txt @@ -2,7 +2,7 @@ FILE: nestedClass.kt public abstract class Base : R|kotlin/Any| { public constructor(s: R|kotlin/String|): super() - public final val s: R|kotlin/String| + public final val s: R|kotlin/String| = R|/s| public get(): R|kotlin/String| } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirPropertyFromParameterCallableReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirPropertyFromParameterCallableReference.kt new file mode 100644 index 00000000000..1a0f5a4ec26 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/references/FirPropertyFromParameterCallableReference.kt @@ -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 \ No newline at end of file diff --git a/idea/testData/fir/multiModule/basic/m1_java/base.txt b/idea/testData/fir/multiModule/basic/m1_java/base.txt index 76f1514653b..cb436533d1e 100644 --- a/idea/testData/fir/multiModule/basic/m1_java/base.txt +++ b/idea/testData/fir/multiModule/basic/m1_java/base.txt @@ -2,14 +2,14 @@ FILE: base.kt public final class Hello : R|kotlin/Any| { public constructor(msg: R|kotlin/String|): super() - public final val msg: R|kotlin/String| + public final val msg: R|kotlin/String| = R|/msg| public get(): R|kotlin/String| } public final class Test : R|kotlin/Any| { public constructor(set: R|java/util/Set<*>|): super() - public final val set: R|java/util/Set<*>| + public final val set: R|java/util/Set<*>| = R|/set| public get(): R|java/util/Set<*>| } diff --git a/idea/testData/fir/multiModule/mppMemberType/common/common.txt b/idea/testData/fir/multiModule/mppMemberType/common/common.txt index 91b9cbb2228..f5383d814b3 100644 --- a/idea/testData/fir/multiModule/mppMemberType/common/common.txt +++ b/idea/testData/fir/multiModule/mppMemberType/common/common.txt @@ -8,7 +8,7 @@ FILE: common.kt public open class Wrapper : R|kotlin/Any| { public constructor(list: R|MyList|): super() - public final val list: R|MyList| + public final val list: R|MyList| = R|/list| public get(): R|MyList| }