KT-510 this. allows initialization without backing field

This commit is contained in:
svtk
2011-11-21 14:35:08 +04:00
parent 3915d24660
commit a00ad38a1c
5 changed files with 54 additions and 6 deletions
@@ -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));
}
}
}
}
@@ -0,0 +1,18 @@
//KT-510 `this.` allows initialization without backing field
namespace kt510
public open class Identifier1() {
var field : Boolean
{
<!INITIALIZATION_USING_BACKING_FIELD!>field<!> = false; // error
}
}
public open class Identifier2() {
var field : Boolean
{
<!INITIALIZATION_USING_BACKING_FIELD!>this.field<!> = false;
}
}
@@ -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<JetSimpleNameExp
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
JetSimpleNameExpression backingField = (JetSimpleNameExpression) JetPsiFactory.createExpression(project, "$" + element.getText());
element.replace(backingField);
if (element.getParent() instanceof JetDotQualifiedExpression && ((JetDotQualifiedExpression) element.getParent()).getReceiverExpression() instanceof JetThisExpression) {
element.getParent().replace(backingField);
}
else {
element.replace(backingField);
}
}
public static JetIntentionActionFactory<JetSimpleNameExpression> createFactory() {
@@ -0,0 +1,7 @@
// "Change reference to backing field" "true"
public open class Identifier() {
var field : Boolean
{
<caret>$field = false;
}
}
@@ -0,0 +1,7 @@
// "Change reference to backing field" "true"
public open class Identifier() {
var field : Boolean
{
<caret>this.field = false;
}
}