Registered 'change variable mutability' fix for 'val reassignment' error

This commit is contained in:
svtk
2011-11-03 18:30:28 +04:00
parent 92a3fef06b
commit 2eb7835ae1
9 changed files with 71 additions and 1 deletions
@@ -143,7 +143,18 @@ public interface Errors {
PsiElementOnlyDiagnosticFactory3<JetModifierListOwner, CallableMemberDescriptor, CallableMemberDescriptor, DeclarationDescriptor> VIRTUAL_MEMBER_HIDDEN = PsiElementOnlyDiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT);
PsiElementOnlyDiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> UNINITIALIZED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Variable ''{0}'' must be initialized", NAME);
PsiElementOnlyDiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> VAL_REASSIGNMENT = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Val can not be reassigned", NAME);
PsiElementOnlyDiagnosticFactory2<JetSimpleNameExpression, DeclarationDescriptor, JetProperty[]> VAL_REASSIGNMENT = new PsiElementOnlyDiagnosticFactory2<JetSimpleNameExpression, DeclarationDescriptor, JetProperty[]>(ERROR, "Val can not be reassigned", NAME) {
@NotNull
@Override
public DiagnosticWithPsiElement<JetSimpleNameExpression> on(@NotNull JetSimpleNameExpression elementToBlame, @NotNull ASTNode nodeToMark, @NotNull DeclarationDescriptor declarationDescriptor, @NotNull JetProperty[] property) {
DiagnosticWithPsiElement<JetSimpleNameExpression> diagnostic = super.on(elementToBlame, nodeToMark, declarationDescriptor, property);
if (property.length == 1) {
return diagnostic.add(DiagnosticParameters.PROPERTY, property[0]);
}
return diagnostic;
}
};
PsiElementOnlyDiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> INITIALIZATION_USING_BACKING_FIELD = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Initialization using backing field required", NAME);
PsiElementOnlyDiagnosticFactory1<JetSimpleNameExpression, DeclarationDescriptor> FUNCTION_PARAMETERS_OF_INLINE_FUNCTION = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Function parameters of inline function can only be invoked", NAME);
@@ -7,9 +7,14 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters;
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters;
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.plugin.JetBundle;
@@ -55,6 +60,7 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction<JetProperty>
public static JetIntentionActionFactory<JetProperty> createFactory() {
return new JetIntentionActionFactory<JetProperty>() {
@Nullable
@Override
public JetIntentionAction<JetProperty> createAction(DiagnosticWithPsiElement diagnostic) {
assert diagnostic.getPsiElement() instanceof JetProperty;
@@ -62,4 +68,18 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction<JetProperty>
}
};
}
public static JetIntentionActionFactory<JetElement> createFromSimpleNameFactory() {
return new JetIntentionActionFactory<JetElement>() {
@Override
public JetIntentionAction<JetElement> createAction(DiagnosticWithPsiElement diagnostic) {
DiagnosticWithParameters<PsiElement> diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.PROPERTY);
JetProperty property = diagnosticWithParameters.getParameter(DiagnosticParameters.PROPERTY);
if (diagnostic.getPsiElement().getContainingFile() == property.getContainingFile()) {
return (JetIntentionAction) new ChangeVariableMutabilityFix(property);
}
return null;
}
};
}
}
@@ -71,6 +71,7 @@ public class QuickFixes {
add(Errors.VIRTUAL_MEMBER_HIDDEN, AddModifierFix.createFactory(JetTokens.OVERRIDE_KEYWORD, new JetToken[] {JetTokens.OPEN_KEYWORD}));
add(Errors.VAL_WITH_SETTER, ChangeVariableMutabilityFix.createFactory());
add(Errors.VAL_REASSIGNMENT, ChangeVariableMutabilityFix.createFromSimpleNameFactory());
add(Errors.USELESS_CAST_STATIC_ASSERT_IS_FINE, ReplaceOperationInBinaryExpressionFix.createChangeCastToStaticAssertFactory());
add(Errors.USELESS_CAST, RemoveRightPartOfBinaryExpressionFix.createRemoveCastFactory());
@@ -0,0 +1,5 @@
// "Make variable mutable" "true"
fun foo() {
var a = 1
<caret>a = 3
}
@@ -0,0 +1,6 @@
// "Make variable mutable" "true"
var a = 4
fun bar() {
<caret>a = 5
}
@@ -0,0 +1,8 @@
// "Make variable mutable" "true"
class A() {
var a = 1
fun foo() {
<caret>a = 5
}
}
@@ -0,0 +1,5 @@
// "Make variable mutable" "true"
fun foo() {
val a = 1
<caret>a = 3
}
@@ -0,0 +1,6 @@
// "Make variable mutable" "true"
val a = 4
fun bar() {
<caret>a = 5
}
@@ -0,0 +1,8 @@
// "Make variable mutable" "true"
class A() {
val a = 1
fun foo() {
<caret>a = 5
}
}