[FIR] Support of type arguments in annotations ^KT-48444 Fixed

This commit is contained in:
Ivan Kochurkin
2022-04-06 20:54:26 +03:00
committed by teamcity
parent 05bed8f751
commit 8c7fad9a5e
26 changed files with 465 additions and 36 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -23,6 +24,7 @@ abstract class FirAnnotation : FirExpression() {
abstract val useSiteTarget: AnnotationUseSiteTarget?
abstract val annotationTypeRef: FirTypeRef
abstract val argumentMapping: FirAnnotationArgumentMapping
abstract val typeArguments: List<FirTypeProjection>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnnotation(this, data)
@@ -34,7 +36,11 @@ abstract class FirAnnotation : FirExpression() {
abstract fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping)
abstract fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotation
abstract fun <D> transformAnnotationTypeRef(transformer: FirTransformer<D>, data: D): FirAnnotation
abstract fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirAnnotation
}
@@ -9,6 +9,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.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -23,6 +24,7 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
abstract override val annotations: List<FirAnnotation>
abstract override val useSiteTarget: AnnotationUseSiteTarget?
abstract override val annotationTypeRef: FirTypeRef
abstract override val typeArguments: List<FirTypeProjection>
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirReference
abstract override val argumentMapping: FirAnnotationArgumentMapping
@@ -35,6 +37,8 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
@@ -45,5 +49,7 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
abstract override fun <D> transformAnnotationTypeRef(transformer: FirTransformer<D>, data: D): FirAnnotationCall
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirAnnotationCall
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirAnnotationCall
}
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirAnnotationImpl
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -28,6 +29,7 @@ class FirAnnotationBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder
var useSiteTarget: AnnotationUseSiteTarget? = null
lateinit var annotationTypeRef: FirTypeRef
lateinit var argumentMapping: FirAnnotationArgumentMapping
val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override fun build(): FirAnnotation {
return FirAnnotationImpl(
@@ -35,6 +37,7 @@ class FirAnnotationBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder
useSiteTarget,
annotationTypeRef,
argumentMapping,
typeArguments,
)
}
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
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.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.*
@@ -34,6 +35,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
override var source: KtSourceElement? = null
var useSiteTarget: AnnotationUseSiteTarget? = null
var annotationTypeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
lateinit var calleeReference: FirReference
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
@@ -43,6 +45,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
source,
useSiteTarget,
annotationTypeRef,
typeArguments,
argumentList,
calleeReference,
argumentMapping,
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -24,6 +25,7 @@ internal class FirAnnotationCallImpl(
override val source: KtSourceElement?,
override val useSiteTarget: AnnotationUseSiteTarget?,
override var annotationTypeRef: FirTypeRef,
override val typeArguments: MutableList<FirTypeProjection>,
override var argumentList: FirArgumentList,
override var calleeReference: FirReference,
override var argumentMapping: FirAnnotationArgumentMapping,
@@ -33,12 +35,14 @@ internal class FirAnnotationCallImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotationTypeRef.accept(visitor, data)
typeArguments.forEach { it.accept(visitor, data) }
argumentList.accept(visitor, data)
calleeReference.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAnnotationCallImpl {
transformAnnotationTypeRef(transformer, data)
transformTypeArguments(transformer, data)
argumentList = argumentList.transform(transformer, data)
transformCalleeReference(transformer, data)
return this
@@ -53,6 +57,11 @@ internal class FirAnnotationCallImpl(
return this
}
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirAnnotationCallImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirAnnotationCallImpl {
calleeReference = calleeReference.transform(transformer, data)
return this
@@ -60,6 +69,11 @@ internal class FirAnnotationCallImpl(
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
typeArguments.clear()
typeArguments.addAll(newTypeArguments)
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
argumentList = newArgumentList
}
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -22,6 +23,7 @@ internal class FirAnnotationImpl(
override val useSiteTarget: AnnotationUseSiteTarget?,
override var annotationTypeRef: FirTypeRef,
override var argumentMapping: FirAnnotationArgumentMapping,
override val typeArguments: MutableList<FirTypeProjection>,
) : FirAnnotation() {
override val typeRef: FirTypeRef get() = annotationTypeRef
override val annotations: List<FirAnnotation> get() = emptyList()
@@ -29,11 +31,13 @@ internal class FirAnnotationImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotationTypeRef.accept(visitor, data)
argumentMapping.accept(visitor, data)
typeArguments.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirAnnotationImpl {
transformAnnotationTypeRef(transformer, data)
argumentMapping = argumentMapping.transform(transformer, data)
transformTypeArguments(transformer, data)
return this
}
@@ -46,9 +50,19 @@ internal class FirAnnotationImpl(
return this
}
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirAnnotationImpl {
typeArguments.transformInplace(transformer, data)
return this
}
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping) {
argumentMapping = newArgumentMapping
}
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
typeArguments.clear()
typeArguments.addAll(newTypeArguments)
}
}
@@ -458,6 +458,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("useSiteTarget", annotationUseSiteTargetType, nullable = true)
+field("annotationTypeRef", typeRef).withTransform()
+field("argumentMapping", annotationArgumentMapping, withReplace = true)
+typeArguments.withTransform()
}
annotationCall.configure {