"field": refactoring, isBackingFieldReference, referencedProperty
This commit is contained in:
@@ -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(
|
||||
|
||||
+5
-1
@@ -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
|
||||
|
||||
+6
-8
@@ -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) {
|
||||
|
||||
+1
-2
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user