[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.fir.FirElement
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.FirTypeProjection
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 argumentMapping: FirAnnotationArgumentMapping
abstract val annotationResolvePhase: FirAnnotationResolvePhase
abstract val containingDeclarationSymbol: FirBasedSymbol<*>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
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.FirDiagnosticHolder
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.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -34,6 +35,7 @@ abstract class FirErrorAnnotationCall : FirAnnotationCall(), FirDiagnosticHolder
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirReference
abstract override val annotationResolvePhase: FirAnnotationResolvePhase
abstract override val containingDeclarationSymbol: FirBasedSymbol<*>
abstract override val diagnostic: ConeDiagnostic
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.FirEmptyAnnotationArgumentMapping
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.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -35,6 +36,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
lateinit var calleeReference: FirReference
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
var annotationResolvePhase: FirAnnotationResolvePhase = FirAnnotationResolvePhase.Unresolved
lateinit var containingDeclarationSymbol: FirBasedSymbol<*>
override fun build(): FirAnnotationCall {
return FirAnnotationCallImpl(
@@ -46,6 +48,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
calleeReference,
argumentMapping,
annotationResolvePhase,
containingDeclarationSymbol,
)
}
@@ -83,5 +86,6 @@ inline fun buildAnnotationCallCopy(original: FirAnnotationCall, init: FirAnnotat
copyBuilder.calleeReference = original.calleeReference
copyBuilder.argumentMapping = original.argumentMapping
copyBuilder.annotationResolvePhase = original.annotationResolvePhase
copyBuilder.containingDeclarationSymbol = original.containingDeclarationSymbol
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.FirErrorAnnotationCallImpl
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.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -34,6 +35,7 @@ class FirErrorAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuil
val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
lateinit var calleeReference: FirReference
lateinit var containingDeclarationSymbol: FirBasedSymbol<*>
lateinit var diagnostic: ConeDiagnostic
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
@@ -45,6 +47,7 @@ class FirErrorAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuil
typeArguments.toMutableOrEmpty(),
argumentList,
calleeReference,
containingDeclarationSymbol,
diagnostic,
argumentMapping,
)
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.*
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.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -33,6 +34,7 @@ internal class FirAnnotationCallImpl(
override var calleeReference: FirReference,
override var argumentMapping: FirAnnotationArgumentMapping,
override var annotationResolvePhase: FirAnnotationResolvePhase,
override val containingDeclarationSymbol: FirBasedSymbol<*>,
) : FirAnnotationCall() {
@OptIn(UnresolvedExpressionTypeAccess::class)
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.expressions.*
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.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -32,6 +33,7 @@ internal class FirErrorAnnotationCallImpl(
override var typeArguments: MutableOrEmptyList<FirTypeProjection>,
override var argumentList: FirArgumentList,
override var calleeReference: FirReference,
override val containingDeclarationSymbol: FirBasedSymbol<*>,
override val diagnostic: ConeDiagnostic,
override var argumentMapping: FirAnnotationArgumentMapping,
) : FirErrorAnnotationCall() {
@@ -540,6 +540,9 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
annotationCall.configure {
+field("argumentMapping", annotationArgumentMapping, withReplace = true)
+field("annotationResolvePhase", annotationResolvePhaseType, withReplace = true)
+field("containingDeclarationSymbol", firBasedSymbolType.withArgs(TypeRef.Star)).apply {
withBindThis = false
}
}
errorAnnotationCall.configure {