From b7926b68abe6d2e379c825fd8b222234a3f03423 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 6 Mar 2024 13:02:07 +0200 Subject: [PATCH] [FIR] Fix sources of intersection override properties's accessors ^KT-66046 --- .../fir/scopes/impl/FirFakeOverrideGenerator.kt | 14 ++++++++++---- ...VisibilitiesForAbstractPropertyAccessors.fir.kt | 4 ++-- ...ibilitiesForNonAbstractPropertyAccessors.fir.kt | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt index 45e61fdea0b..2524a36d407 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirFakeOverrideGenerator.kt @@ -400,9 +400,9 @@ object FirFakeOverrideGenerator { newModality: Modality? = null, newVisibility: Visibility? = null, deferredReturnTypeCalculation: DeferredCallableCopyReturnType? = null, - newSource: KtSourceElement? = derivedClassLookupTag?.toSymbol(session)?.source ?: baseProperty.source, + newSource: KtSourceElement? = derivedClassLookupTag?.toSymbol(session)?.source, ): FirProperty = buildProperty { - source = newSource + source = newSource ?: baseProperty.source moduleData = session.nullableModuleData ?: baseProperty.moduleData this.origin = origin name = baseProperty.name @@ -433,6 +433,7 @@ object FirFakeOverrideGenerator { dispatchReceiverType = dispatchReceiverType, derivedClassLookupTag = derivedClassLookupTag, baseProperty = baseProperty, + newSource = newSource ?: baseProperty.getter?.source, ) setter = baseProperty.setter?.buildCopyIfNeeded( @@ -443,6 +444,7 @@ object FirFakeOverrideGenerator { dispatchReceiverType = dispatchReceiverType, derivedClassLookupTag = derivedClassLookupTag, baseProperty = baseProperty, + newSource = newSource ?: baseProperty.setter?.source, ) }.apply { containingClassForStaticMemberAttr = derivedClassLookupTag.takeIf { shouldOverrideSetContainingClass(baseProperty) } @@ -456,6 +458,7 @@ object FirFakeOverrideGenerator { dispatchReceiverType: ConeSimpleKotlinType?, derivedClassLookupTag: ConeClassLikeLookupTag?, baseProperty: FirProperty, + newSource: KtSourceElement? = source, ) = when { annotations.isNotEmpty() || visibility != baseProperty.visibility -> buildCopy( moduleData, @@ -465,6 +468,7 @@ object FirFakeOverrideGenerator { dispatchReceiverType, derivedClassLookupTag, baseProperty, + newSource, ) else -> null } @@ -477,9 +481,10 @@ object FirFakeOverrideGenerator { dispatchReceiverType: ConeSimpleKotlinType?, derivedClassLookupTag: ConeClassLikeLookupTag?, baseProperty: FirProperty, + newSource: KtSourceElement? = source, ) = when (this) { is FirDefaultPropertyGetter -> FirDefaultPropertyGetter( - source = source, + source = newSource, moduleData = moduleData, origin = origin, propertyTypeRef = propertyReturnTypeRef, @@ -492,7 +497,7 @@ object FirFakeOverrideGenerator { replaceAnnotations(this@buildCopy.annotations) } is FirDefaultPropertySetter -> FirDefaultPropertySetter( - source = source, + source = newSource, moduleData = moduleData, origin = origin, propertyTypeRef = propertyReturnTypeRef, @@ -505,6 +510,7 @@ object FirFakeOverrideGenerator { replaceAnnotations(this@buildCopy.annotations) } else -> buildPropertyAccessorCopy(this) { + this.source = newSource this.symbol = FirPropertyAccessorSymbol() this.moduleData = moduleData this.origin = origin diff --git a/compiler/testData/diagnostics/tests/intersectedVisibilitiesForAbstractPropertyAccessors.fir.kt b/compiler/testData/diagnostics/tests/intersectedVisibilitiesForAbstractPropertyAccessors.fir.kt index 98ef7cf7958..e8d2dfb6091 100644 --- a/compiler/testData/diagnostics/tests/intersectedVisibilitiesForAbstractPropertyAccessors.fir.kt +++ b/compiler/testData/diagnostics/tests/intersectedVisibilitiesForAbstractPropertyAccessors.fir.kt @@ -2,14 +2,14 @@ abstract class I1 { abstract var a: Int - protected set + protected set } interface I2 { var a: Int } -abstract class C : I1(), I2 +abstract class C : I1(), I2 abstract class I3 { protected abstract fun foo(): Int diff --git a/compiler/testData/diagnostics/tests/intersectedVisibilitiesForNonAbstractPropertyAccessors.fir.kt b/compiler/testData/diagnostics/tests/intersectedVisibilitiesForNonAbstractPropertyAccessors.fir.kt index 606870786d5..bafcdb63bcc 100644 --- a/compiler/testData/diagnostics/tests/intersectedVisibilitiesForNonAbstractPropertyAccessors.fir.kt +++ b/compiler/testData/diagnostics/tests/intersectedVisibilitiesForNonAbstractPropertyAccessors.fir.kt @@ -2,14 +2,14 @@ open class A1 { var a: Int = 10 - protected set + protected set } interface I1 { var a: Int } -abstract class B1 : A1(), I1 +abstract class B1 : A1(), I1 open class A2 { protected fun foo(): Int = 10