"field" reassignment: fix and test

This commit is contained in:
Mikhail Glukhikh
2015-09-16 12:05:44 +03:00
parent 9f640b00d9
commit 9939f96c09
4 changed files with 20 additions and 2 deletions
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.cfg.pseudocodeTraverser.Edges;
import org.jetbrains.kotlin.cfg.pseudocodeTraverser.PseudocodeTraverserPackage; import org.jetbrains.kotlin.cfg.pseudocodeTraverser.PseudocodeTraverserPackage;
import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder; import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory;
import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.diagnostics.Errors;
@@ -400,8 +401,11 @@ public class JetFlowInformationProvider {
@NotNull Collection<VariableDescriptor> varWithValReassignErrorGenerated @NotNull Collection<VariableDescriptor> varWithValReassignErrorGenerated
) { ) {
VariableDescriptor variableDescriptor = ctxt.variableDescriptor; VariableDescriptor variableDescriptor = ctxt.variableDescriptor;
if (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor) { if (variableDescriptor instanceof SyntheticFieldDescriptor
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor; || (JetPsiUtil.isBackingFieldReference(expression) && variableDescriptor instanceof PropertyDescriptor)) {
PropertyDescriptor propertyDescriptor = variableDescriptor instanceof SyntheticFieldDescriptor
? ((SyntheticFieldDescriptor) variableDescriptor).getPropertyDescriptor()
: (PropertyDescriptor) variableDescriptor;
JetPropertyAccessor accessor = PsiTreeUtil.getParentOfType(expression, JetPropertyAccessor.class); JetPropertyAccessor accessor = PsiTreeUtil.getParentOfType(expression, JetPropertyAccessor.class);
if (accessor != null) { if (accessor != null) {
DeclarationDescriptor accessorDescriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, accessor); DeclarationDescriptor accessorDescriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, accessor);
@@ -0,0 +1,5 @@
val my: Int = 1
get() {
field++
return field
}
@@ -0,0 +1,3 @@
package
public val my: kotlin.Int = 1
@@ -1362,6 +1362,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName); 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") @TestMetadata("FieldShadow.kt")
public void testFieldShadow() throws Exception { public void testFieldShadow() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldShadow.kt"); String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/backingField/FieldShadow.kt");