From 1177a568152a82ff9cb9b7bcbf17e7a289e92a99 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 30 Mar 2020 11:47:34 +0300 Subject: [PATCH] [FIR] Don't resolve annotations twice --- .../body/resolve/FirExpressionsResolveTransformer.kt | 2 ++ .../jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt | 3 +++ .../kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt | 5 +++++ .../kotlin/fir/tree/generator/ImplementationConfigurator.kt | 2 ++ .../jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt | 1 + 5 files changed, 13 insertions(+) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index dfad6f94065..d647521d841 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -563,10 +563,12 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : } override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: ResolutionMode): CompositeTransformResult { + if (annotationCall.resolved) return annotationCall.compose() dataFlowAnalyzer.enterAnnotationCall(annotationCall) return (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) dataFlowAnalyzer.exitAnnotationCall(it) }.compose() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt index d9d39f1b481..b2ff5bf7195 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnnotationCall.kt @@ -22,8 +22,11 @@ abstract class FirAnnotationCall : FirExpression(), FirCall { abstract override val argumentList: FirArgumentList abstract val useSiteTarget: AnnotationUseSiteTarget? abstract val annotationTypeRef: FirTypeRef + abstract val resolved: Boolean override fun accept(visitor: FirVisitor, data: D): R = visitor.visitAnnotationCall(this, data) + abstract fun replaceResolved(newResolved: Boolean) + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirAnnotationCall } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt index 81fe9e46a67..f199c8a56ed 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirAnnotationCallImpl.kt @@ -25,6 +25,7 @@ internal class FirAnnotationCallImpl( override var annotationTypeRef: FirTypeRef, ) : FirAnnotationCall() { override val typeRef: FirTypeRef get() = annotationTypeRef + override var resolved: Boolean = false override fun acceptChildren(visitor: FirVisitor, data: D) { annotations.forEach { it.accept(visitor, data) } @@ -49,4 +50,8 @@ internal class FirAnnotationCallImpl( override fun replaceArgumentList(newArgumentList: FirArgumentList) { argumentList = newArgumentList } + + override fun replaceResolved(newResolved: Boolean) { + resolved = newResolved + } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 5cec5333fe6..ff24b17a502 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -78,6 +78,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() value = "annotationTypeRef" withGetter = true } + + defaultFalse("resolved") } impl(arrayOfCall) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 11e57394af5..cf5d7455aab 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -398,6 +398,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild annotationCall.configure { +field("useSiteTarget", annotationUseSiteTargetType, nullable = true) +field("annotationTypeRef", typeRef) + +booleanField("resolved", withReplace = true) } arraySetCall.configure {