[FIR] Support resolution of meta-annotations before supertypes
Now annotations are resolved with following algorithm:
1. On COMPILER_REQUIRED_ANNOTATIONS we resolve all annotations
and store results if this is compiler annotation, plugin annotation,
or annotation with meta-annotation (meta annotations are checked
recursively with designated resolution if needed)
2. On TYPES stage we resolve all those annotations once again and if
some annotation changes resolution then we keep type from p.1 and
report error on this annotation, so user should disambiguate it
Ambiguity may occur because of nested annotations with same name as
plugin annotations:
```
annotation class SomeAnnotation // (1) plugin annotation
open class Base {
annotation class SomeAnnotation // (2)
}
class Derived : Base() {
@SomeAnnotation // <-----------------
class Inner
}
```
At COMPILER_REQUIRED_ANNOTATIONS annotation call will be resolved to (1)
because at this stage supertypes are not resolved yet, and we consider
only importing scopes. At the TYPES stage we will find correct
annotation from supertype
This commit is contained in:
committed by
Space Team
parent
6a9b525ca0
commit
6864433581
@@ -34,6 +34,8 @@ abstract class FirAnnotation : FirExpression() {
|
||||
|
||||
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
|
||||
|
||||
abstract fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef)
|
||||
|
||||
abstract fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping)
|
||||
|
||||
abstract fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||
|
||||
@@ -28,6 +28,7 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
|
||||
abstract override val argumentList: FirArgumentList
|
||||
abstract override val calleeReference: FirReference
|
||||
abstract override val argumentMapping: FirAnnotationArgumentMapping
|
||||
abstract val annotationResolvePhase: FirAnnotationResolvePhase
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnnotationCall(this, data)
|
||||
|
||||
@@ -37,6 +38,8 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
|
||||
|
||||
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
|
||||
|
||||
abstract override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef)
|
||||
|
||||
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||
|
||||
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
|
||||
@@ -45,6 +48,8 @@ abstract class FirAnnotationCall : FirAnnotation(), FirCall, FirResolvable {
|
||||
|
||||
abstract override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping)
|
||||
|
||||
abstract fun replaceAnnotationResolvePhase(newAnnotationResolvePhase: FirAnnotationResolvePhase)
|
||||
|
||||
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotationCall
|
||||
|
||||
abstract override fun <D> transformAnnotationTypeRef(transformer: FirTransformer<D>, data: D): FirAnnotationCall
|
||||
|
||||
@@ -29,6 +29,7 @@ abstract class FirErrorAnnotationCall : FirAnnotationCall(), FirDiagnosticHolder
|
||||
abstract override val typeArguments: List<FirTypeProjection>
|
||||
abstract override val argumentList: FirArgumentList
|
||||
abstract override val calleeReference: FirReference
|
||||
abstract override val annotationResolvePhase: FirAnnotationResolvePhase
|
||||
abstract override val diagnostic: ConeDiagnostic
|
||||
abstract override val argumentMapping: FirAnnotationArgumentMapping
|
||||
|
||||
@@ -40,12 +41,16 @@ abstract class FirErrorAnnotationCall : FirAnnotationCall(), FirDiagnosticHolder
|
||||
|
||||
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
|
||||
|
||||
abstract override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef)
|
||||
|
||||
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||
|
||||
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
|
||||
|
||||
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
|
||||
|
||||
abstract override fun replaceAnnotationResolvePhase(newAnnotationResolvePhase: FirAnnotationResolvePhase)
|
||||
|
||||
abstract override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping)
|
||||
|
||||
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCall
|
||||
|
||||
+4
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationResolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
|
||||
@@ -41,6 +42,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
|
||||
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
||||
lateinit var calleeReference: FirReference
|
||||
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
|
||||
var annotationResolvePhase: FirAnnotationResolvePhase = FirAnnotationResolvePhase.Unresolved
|
||||
|
||||
override fun build(): FirAnnotationCall {
|
||||
return FirAnnotationCallImpl(
|
||||
@@ -51,6 +53,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
|
||||
argumentList,
|
||||
calleeReference,
|
||||
argumentMapping,
|
||||
annotationResolvePhase,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -87,5 +90,6 @@ inline fun buildAnnotationCallCopy(original: FirAnnotationCall, init: FirAnnotat
|
||||
copyBuilder.argumentList = original.argumentList
|
||||
copyBuilder.calleeReference = original.calleeReference
|
||||
copyBuilder.argumentMapping = original.argumentMapping
|
||||
copyBuilder.annotationResolvePhase = original.annotationResolvePhase
|
||||
return copyBuilder.apply(init).build()
|
||||
}
|
||||
|
||||
+1
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationResolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||
|
||||
+10
@@ -12,6 +12,7 @@ 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.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationResolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||
@@ -31,6 +32,7 @@ internal class FirAnnotationCallImpl(
|
||||
override var argumentList: FirArgumentList,
|
||||
override var calleeReference: FirReference,
|
||||
override var argumentMapping: FirAnnotationArgumentMapping,
|
||||
override var annotationResolvePhase: FirAnnotationResolvePhase,
|
||||
) : FirAnnotationCall() {
|
||||
override val typeRef: FirTypeRef get() = annotationTypeRef
|
||||
override val annotations: List<FirAnnotation> get() = emptyList()
|
||||
@@ -71,6 +73,10 @@ internal class FirAnnotationCallImpl(
|
||||
|
||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
|
||||
|
||||
override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) {
|
||||
annotationTypeRef = newAnnotationTypeRef
|
||||
}
|
||||
|
||||
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||
typeArguments.clear()
|
||||
typeArguments.addAll(newTypeArguments)
|
||||
@@ -87,4 +93,8 @@ internal class FirAnnotationCallImpl(
|
||||
override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping) {
|
||||
argumentMapping = newArgumentMapping
|
||||
}
|
||||
|
||||
override fun replaceAnnotationResolvePhase(newAnnotationResolvePhase: FirAnnotationResolvePhase) {
|
||||
annotationResolvePhase = newAnnotationResolvePhase
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,6 +59,10 @@ internal class FirAnnotationImpl(
|
||||
|
||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
|
||||
|
||||
override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) {
|
||||
annotationTypeRef = newAnnotationTypeRef
|
||||
}
|
||||
|
||||
override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping) {
|
||||
argumentMapping = newArgumentMapping
|
||||
}
|
||||
|
||||
+10
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationResolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.references.FirReference
|
||||
@@ -36,6 +37,7 @@ internal class FirErrorAnnotationCallImpl(
|
||||
) : FirErrorAnnotationCall() {
|
||||
override val typeRef: FirTypeRef get() = annotationTypeRef
|
||||
override val annotations: List<FirAnnotation> get() = emptyList()
|
||||
override var annotationResolvePhase: FirAnnotationResolvePhase = FirAnnotationResolvePhase.Types
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
annotationTypeRef.accept(visitor, data)
|
||||
@@ -73,6 +75,10 @@ internal class FirErrorAnnotationCallImpl(
|
||||
|
||||
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
|
||||
|
||||
override fun replaceAnnotationTypeRef(newAnnotationTypeRef: FirTypeRef) {
|
||||
annotationTypeRef = newAnnotationTypeRef
|
||||
}
|
||||
|
||||
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||
typeArguments.clear()
|
||||
typeArguments.addAll(newTypeArguments)
|
||||
@@ -86,6 +92,10 @@ internal class FirErrorAnnotationCallImpl(
|
||||
calleeReference = newCalleeReference
|
||||
}
|
||||
|
||||
override fun replaceAnnotationResolvePhase(newAnnotationResolvePhase: FirAnnotationResolvePhase) {
|
||||
annotationResolvePhase = newAnnotationResolvePhase
|
||||
}
|
||||
|
||||
override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping) {
|
||||
argumentMapping = newArgumentMapping
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user