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 dc898400bab..9e97a91e141 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 @@ -84,7 +84,11 @@ class RawFirBuilder(val session: FirSession) { isGetter: Boolean ): FirPropertyAccessor { if (this == null) { - return FirDefaultPropertyAccessor(session, property, isGetter, propertyType) + return if (isGetter) { + FirDefaultPropertyGetter(session, property, propertyType) + } else { + FirDefaultPropertySetter(session, property, propertyType) + } } val firAccessor = FirPropertyAccessorImpl( session, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index e8ff8a999a5..a46f533cdbc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -32,7 +32,7 @@ class FirTypeResolverImpl : FirTypeResolver { ConeKotlinErrorType(type.reason) } is FirFunctionType, is FirDynamicType, is FirImplicitType, is FirDelegatedType -> { - ConeKotlinErrorType("Not supported: $type") + ConeKotlinErrorType("Not supported: ${type::class.simpleName}") } else -> error("!") } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt index f5ce9130a91..7cddf101611 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt @@ -28,3 +28,7 @@ fun MutableList.transformInplace(transformer: FirTransfor } } + +fun T.transformSingle(transformer: FirTransformer, data: D): T { + return this.transform(transformer, data).single +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt index b7ba0f110ba..fb4b44daa0f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractCallableMember.kt @@ -8,9 +8,12 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirCallableMember +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name abstract class FirAbstractCallableMember( @@ -20,6 +23,14 @@ abstract class FirAbstractCallableMember( visibility: Visibility, modality: Modality, final override val isOverride: Boolean, - final override val receiverType: FirType?, - final override val returnType: FirType -) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirCallableMember \ No newline at end of file + final override var receiverType: FirType?, + final override var returnType: FirType +) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirCallableMember { + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + receiverType = receiverType?.transformSingle(transformer, data) + returnType = returnType.transformSingle(transformer, data) + + return this + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt index e2581d4690a..cec1ce2e696 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirAbstractFunction.kt @@ -6,10 +6,13 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirBody +import org.jetbrains.kotlin.fir.transformInplace +import org.jetbrains.kotlin.fir.visitors.FirTransformer abstract class FirAbstractFunction( session: FirSession, @@ -17,4 +20,10 @@ abstract class FirAbstractFunction( final override val body: FirBody? ) : FirAbstractAnnotatedDeclaration(session, psi), FirFunction { final override val valueParameters = mutableListOf() + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + valueParameters.transformInplace(transformer, data) + + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt index fe668d9fd20..169bdea466f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt @@ -7,32 +7,62 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirBody +import org.jetbrains.kotlin.fir.transformInplace +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType import org.jetbrains.kotlin.fir.types.impl.FirUnitType +import org.jetbrains.kotlin.fir.visitors.FirTransformer -class FirDefaultPropertyAccessor( - override val session: FirSession, - override val psi: PsiElement?, - override val isGetter: Boolean, - propertyType: FirType +abstract class FirDefaultPropertyAccessor( + final override val session: FirSession, + final override val psi: PsiElement?, + final override val isGetter: Boolean ) : FirPropertyAccessor { - override val visibility = + final override val visibility = Visibilities.UNKNOWN - override val valueParameters: List = - if (isGetter) emptyList() else listOf(FirDefaultSetterValueParameter(session, psi, propertyType)) - - override val returnType: FirType = - if (isGetter) propertyType else FirUnitType(session, psi) - - override val body: FirBody? = + final override val body: FirBody? = null - override val annotations: List + final override val annotations: List get() = emptyList() +} + +class FirDefaultPropertyGetter( + session: FirSession, + psi: PsiElement?, + propertyType: FirType +): FirDefaultPropertyAccessor(session, psi, isGetter = true) { + override val valueParameters: List = emptyList() + + override var returnType: FirType = propertyType + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + returnType = returnType.transformSingle(transformer, data) + + return this + } +} + +class FirDefaultPropertySetter( + session: FirSession, + psi: PsiElement?, + propertyType: FirType +): FirDefaultPropertyAccessor(session, psi, isGetter = false) { + override val valueParameters = mutableListOf(FirDefaultSetterValueParameter(session, psi, propertyType)) + + override var returnType: FirType = FirUnitType(session, psi) + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + valueParameters.transformInplace(transformer, data) + returnType = returnType.transformSingle(transformer, data) + + return this + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt index 36c493e3023..680fa73c583 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultSetterValueParameter.kt @@ -6,16 +6,19 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name class FirDefaultSetterValueParameter( session: FirSession, psi: PsiElement?, - override val returnType: FirType + override var returnType: FirType ) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter { override val isCrossinline = false @@ -25,6 +28,12 @@ class FirDefaultSetterValueParameter( override val defaultValue: FirExpression? = null + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + returnType = returnType.transformSingle(transformer, data) + + return this + } + companion object { val name = Name.identifier("value") } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt index 301da3cba95..ee7d3302590 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberFunctionImpl.kt @@ -8,11 +8,14 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirNamedFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirBody +import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name class FirMemberFunctionImpl( @@ -33,4 +36,10 @@ class FirMemberFunctionImpl( ) : FirAbstractCallableMember(session, psi, name, visibility, modality, isOverride, receiverType, returnType), FirNamedFunction { override val valueParameters = mutableListOf() + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + valueParameters.transformInplace(transformer, data) + + return super.transformChildren(transformer, data) + } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt index 0c7ebde2bcc..ea9fe18bdb6 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirMemberPropertyImpl.kt @@ -8,11 +8,14 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name class FirMemberPropertyImpl( @@ -27,8 +30,15 @@ class FirMemberPropertyImpl( returnType: FirType, override val isVar: Boolean, override val initializer: FirExpression?, - override val getter: FirPropertyAccessor, - override val setter: FirPropertyAccessor, + override var getter: FirPropertyAccessor, + override var setter: FirPropertyAccessor, override val delegate: FirExpression? ) : FirAbstractCallableMember(session, psi, name, visibility, modality, isOverride, receiverType, returnType), - FirProperty \ No newline at end of file + FirProperty { + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + getter = getter.transformSingle(transformer, data) + setter = setter.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt index a97eb639a9c..90cb05896f8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt @@ -7,16 +7,25 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.expressions.FirBody +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType +import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirPropertyAccessorImpl( session: FirSession, psi: PsiElement?, override val isGetter: Boolean, override val visibility: Visibility, - override val returnType: FirType, + override var returnType: FirType, body: FirBody? -) : FirAbstractFunction(session, psi, body), FirPropertyAccessor \ No newline at end of file +) : FirAbstractFunction(session, psi, body), FirPropertyAccessor { + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + returnType = returnType.transformSingle(transformer, data) + + return super.transformChildren(transformer, data) + } +} \ No newline at end of file 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 54203b2b82d..2ee78bd15a3 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 @@ -6,20 +6,29 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirType import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.visitors.FirTransformer class FirValueParameterImpl( session: FirSession, psi: PsiElement?, val isProperty: Boolean, name: Name, - override val returnType: FirType, + override var returnType: FirType, override val defaultValue: FirExpression?, override val isCrossinline: Boolean, override val isNoinline: Boolean, override val isVararg: Boolean -) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter \ No newline at end of file +) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirValueParameter { + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + returnType = returnType.transformSingle(transformer, data) + + return this + } +} \ No newline at end of file diff --git a/compiler/testData/fir/resolve/simpleClass.kt b/compiler/testData/fir/resolve/simpleClass.kt new file mode 100644 index 00000000000..851f3c6f289 --- /dev/null +++ b/compiler/testData/fir/resolve/simpleClass.kt @@ -0,0 +1,19 @@ +interface SomeInterface { + fun foo(x: Int, y: String): String + + val bar: Boolean +} + +class SomeClass : SomeInterface { + private val baz = 42 + + override fun foo(x: Int, y: String): String { + return y + x + baz + } + + override var bar: Boolean + get() = true + set(value) {} + + var fau: Double +} \ No newline at end of file diff --git a/compiler/testData/fir/resolve/simpleClass.txt b/compiler/testData/fir/resolve/simpleClass.txt new file mode 100644 index 00000000000..97594b9f16b --- /dev/null +++ b/compiler/testData/fir/resolve/simpleClass.txt @@ -0,0 +1,27 @@ +FILE: simpleClass.kt + unknown final interface SomeInterface() { + unknown final function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ + + unknown final property bar(val): R/error: Failed to resolve qualified type/ + unknown get(): R/error: Failed to resolve qualified type/ + + } + unknown final class SomeClass() : R/.SomeInterface/ { + private final property baz(val): R/error: Not supported: FirImplicitTypeImpl/ = STUB + unknown get(): R/error: Not supported: FirImplicitTypeImpl/ + + unknown final override function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ { + } + + unknown final override property bar(var): R/error: Failed to resolve qualified type/ + unknown get(): R/error: Not supported: FirImplicitTypeImpl/ { + STUB + } + unknown set(value: R/error: Failed to resolve qualified type/): R/error: Not supported: FirImplicitTypeImpl/ { + } + + unknown final property fau(var): R/error: Failed to resolve qualified type/ + unknown get(): R/error: Failed to resolve qualified type/ + unknown set(value: R/error: Failed to resolve qualified type/): R/kotlin.Unit/ + + } diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index 92a182ae4de..f767a72797a 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -37,6 +37,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { doTest(fileName); } + @TestMetadata("simpleClass.kt") + public void testSimpleClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/simpleClass.kt"); + doTest(fileName); + } + @TestMetadata("TwoDeclarationsInSameFile.kt") public void testTwoDeclarationsInSameFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/TwoDeclarationsInSameFile.kt");