"field": refactoring, isBackingFieldReference, referencedProperty

This commit is contained in:
Mikhail Glukhikh
2015-09-21 11:28:08 +03:00
parent ad302fcfba
commit 831df27cac
5 changed files with 22 additions and 22 deletions
@@ -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<VariableDescriptor> 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(
@@ -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")
}
}
}
public val DeclarationDescriptor.referencedProperty: PropertyDescriptor?
get() = if (this is SyntheticFieldDescriptor) this.propertyDescriptor else if (this is PropertyDescriptor) this else null
@@ -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