[FIR] Don't resolve annotations twice
This commit is contained in:
+2
@@ -563,10 +563,12 @@ 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()
|
||||||
dataFlowAnalyzer.enterAnnotationCall(annotationCall)
|
dataFlowAnalyzer.enterAnnotationCall(annotationCall)
|
||||||
return (annotationCall.transformChildren(transformer, data) as FirAnnotationCall).also {
|
return (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)
|
||||||
dataFlowAnalyzer.exitAnnotationCall(it)
|
dataFlowAnalyzer.exitAnnotationCall(it)
|
||||||
}.compose()
|
}.compose()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,11 @@ 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
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
abstract fun replaceResolved(newResolved: Boolean)
|
||||||
|
|
||||||
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotationCall
|
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotationCall
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -25,6 +25,7 @@ internal class FirAnnotationCallImpl(
|
|||||||
override var annotationTypeRef: FirTypeRef,
|
override var annotationTypeRef: FirTypeRef,
|
||||||
) : 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) }
|
||||||
@@ -49,4 +50,8 @@ internal class FirAnnotationCallImpl(
|
|||||||
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
|
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
|
||||||
argumentList = newArgumentList
|
argumentList = newArgumentList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun replaceResolved(newResolved: Boolean) {
|
||||||
|
resolved = newResolved
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -78,6 +78,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
|||||||
value = "annotationTypeRef"
|
value = "annotationTypeRef"
|
||||||
withGetter = true
|
withGetter = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaultFalse("resolved")
|
||||||
}
|
}
|
||||||
|
|
||||||
impl(arrayOfCall)
|
impl(arrayOfCall)
|
||||||
|
|||||||
+1
@@ -398,6 +398,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
|||||||
annotationCall.configure {
|
annotationCall.configure {
|
||||||
+field("useSiteTarget", annotationUseSiteTargetType, nullable = true)
|
+field("useSiteTarget", annotationUseSiteTargetType, nullable = true)
|
||||||
+field("annotationTypeRef", typeRef)
|
+field("annotationTypeRef", typeRef)
|
||||||
|
+booleanField("resolved", withReplace = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
arraySetCall.configure {
|
arraySetCall.configure {
|
||||||
|
|||||||
Reference in New Issue
Block a user