[FIR] Replace resolved flag with resolve status enum for annotation calls

This commit is contained in:
Dmitriy Novozhilov
2020-06-02 17:25:27 +03:00
parent 4f1b7b38b2
commit 73b738b7ff
9 changed files with 26 additions and 10 deletions
@@ -622,13 +622,13 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
} }
override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: ResolutionMode): CompositeTransformResult<FirStatement> { override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: ResolutionMode): CompositeTransformResult<FirStatement> {
if (annotationCall.resolved) return annotationCall.compose() if (annotationCall.resolveStatus == FirAnnotationResolveStatus.Resolved) return annotationCall.compose()
dataFlowAnalyzer.enterAnnotationCall(annotationCall) dataFlowAnalyzer.enterAnnotationCall(annotationCall)
return withFirArrayOfCallTransformer { return withFirArrayOfCallTransformer {
(annotationCall.transformChildren(transformer, data) as FirAnnotationCall).also { (annotationCall.transformChildren(transformer, data) as FirAnnotationCall).also {
// TODO: it's temporary incorrect solution until we design resolve and completion for annotation calls // TODO: it's temporary incorrect solution until we design resolve and completion for annotation calls
it.argumentList.transformArguments(integerLiteralTypeApproximator, null) it.argumentList.transformArguments(integerLiteralTypeApproximator, null)
it.replaceResolved(true) it.replaceResolveStatus(FirAnnotationResolveStatus.Resolved)
dataFlowAnalyzer.exitAnnotationCall(it) dataFlowAnalyzer.exitAnnotationCall(it)
}.compose() }.compose()
} }
@@ -22,7 +22,7 @@ abstract class FirAnnotationCall : FirExpression(), FirCall {
abstract override val argumentList: FirArgumentList abstract override val argumentList: FirArgumentList
abstract val useSiteTarget: AnnotationUseSiteTarget? abstract val useSiteTarget: AnnotationUseSiteTarget?
abstract val annotationTypeRef: FirTypeRef abstract val annotationTypeRef: FirTypeRef
abstract val resolved: Boolean abstract val resolveStatus: FirAnnotationResolveStatus
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnnotationCall(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnnotationCall(this, data)
@@ -30,7 +30,7 @@ abstract class FirAnnotationCall : FirExpression(), FirCall {
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract fun replaceResolved(newResolved: Boolean) abstract fun replaceResolveStatus(newResolveStatus: FirAnnotationResolveStatus)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotationCall abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotationCall
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirAnnotationResolveStatus
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
@@ -31,6 +32,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
override var argumentList: FirArgumentList = FirEmptyArgumentList override var argumentList: FirArgumentList = FirEmptyArgumentList
var useSiteTarget: AnnotationUseSiteTarget? = null var useSiteTarget: AnnotationUseSiteTarget? = null
lateinit var annotationTypeRef: FirTypeRef lateinit var annotationTypeRef: FirTypeRef
var resolveStatus: FirAnnotationResolveStatus = FirAnnotationResolveStatus.Unresolved
override fun build(): FirAnnotationCall { override fun build(): FirAnnotationCall {
return FirAnnotationCallImpl( return FirAnnotationCallImpl(
@@ -39,6 +41,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
argumentList, argumentList,
useSiteTarget, useSiteTarget,
annotationTypeRef, annotationTypeRef,
resolveStatus,
) )
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirAnnotationResolveStatus
import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -23,9 +24,9 @@ internal class FirAnnotationCallImpl(
override var argumentList: FirArgumentList, override var argumentList: FirArgumentList,
override val useSiteTarget: AnnotationUseSiteTarget?, override val useSiteTarget: AnnotationUseSiteTarget?,
override var annotationTypeRef: FirTypeRef, override var annotationTypeRef: FirTypeRef,
override var resolveStatus: FirAnnotationResolveStatus,
) : FirAnnotationCall() { ) : FirAnnotationCall() {
override val typeRef: FirTypeRef get() = annotationTypeRef override val typeRef: FirTypeRef get() = annotationTypeRef
override var resolved: Boolean = false
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
@@ -56,7 +57,7 @@ internal class FirAnnotationCallImpl(
argumentList = newArgumentList argumentList = newArgumentList
} }
override fun replaceResolved(newResolved: Boolean) { override fun replaceResolveStatus(newResolveStatus: FirAnnotationResolveStatus) {
resolved = newResolved resolveStatus = newResolveStatus
} }
} }
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
enum class FirAnnotationResolveStatus {
Unresolved,
PartiallyResolved, // only literals, annotations, class literals and enums
Resolved
}
@@ -95,6 +95,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
default("argumentList") { default("argumentList") {
value = "FirEmptyArgumentList" value = "FirEmptyArgumentList"
} }
default("resolveStatus", "FirAnnotationResolveStatus.Unresolved")
useTypes(emptyArgumentListType) useTypes(emptyArgumentListType)
} }
@@ -70,8 +70,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = "annotationTypeRef" value = "annotationTypeRef"
withGetter = true withGetter = true
} }
defaultFalse("resolved")
} }
impl(arrayOfCall) impl(arrayOfCall)
@@ -413,7 +413,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
annotationCall.configure { annotationCall.configure {
+field("useSiteTarget", annotationUseSiteTargetType, nullable = true) +field("useSiteTarget", annotationUseSiteTargetType, nullable = true)
+field("annotationTypeRef", typeRef).withTransform() +field("annotationTypeRef", typeRef).withTransform()
+booleanField("resolved", withReplace = true) +field("resolveStatus", annotationResolveStatusType, withReplace = true)
} }
arraySetCall.configure { arraySetCall.configure {
@@ -83,3 +83,4 @@ val dslBuilderAnnotationType = generatedType("builder", "FirBuilderDsl")
val firImplementationDetailType = generatedType("FirImplementationDetail") val firImplementationDetailType = generatedType("FirImplementationDetail")
val declarationOriginType = generatedType("declarations", "FirDeclarationOrigin") val declarationOriginType = generatedType("declarations", "FirDeclarationOrigin")
val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes") val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes")
val annotationResolveStatusType = generatedType("expressions", "FirAnnotationResolveStatus")