From add47aa041da555fc67987b7e40d780fd1a4aaad Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 10 May 2023 17:46:56 +0200 Subject: [PATCH] [FIR] provide correct origin and source to default backing field Now it is aligned with default accessors Covered by analysis/analysis-api/testData/symbols/symbolByReference/accessorField.kt test ^KT-57648 ^KT-55723 --- .../deserialization/StubBasedFirMemberDeserializer.kt | 6 +++++- .../fir/deserialization/FirMemberDeserializer.kt | 5 ++++- .../kotlin/fir/plugin/PropertyBuildingContext.kt | 10 +++++++++- .../fir/lightTree/converter/DeclarationsConverter.kt | 6 +++++- .../kotlin/fir/lightTree/fir/ValueParameter.kt | 7 ++++++- .../org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 6 +++++- .../impl/FirDefaultPropertyBackingField.kt | 7 +++++-- 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt index 2941748b93e..70985c3088f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirMemberDeserializer.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource +import org.jetbrains.kotlin.toKtPsiSourceElement internal class StubBasedFirDeserializationContext( val moduleData: FirModuleData, @@ -313,12 +314,15 @@ internal class StubBasedFirMemberDeserializer( allAnnotations.filter { it.useSiteTarget == AnnotationUseSiteTarget.FIELD || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD } backingField = FirDefaultPropertyBackingField( c.moduleData, + initialOrigin, + source = property.toKtPsiSourceElement(KtFakeSourceElementKind.DefaultAccessor), backingFieldAnnotations.toMutableList(), returnTypeRef, isVar, symbol, - status + status, ) + if (getter != null) { this.getter = loadPropertyGetter( getter, diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index fd58adca5af..ef43c7c5bba 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -415,12 +415,15 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { ) backingField = FirDefaultPropertyBackingField( c.moduleData, + FirDeclarationOrigin.Library, + source = null, backingFieldAnnotations, returnTypeRef, isVar, symbol, - status + status, ) + if (hasGetter) { this.getter = loadPropertyGetter( proto, diff --git a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt index 9099e814b4f..d6547500795 100644 --- a/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt +++ b/compiler/fir/plugin-utils/src/org/jetbrains/kotlin/fir/plugin/PropertyBuildingContext.kt @@ -105,9 +105,17 @@ public class PropertyBuildingContext( } else { require(setterVisibility == null) { "isVar = false but setterVisibility is specified. Did you forget to set isVar = true?" } } + if (hasBackingField) { backingField = FirDefaultPropertyBackingField( - session.moduleData, mutableListOf(), returnTypeRef, isVar, symbol, status, + session.moduleData, + key.origin, + source = null, + mutableListOf(), + returnTypeRef, + isVar, + symbol, + status, resolvePhase = FirResolvePhase.BODY_RESOLVE, ) } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 4f00008f1bb..da85d9f151c 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -1196,7 +1196,8 @@ class DeclarationsConverter( symbol, modifiers, returnType, isVar, if (isLocal) emptyList() else modifiers.annotations.filter { it.useSiteTarget == FIELD || it.useSiteTarget == PROPERTY_DELEGATE_FIELD - } + }, + property, ) if (isLocal) { @@ -1481,6 +1482,7 @@ class DeclarationsConverter( propertyReturnType: FirTypeRef, isVar: Boolean, annotationsFromProperty: List, + property: LighterASTNode, ): FirBackingField { var modifiers = Modifier() var returnType: FirTypeRef = implicitType @@ -1519,6 +1521,8 @@ class DeclarationsConverter( } else { FirDefaultPropertyBackingField( moduleData = baseModuleData, + origin = FirDeclarationOrigin.Source, + source = property.toFirSourceElement(KtFakeSourceElementKind.DefaultAccessor), annotations = annotationsFromProperty.toMutableList(), returnTypeRef = propertyReturnType.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), isVar = isVar, diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index aa1b51cdaa8..4dc3645990b 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -134,8 +134,12 @@ class ValueParameter( isOverride = modifiers.hasOverride() isConst = modifiers.hasConst() } + + val defaultAccessorSource = propertySource?.fakeElement(KtFakeSourceElementKind.DefaultAccessor) backingField = FirDefaultPropertyBackingField( moduleData = moduleData, + origin = FirDeclarationOrigin.Source, + source = defaultAccessorSource, annotations = modifiers.annotations.filter { it.useSiteTarget == FIELD || it.useSiteTarget == PROPERTY_DELEGATE_FIELD }.toMutableList(), @@ -144,10 +148,11 @@ class ValueParameter( propertySymbol = symbol, status = status.copy(), ) + annotations += modifiers.annotations.filter { it.useSiteTarget == null || it.useSiteTarget == PROPERTY } - val defaultAccessorSource = propertySource?.fakeElement(KtFakeSourceElementKind.DefaultAccessor) + getter = FirDefaultPropertyGetter( defaultAccessorSource, moduleData, diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 6e1b1a44be7..be27a37aab7 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -567,6 +567,8 @@ open class RawFirBuilder( } else { FirDefaultPropertyBackingField( moduleData = baseModuleData, + origin = FirDeclarationOrigin.Source, + source = property.toFirSourceElement(KtFakeSourceElementKind.DefaultAccessor), annotations = annotationsFromProperty.toMutableList(), returnTypeRef = propertyReturnType.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor), isVar = property.isVar, @@ -649,8 +651,11 @@ open class RawFirBuilder( isVar = isMutable symbol = FirPropertySymbol(callableIdForName(propertyName)) isLocal = false + val defaultAccessorSource = propertySource.fakeElement(KtFakeSourceElementKind.DefaultAccessor) backingField = FirDefaultPropertyBackingField( moduleData = baseModuleData, + origin = FirDeclarationOrigin.Source, + source = defaultAccessorSource, annotations = parameterAnnotations.filter { it.useSiteTarget == FIELD || it.useSiteTarget == PROPERTY_DELEGATE_FIELD }.toMutableList(), @@ -661,7 +666,6 @@ open class RawFirBuilder( ) this.status = status - val defaultAccessorSource = propertySource.fakeElement(KtFakeSourceElementKind.DefaultAccessor) getter = FirDefaultPropertyGetter( defaultAccessorSource, baseModuleData, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyBackingField.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyBackingField.kt index 4e2750e6425..93cb5f5c9dd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyBackingField.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyBackingField.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.declarations.impl +import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirModuleData @@ -20,6 +21,8 @@ import org.jetbrains.kotlin.name.CallableId @OptIn(FirImplementationDetail::class) class FirDefaultPropertyBackingField( moduleData: FirModuleData, + origin: FirDeclarationOrigin, + source: KtSourceElement?, annotations: MutableList, returnTypeRef: FirTypeRef, isVar: Boolean, @@ -27,10 +30,10 @@ class FirDefaultPropertyBackingField( status: FirDeclarationStatus, resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR, ) : FirBackingFieldImpl( - source = null, + source = source, moduleData = moduleData, resolvePhase = resolvePhase, - origin = FirDeclarationOrigin.Synthetic, + origin = origin, attributes = FirDeclarationAttributes(), returnTypeRef = returnTypeRef, receiverParameter = null,