[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:
Dmitriy Novozhilov
2022-11-25 12:08:43 +02:00
committed by Space Team
parent 6a9b525ca0
commit 6864433581
48 changed files with 1065 additions and 387 deletions
@@ -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
@@ -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()
}
@@ -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
@@ -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
}
@@ -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
}