From 6fb39785ff7eda0306659bfea470b6b5f406c61a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 9 Aug 2018 19:15:21 +0200 Subject: [PATCH] Postpone force resolve of annotations on properties Otherwise (after subsequent commits) we may end up calling BindingContext.HAS_BACKING_FIELD too early and getting incorrect value, which will influence which annotations the property and the field will have, and since they're cached as soon as they're computed, they will remain incorrect until the end of the program. Now we're calling force resolve after bodies of property accessors are resolved, which is the point where the backing field presence has been already determined for certain. This all still looks very fragile because we might try to get property's annotations anywhere else before the accessors' bodies are analyzed, but I have no idea at the moment how to improve this without refactoring the whole subsystem --- .../jetbrains/kotlin/resolve/BodyResolver.java | 18 ++++++++++-------- .../kotlin/resolve/LazyTopDownAnalyzer.kt | 1 - 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 5b77daa6eb3..36fe54c1b85 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -742,6 +742,8 @@ public class BodyResolver { } resolvePropertyAccessors(c, property, propertyDescriptor); + + ForceResolveUtil.forceResolveAllContents(propertyDescriptor.getAnnotations()); } private void resolvePropertyDeclarationBodies(@NotNull BodiesResolveContext c) { @@ -797,28 +799,28 @@ public class BodyResolver { languageVersionSettings.supportsFeature(LanguageFeature.ProhibitErroneousExpressionsInAnnotationsWithUseSiteTargets); if (getterDescriptor != null) { - if (getter != null || forceResolveAnnotations) { - ForceResolveUtil.forceResolveAllContents(getterDescriptor.getAnnotations()); - } - if (getter != null) { LexicalScope accessorScope = makeScopeForPropertyAccessor(c, getter, propertyDescriptor); resolveFunctionBody(c.getOuterDataFlowInfo(), fieldAccessTrackingTrace, getter, getterDescriptor, accessorScope); } + + if (getter != null || forceResolveAnnotations) { + ForceResolveUtil.forceResolveAllContents(getterDescriptor.getAnnotations()); + } } KtPropertyAccessor setter = property.getSetter(); PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter(); if (setterDescriptor != null) { - if (setter != null || forceResolveAnnotations) { - ForceResolveUtil.forceResolveAllContents(setterDescriptor.getAnnotations()); - } - if (setter != null) { LexicalScope accessorScope = makeScopeForPropertyAccessor(c, setter, propertyDescriptor); resolveFunctionBody(c.getOuterDataFlowInfo(), fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope); } + + if (setter != null || forceResolveAnnotations) { + ForceResolveUtil.forceResolveAllContents(setterDescriptor.getAnnotations()); + } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt index ac114c27574..703dfa45379 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer.kt @@ -273,7 +273,6 @@ class LazyTopDownAnalyzer( val descriptor = lazyDeclarationResolver.resolveToDescriptor(property) as PropertyDescriptor c.properties.put(property, descriptor) - ForceResolveUtil.forceResolveAllContents(descriptor.annotations) registerTopLevelFqName(topLevelFqNames, property, descriptor) } }