From a00ad38a1c7aeb50645f5634d8fd7b2265d8ab39 Mon Sep 17 00:00:00 2001 From: svtk Date: Mon, 21 Nov 2011 14:35:08 +0400 Subject: [PATCH] KT-510 `this.` allows initialization without backing field --- .../lang/cfg/JetFlowInformationProvider.java | 18 +++++++++++++----- .../quick/regressions/kt510.jet | 18 ++++++++++++++++++ .../quickfix/ChangeToBackingFieldFix.java | 10 +++++++++- .../changeToBackingField/afterKt510.kt | 7 +++++++ .../changeToBackingField/beforeKt510.kt | 7 +++++++ 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/checkerWithErrorTypes/quick/regressions/kt510.jet create mode 100644 idea/testData/quickfix/variables/changeToBackingField/afterKt510.kt create mode 100644 idea/testData/quickfix/variables/changeToBackingField/beforeKt510.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index 0220fe6114e..7ae9259d232 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -285,11 +285,19 @@ public class JetFlowInformationProvider { varWithValReassignErrorGenerated.add(variableDescriptor); trace.report(Errors.VAL_REASSIGNMENT.on(expression, variableDescriptor, property == null ? new JetProperty[0] : new JetProperty[] { property })); } - if (expression instanceof JetSimpleNameExpression && inAnonymousInitializers && - variableDescriptor instanceof PropertyDescriptor && !enterInitializationPoints.isInitialized() && exitInitializationPoints.isInitialized()) { - JetSimpleNameExpression simpleNameExpression = (JetSimpleNameExpression) expression; - if (simpleNameExpression.getReferencedNameElementType() != JetTokens.FIELD_IDENTIFIER) { - trace.report(Errors.INITIALIZATION_USING_BACKING_FIELD.on(simpleNameExpression, variableDescriptor)); + if (inAnonymousInitializers && variableDescriptor instanceof PropertyDescriptor && !enterInitializationPoints.isInitialized() && + exitInitializationPoints.isInitialized()) { + JetExpression variable = expression; + if (expression instanceof JetDotQualifiedExpression) { + if (((JetDotQualifiedExpression) expression).getReceiverExpression() instanceof JetThisExpression) { + variable = ((JetDotQualifiedExpression) expression).getSelectorExpression(); + } + } + if (variable instanceof JetSimpleNameExpression) { + JetSimpleNameExpression simpleNameExpression = (JetSimpleNameExpression) variable; + if (simpleNameExpression.getReferencedNameElementType() != JetTokens.FIELD_IDENTIFIER) { + trace.report(Errors.INITIALIZATION_USING_BACKING_FIELD.on(simpleNameExpression, expression, variableDescriptor)); + } } } } diff --git a/compiler/testData/checkerWithErrorTypes/quick/regressions/kt510.jet b/compiler/testData/checkerWithErrorTypes/quick/regressions/kt510.jet new file mode 100644 index 00000000000..050c84f2cf4 --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/quick/regressions/kt510.jet @@ -0,0 +1,18 @@ +//KT-510 `this.` allows initialization without backing field + +namespace kt510 + +public open class Identifier1() { + var field : Boolean + { + field = false; // error + } +} + + +public open class Identifier2() { + var field : Boolean + { + this.field = false; + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToBackingFieldFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToBackingFieldFix.java index 576661df8e1..b6d43fa5863 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToBackingFieldFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeToBackingFieldFix.java @@ -6,9 +6,12 @@ import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; +import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression; import org.jetbrains.jet.lang.psi.JetPsiFactory; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; +import org.jetbrains.jet.lang.psi.JetThisExpression; import org.jetbrains.jet.plugin.JetBundle; +import org.jetbrains.jet.plugin.references.JetThisReference; /** * @author svtk @@ -33,7 +36,12 @@ public class ChangeToBackingFieldFix extends JetIntentionAction createFactory() { diff --git a/idea/testData/quickfix/variables/changeToBackingField/afterKt510.kt b/idea/testData/quickfix/variables/changeToBackingField/afterKt510.kt new file mode 100644 index 00000000000..c48a4e73754 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToBackingField/afterKt510.kt @@ -0,0 +1,7 @@ +// "Change reference to backing field" "true" +public open class Identifier() { + var field : Boolean + { + $field = false; + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToBackingField/beforeKt510.kt b/idea/testData/quickfix/variables/changeToBackingField/beforeKt510.kt new file mode 100644 index 00000000000..46ccdd440a6 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToBackingField/beforeKt510.kt @@ -0,0 +1,7 @@ +// "Change reference to backing field" "true" +public open class Identifier() { + var field : Boolean + { + this.field = false; + } +} \ No newline at end of file