From 831df27cac3a6baf6d14126461d946994dc4f44c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 21 Sep 2015 11:28:08 +0300 Subject: [PATCH] "field": refactoring, isBackingFieldReference, referencedProperty --- .../kotlin/cfg/JetFlowInformationProvider.java | 11 ++++------- .../descriptors/impl/SyntheticFieldDescriptor.kt | 6 +++++- .../src/org/jetbrains/kotlin/psi/JetPsiUtil.java | 10 ++++++---- .../reference/BackingFieldAccessTranslator.java | 14 ++++++-------- .../translate/reference/ReferenceTranslator.java | 3 +-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java index a9304f8aef0..61f18d77b46 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java @@ -47,7 +47,7 @@ import org.jetbrains.kotlin.cfg.pseudocodeTraverser.Edges; import org.jetbrains.kotlin.cfg.pseudocodeTraverser.PseudocodeTraverserPackage; import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptorKt; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; import org.jetbrains.kotlin.diagnostics.Errors; @@ -401,11 +401,8 @@ public class JetFlowInformationProvider { @NotNull Collection varWithValReassignErrorGenerated ) { VariableDescriptor variableDescriptor = ctxt.variableDescriptor; - if (variableDescriptor instanceof SyntheticFieldDescriptor - || (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor)) { - PropertyDescriptor propertyDescriptor = variableDescriptor instanceof SyntheticFieldDescriptor - ? ((SyntheticFieldDescriptor) variableDescriptor).getPropertyDescriptor() - : (PropertyDescriptor) variableDescriptor; + PropertyDescriptor propertyDescriptor = SyntheticFieldDescriptorKt.getReferencedProperty(variableDescriptor); + if (JetPsiUtil.isBackingFieldReference(expression, variableDescriptor) && propertyDescriptor != null) { JetPropertyAccessor accessor = PsiTreeUtil.getParentOfType(expression, JetPropertyAccessor.class); if (accessor != null) { DeclarationDescriptor accessorDescriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, accessor); @@ -573,7 +570,7 @@ public class JetFlowInformationProvider { boolean reportError ) { error[0] = false; - if (JetPsiUtil.isBackingFieldReference(element)) { + if (JetPsiUtil.isBackingFieldReference(element, null)) { return true; } if (element instanceof JetDotQualifiedExpression && isCorrectBackingFieldReference( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt index 3980c004ed9..b06f6faa702 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/impl/SyntheticFieldDescriptor.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.descriptors.impl +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations @@ -38,4 +39,7 @@ class SyntheticFieldDescriptor private constructor( companion object { val NAME = Name.identifier("field") } -} \ No newline at end of file +} + +public val DeclarationDescriptor.referencedProperty: PropertyDescriptor? + get() = if (this is SyntheticFieldDescriptor) this.propertyDescriptor else if (this is PropertyDescriptor) this else null diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java index 573281c4e98..04e14b995ea 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java @@ -33,6 +33,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.JetNodeTypes; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; import org.jetbrains.kotlin.kdoc.psi.api.KDocElement; import org.jetbrains.kotlin.lexer.JetToken; import org.jetbrains.kotlin.lexer.JetTokens; @@ -407,12 +409,12 @@ public class JetPsiUtil { return declaration.getBodyExpression() == null; } - public static boolean isBackingFieldReference(@NotNull JetSimpleNameExpression expression) { - return expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER; + public static boolean isBackingFieldReference(@NotNull JetSimpleNameExpression expression, @Nullable DeclarationDescriptor descriptor) { + return descriptor instanceof SyntheticFieldDescriptor || expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER; } - public static boolean isBackingFieldReference(@Nullable JetElement element) { - return element instanceof JetSimpleNameExpression && isBackingFieldReference((JetSimpleNameExpression)element); + public static boolean isBackingFieldReference(@Nullable JetElement element, @Nullable DeclarationDescriptor descriptor) { + return element instanceof JetSimpleNameExpression && isBackingFieldReference((JetSimpleNameExpression) element, descriptor); } @Nullable diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java index c3a49318d4e..a9d75a58cb5 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/BackingFieldAccessTranslator.java @@ -18,9 +18,8 @@ package org.jetbrains.kotlin.js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.PropertyDescriptor; -import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor; +import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptorKt; import org.jetbrains.kotlin.js.translate.context.TemporaryVariable; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; @@ -41,12 +40,11 @@ public final class BackingFieldAccessTranslator extends AbstractTranslator imple /*package*/ public static BackingFieldAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { - DeclarationDescriptor referencedProperty = getDescriptorForReferenceExpression(context.bindingContext(), expression); - if (referencedProperty instanceof SyntheticFieldDescriptor) { - referencedProperty = ((SyntheticFieldDescriptor) referencedProperty).getPropertyDescriptor(); - } - assert referencedProperty instanceof PropertyDescriptor; - return new BackingFieldAccessTranslator((PropertyDescriptor) referencedProperty, context); + PropertyDescriptor referencedProperty = SyntheticFieldDescriptorKt.getReferencedProperty( + getDescriptorForReferenceExpression(context.bindingContext(), expression) + ); + assert referencedProperty != null; + return new BackingFieldAccessTranslator(referencedProperty, context); } private BackingFieldAccessTranslator(@NotNull PropertyDescriptor descriptor, @NotNull TranslationContext context) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java index 51658d05c79..e45d25282af 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/ReferenceTranslator.java @@ -104,8 +104,7 @@ public final class ReferenceTranslator { public static AccessTranslator getAccessTranslator(@NotNull JetSimpleNameExpression referenceExpression, @Nullable JsExpression receiver, @NotNull TranslationContext context) { - if (getDescriptorForReferenceExpression(context.bindingContext(), referenceExpression) instanceof SyntheticFieldDescriptor - || isBackingFieldReference(referenceExpression)) { + if (isBackingFieldReference(referenceExpression, getDescriptorForReferenceExpression(context.bindingContext(), referenceExpression))) { return BackingFieldAccessTranslator.newInstance(referenceExpression, context); } if (canBePropertyAccess(referenceExpression, context)) {