[FIR] tree: introduce containingDeclarationSymbol for annotation calls

This symbol will be used during resolution to avoid transformation
of annotations in the wrong context in the case of FIR node sharing.
The symbol should be some containing declaration symbol to be able
to answer the question "Are we own this annotation?" during resolution

^KT-63042
This commit is contained in:
Dmitrii Gridin
2023-11-14 15:28:01 +01:00
committed by Space Team
parent 1d5ab8c24f
commit 6eca9fe3a9
7 changed files with 18 additions and 0 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -33,6 +34,7 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
abstract override val calleeReference: FirReference abstract override val calleeReference: FirReference
abstract override val argumentMapping: FirAnnotationArgumentMapping abstract override val argumentMapping: FirAnnotationArgumentMapping
abstract val annotationResolvePhase: FirAnnotationResolvePhase abstract val annotationResolvePhase: FirAnnotationResolvePhase
abstract val containingDeclarationSymbol: FirBasedSymbol<*>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnnotationCall(this, data) visitor.visitAnnotationCall(this, data)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -34,6 +35,7 @@ abstract class FirErrorAnnotationCall : FirAnnotationCall(), FirDiagnosticHolder
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirReference abstract override val calleeReference: FirReference
abstract override val annotationResolvePhase: FirAnnotationResolvePhase abstract override val annotationResolvePhase: FirAnnotationResolvePhase
abstract override val containingDeclarationSymbol: FirBasedSymbol<*>
abstract override val diagnostic: ConeDiagnostic abstract override val diagnostic: ConeDiagnostic
abstract override val argumentMapping: FirAnnotationArgumentMapping abstract override val argumentMapping: FirAnnotationArgumentMapping
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirAnnotationCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirAnnotationCallImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -35,6 +36,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
lateinit var calleeReference: FirReference lateinit var calleeReference: FirReference
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
var annotationResolvePhase: FirAnnotationResolvePhase = FirAnnotationResolvePhase.Unresolved var annotationResolvePhase: FirAnnotationResolvePhase = FirAnnotationResolvePhase.Unresolved
lateinit var containingDeclarationSymbol: FirBasedSymbol<*>
override fun build(): FirAnnotationCall { override fun build(): FirAnnotationCall {
return FirAnnotationCallImpl( return FirAnnotationCallImpl(
@@ -46,6 +48,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
calleeReference, calleeReference,
argumentMapping, argumentMapping,
annotationResolvePhase, annotationResolvePhase,
containingDeclarationSymbol,
) )
} }
@@ -83,5 +86,6 @@ inline fun buildAnnotationCallCopy(original: FirAnnotationCall, init: FirAnnotat
copyBuilder.calleeReference = original.calleeReference copyBuilder.calleeReference = original.calleeReference
copyBuilder.argumentMapping = original.argumentMapping copyBuilder.argumentMapping = original.argumentMapping
copyBuilder.annotationResolvePhase = original.annotationResolvePhase copyBuilder.annotationResolvePhase = original.annotationResolvePhase
copyBuilder.containingDeclarationSymbol = original.containingDeclarationSymbol
return copyBuilder.apply(init).build() return copyBuilder.apply(init).build()
} }
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorAnnotationCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirErrorAnnotationCallImpl
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -34,6 +35,7 @@ class FirErrorAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuil
val typeArguments: MutableList<FirTypeProjection> = mutableListOf() val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList override var argumentList: FirArgumentList = FirEmptyArgumentList
lateinit var calleeReference: FirReference lateinit var calleeReference: FirReference
lateinit var containingDeclarationSymbol: FirBasedSymbol<*>
lateinit var diagnostic: ConeDiagnostic lateinit var diagnostic: ConeDiagnostic
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
@@ -45,6 +47,7 @@ class FirErrorAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuil
typeArguments.toMutableOrEmpty(), typeArguments.toMutableOrEmpty(),
argumentList, argumentList,
calleeReference, calleeReference,
containingDeclarationSymbol,
diagnostic, diagnostic,
argumentMapping, argumentMapping,
) )
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -33,6 +34,7 @@ internal class FirAnnotationCallImpl(
override var calleeReference: FirReference, override var calleeReference: FirReference,
override var argumentMapping: FirAnnotationArgumentMapping, override var argumentMapping: FirAnnotationArgumentMapping,
override var annotationResolvePhase: FirAnnotationResolvePhase, override var annotationResolvePhase: FirAnnotationResolvePhase,
override val containingDeclarationSymbol: FirBasedSymbol<*>,
) : FirAnnotationCall() { ) : FirAnnotationCall() {
@OptIn(UnresolvedExpressionTypeAccess::class) @OptIn(UnresolvedExpressionTypeAccess::class)
override val coneTypeOrNull: ConeKotlinType? override val coneTypeOrNull: ConeKotlinType?
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -32,6 +33,7 @@ internal class FirErrorAnnotationCallImpl(
override var typeArguments: MutableOrEmptyList<FirTypeProjection>, override var typeArguments: MutableOrEmptyList<FirTypeProjection>,
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override var calleeReference: FirReference, override var calleeReference: FirReference,
override val containingDeclarationSymbol: FirBasedSymbol<*>,
override val diagnostic: ConeDiagnostic, override val diagnostic: ConeDiagnostic,
override var argumentMapping: FirAnnotationArgumentMapping, override var argumentMapping: FirAnnotationArgumentMapping,
) : FirErrorAnnotationCall() { ) : FirErrorAnnotationCall() {
@@ -540,6 +540,9 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
annotationCall.configure { annotationCall.configure {
+field("argumentMapping", annotationArgumentMapping, withReplace = true) +field("argumentMapping", annotationArgumentMapping, withReplace = true)
+field("annotationResolvePhase", annotationResolvePhaseType, withReplace = true) +field("annotationResolvePhase", annotationResolvePhaseType, withReplace = true)
+field("containingDeclarationSymbol", firBasedSymbolType.withArgs(TypeRef.Star)).apply {
withBindThis = false
}
} }
errorAnnotationCall.configure { errorAnnotationCall.configure {