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 0027d54fa55..546455395ff 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 @@ -74,12 +74,10 @@ class RawFirBuilder(val session: FirSession) { } private inner class Visitor : KtVisitor() { - @Suppress("UNCHECKED_CAST") - private fun KtElement?.convertSafe(): R? = + private inline fun KtElement?.convertSafe(): R? = this?.accept(this@Visitor, Unit) as? R - @Suppress("UNCHECKED_CAST") - private fun KtElement.convert(): R = + private inline fun KtElement.convert(): R = this.accept(this@Visitor, Unit) as R private fun KtTypeReference?.toFirOrImplicitType(): FirType = @@ -126,7 +124,6 @@ class RawFirBuilder(val session: FirSession) { val firValueParameter = FirValueParameterImpl( session, this, - hasValOrVar(), nameAsSafeName, when { typeReference != null -> typeReference.toFirOrErrorType() @@ -142,6 +139,31 @@ class RawFirBuilder(val session: FirSession) { return firValueParameter } + private fun KtParameter.toFirProperty(): FirProperty { + require(hasValOrVar()) + val type = typeReference.toFirOrErrorType() + val firProperty = FirMemberPropertyImpl( + session, + this, + nameAsSafeName, + visibility, + modality, + platformStatus, + isOverride = hasModifier(KtTokens.OVERRIDE_KEYWORD), + isConst = false, + isLateInit = false, + receiverType = null, + returnType = type, + isVar = valOrVarKeyword?.node?.elementType == KtTokens.VAR_KEYWORD, + initializer = null, + getter = FirDefaultPropertyGetter(session, this, type), + setter = FirDefaultPropertySetter(session, this, type), + delegate = null + ) + extractAnnotationsTo(firProperty) + return firProperty + } + private fun KtModifierListOwner.extractAnnotationsTo(container: FirAbstractAnnotatedDeclaration) { for (annotationEntry in annotationEntries) { container.annotations += annotationEntry.convert() @@ -297,6 +319,12 @@ class RawFirBuilder(val session: FirSession) { classOrObject.extractAnnotationsTo(firClass) classOrObject.extractTypeParametersTo(firClass) classOrObject.extractSuperTypeListEntriesTo(firClass) + classOrObject.primaryConstructor?.valueParameters?.forEach { + if (it.hasValOrVar()) { + firClass.declarations += it.toFirProperty() + } + } + for (declaration in classOrObject.declarations) { firClass.declarations += declaration.convert() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt index 7f081d9bd51..3470c6bd01f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirValueParameterImpl.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirValueParameterImpl( session: FirSession, psi: PsiElement?, - val isProperty: Boolean, name: Name, override var returnType: FirType, override val defaultValue: FirExpression?, diff --git a/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt b/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt index a66c518d1b9..5a718db4fd5 100644 --- a/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/derivedClass.txt @@ -2,6 +2,9 @@ FILE: derivedClass.kt public? open class Base { public? constructor(x: T) + public? final? property x(val): T + public? get(): T + } public? final class Derived : Base { public? constructor(x: T): super(STUB) diff --git a/compiler/testData/fir/rawBuilder/declarations/enums.txt b/compiler/testData/fir/rawBuilder/declarations/enums.txt index 41881989e65..13ea7074567 100644 --- a/compiler/testData/fir/rawBuilder/declarations/enums.txt +++ b/compiler/testData/fir/rawBuilder/declarations/enums.txt @@ -13,6 +13,12 @@ FILE: enums.kt public? final enum class Planet { public? constructor(m: Double, r: Double) + public? final? property m(val): Double + public? get(): Double + + internal final? property r(val): Double + public? get(): Double + public? final enum entry MERCURY : Planet { public? open? override function sayHello(): { } diff --git a/compiler/testData/fir/rawBuilder/declarations/enums2.txt b/compiler/testData/fir/rawBuilder/declarations/enums2.txt index 0368e04c370..64668067331 100644 --- a/compiler/testData/fir/rawBuilder/declarations/enums2.txt +++ b/compiler/testData/fir/rawBuilder/declarations/enums2.txt @@ -8,6 +8,9 @@ FILE: enums2.kt public? final enum class SomeEnum { public? constructor(x: Some) + public? final? property x(val): Some + public? get(): Some + public? final enum entry FIRST : SomeEnum { public? open? override function check(y: Some): Boolean { STUB diff --git a/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt b/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt index e2e809c60c4..81d2912f5f2 100644 --- a/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt +++ b/compiler/testData/fir/rawBuilder/declarations/nestedClass.txt @@ -2,6 +2,9 @@ FILE: nestedClass.kt public? abstract class Base { public? constructor(s: String) + public? final? property s(val): String + public? get(): String + } public? final class Outer { public? final class Derived : Base { diff --git a/compiler/testData/fir/resolve/derivedClass.txt b/compiler/testData/fir/resolve/derivedClass.txt index 98915a346f1..2983f813880 100644 --- a/compiler/testData/fir/resolve/derivedClass.txt +++ b/compiler/testData/fir/resolve/derivedClass.txt @@ -2,6 +2,9 @@ FILE: derivedClass.kt public? open class Base { public? constructor(x: R|T|) + public? final? property x(val): R|T| + public? get(): R|T| + } public? final class Derived : R|Base| { public? constructor(x: R|T|): super(STUB) diff --git a/compiler/testData/fir/resolve/enum.txt b/compiler/testData/fir/resolve/enum.txt index f885c2b9495..4329aca11f0 100644 --- a/compiler/testData/fir/resolve/enum.txt +++ b/compiler/testData/fir/resolve/enum.txt @@ -8,6 +8,9 @@ FILE: enum.kt public? final enum class SomeEnum { public? constructor(x: R|Some|) + public? final? property x(val): R|Some| + public? get(): R|Some| + public? final enum entry FIRST : R|SomeEnum| { public? open? override function check(y: R|Some|): R|kotlin/Boolean| { STUB diff --git a/compiler/testData/fir/resolve/multifile/Annotations.txt b/compiler/testData/fir/resolve/multifile/Annotations.txt index 0d41c2b3414..2d74f57a1d2 100644 --- a/compiler/testData/fir/resolve/multifile/Annotations.txt +++ b/compiler/testData/fir/resolve/multifile/Annotations.txt @@ -10,6 +10,9 @@ FILE: Annotations.kt @R|annotations/WithString|(STUB) public? final class Second : @R|annotations/WithInt|(STUB) R|test/First| { public? constructor(y: R|kotlin/Char|): super() + public? final? property y(val): R|kotlin/Char| + public? get(): R|kotlin/Char| + public? open? override function foo(arg: R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl| { } diff --git a/compiler/testData/fir/resolve/nestedClass.txt b/compiler/testData/fir/resolve/nestedClass.txt index 55a30f3941f..bd707f7ec65 100644 --- a/compiler/testData/fir/resolve/nestedClass.txt +++ b/compiler/testData/fir/resolve/nestedClass.txt @@ -2,6 +2,9 @@ FILE: nestedClass.kt public? abstract class Base { public? constructor(s: R|kotlin/String|) + public? final? property s(val): R|kotlin/String| + public? get(): R|kotlin/String| + } public? final class Outer { public? final class Derived : R|Base| {