From 9939f96c090eb40f87435e188abaf9d5b536bfec Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 16 Sep 2015 12:05:44 +0300 Subject: [PATCH] "field" reassignment: fix and test --- .../jetbrains/kotlin/cfg/JetFlowInformationProvider.java | 8 ++++++-- .../diagnostics/tests/backingField/FieldReassignment.kt | 5 +++++ .../diagnostics/tests/backingField/FieldReassignment.txt | 3 +++ .../kotlin/checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt create mode 100644 compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java index 5e2f5631e37..3973f48fc88 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/JetFlowInformationProvider.java @@ -47,6 +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.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; import org.jetbrains.kotlin.diagnostics.Errors; @@ -400,8 +401,11 @@ public class JetFlowInformationProvider { @NotNull Collection varWithValReassignErrorGenerated ) { VariableDescriptor variableDescriptor = ctxt.variableDescriptor; - if (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor) { - PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor; + if (variableDescriptor instanceof SyntheticFieldDescriptor + || (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor)) { + PropertyDescriptor propertyDescriptor = variableDescriptor instanceof SyntheticFieldDescriptor + ? ((SyntheticFieldDescriptor) variableDescriptor).getPropertyDescriptor() + : (PropertyDescriptor) variableDescriptor; JetPropertyAccessor accessor = PsiTreeUtil.getParentOfType(expression, JetPropertyAccessor.class); if (accessor != null) { DeclarationDescriptor accessorDescriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, accessor); diff --git a/compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt new file mode 100644 index 00000000000..755979ab00d --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt @@ -0,0 +1,5 @@ +val my: Int = 1 + get() { + field++ + return field + } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt new file mode 100644 index 00000000000..4d7f9aba66a --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/FieldReassignment.txt @@ -0,0 +1,3 @@ +package + +public val my: kotlin.Int = 1 diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 21c27cef42c..cf34c914f3f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1362,6 +1362,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("FieldReassignment.kt") + public void testFieldReassignment() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldReassignment.kt"); + doTest(fileName); + } + @TestMetadata("FieldShadow.kt") public void testFieldShadow() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldShadow.kt");