[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> {
if (annotationCall.resolved) return annotationCall.compose()
if (annotationCall.resolveStatus == FirAnnotationResolveStatus.Resolved) return annotationCall.compose()
dataFlowAnalyzer.enterAnnotationCall(annotationCall)
return withFirArrayOfCallTransformer {
(annotationCall.transformChildren(transformer, data) as FirAnnotationCall).also {
// TODO: it's temporary incorrect solution until we design resolve and completion for annotation calls
it.argumentList.transformArguments(integerLiteralTypeApproximator, null)
it.replaceResolved(true)
it.replaceResolveStatus(FirAnnotationResolveStatus.Resolved)
dataFlowAnalyzer.exitAnnotationCall(it)
}.compose()
}
@@ -22,7 +22,7 @@ abstract class FirAnnotationCall : FirExpression(), FirCall {
abstract override val argumentList: FirArgumentList
abstract val useSiteTarget: AnnotationUseSiteTarget?
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)
@@ -30,7 +30,7 @@ abstract class FirAnnotationCall : FirExpression(), FirCall {
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
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
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.FirEmptyArgumentList
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
@@ -31,6 +32,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
override var argumentList: FirArgumentList = FirEmptyArgumentList
var useSiteTarget: AnnotationUseSiteTarget? = null
lateinit var annotationTypeRef: FirTypeRef
var resolveStatus: FirAnnotationResolveStatus = FirAnnotationResolveStatus.Unresolved
override fun build(): FirAnnotationCall {
return FirAnnotationCallImpl(
@@ -39,6 +41,7 @@ class FirAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder,
argumentList,
useSiteTarget,
annotationTypeRef,
resolveStatus,
)
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.FirSourceElement
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.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
@@ -23,9 +24,9 @@ internal class FirAnnotationCallImpl(
override var argumentList: FirArgumentList,
override val useSiteTarget: AnnotationUseSiteTarget?,
override var annotationTypeRef: FirTypeRef,
override var resolveStatus: FirAnnotationResolveStatus,
) : FirAnnotationCall() {
override val typeRef: FirTypeRef get() = annotationTypeRef
override var resolved: Boolean = false
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }
@@ -56,7 +57,7 @@ internal class FirAnnotationCallImpl(
argumentList = newArgumentList
}
override fun replaceResolved(newResolved: Boolean) {
resolved = newResolved
override fun replaceResolveStatus(newResolveStatus: FirAnnotationResolveStatus) {
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") {
value = "FirEmptyArgumentList"
}
default("resolveStatus", "FirAnnotationResolveStatus.Unresolved")
useTypes(emptyArgumentListType)
}
@@ -70,8 +70,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = "annotationTypeRef"
withGetter = true
}
defaultFalse("resolved")
}
impl(arrayOfCall)
@@ -413,7 +413,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
annotationCall.configure {
+field("useSiteTarget", annotationUseSiteTargetType, nullable = true)
+field("annotationTypeRef", typeRef).withTransform()
+booleanField("resolved", withReplace = true)
+field("resolveStatus", annotationResolveStatusType, withReplace = true)
}
arraySetCall.configure {
@@ -83,3 +83,4 @@ val dslBuilderAnnotationType = generatedType("builder", "FirBuilderDsl")
val firImplementationDetailType = generatedType("FirImplementationDetail")
val declarationOriginType = generatedType("declarations", "FirDeclarationOrigin")
val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes")
val annotationResolveStatusType = generatedType("expressions", "FirAnnotationResolveStatus")