'Add primary constructor' quick fix added
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package org.jetbrains.jet.plugin.quickfix;
|
||||
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiElement;
|
||||
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.JetClass;
|
||||
import org.jetbrains.jet.lang.psi.JetPsiFactory;
|
||||
|
||||
/**
|
||||
* @author svtk
|
||||
*/
|
||||
public class AddPrimaryConstructorFix extends JetIntentionAction<JetClass> {
|
||||
|
||||
public AddPrimaryConstructorFix(@NotNull JetClass element) {
|
||||
super(element);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getText() {
|
||||
return "Add primary constructor to " + element.getName();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getFamilyName() {
|
||||
return "Add primary constructor";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
|
||||
JetClass newClass = (JetClass) element.copy();
|
||||
assert !newClass.hasPrimaryConstructor();
|
||||
PsiElement primaryConstructor = JetPsiFactory.createPrimaryConstructor(project);
|
||||
newClass.addAfter(primaryConstructor, newClass.getNameIdentifier());
|
||||
element.replace(newClass);
|
||||
}
|
||||
|
||||
public static JetIntentionActionFactory<JetClass> createFactory() {
|
||||
return new JetIntentionActionFactory<JetClass>() {
|
||||
@Override
|
||||
public JetIntentionAction<JetClass> createAction(DiagnosticWithPsiElement diagnostic) {
|
||||
assert diagnostic.getPsiElement() instanceof JetClass;
|
||||
return new AddPrimaryConstructorFix((JetClass) diagnostic.getPsiElement());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -12,14 +12,14 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElementImpl;
|
||||
public class QuickFixUtil {
|
||||
private QuickFixUtil() {}
|
||||
|
||||
public static <T extends PsiElement> JetIntentionActionFactory<T> createFactoryRedirectingAdditionalInfoToAnotherFactory(final JetIntentionActionFactory<T> factory, final DiagnosticParameter<T> parameter) {
|
||||
return new JetIntentionActionFactory<T>() {
|
||||
public static <T extends PsiElement, P extends T> JetIntentionActionFactory<PsiElement> createFactoryRedirectingAdditionalInfoToAnotherFactory(final JetIntentionActionFactory<T> factory, final DiagnosticParameter<P> parameter) {
|
||||
return new JetIntentionActionFactory<PsiElement>() {
|
||||
@Override
|
||||
public JetIntentionAction<T> createAction(DiagnosticWithPsiElement diagnostic) {
|
||||
public JetIntentionAction<PsiElement> createAction(DiagnosticWithPsiElement diagnostic) {
|
||||
|
||||
DiagnosticWithParameters<PsiElement> diagnosticWithParameters = JetIntentionAction.assertAndCastToDiagnosticWithParameters(diagnostic, parameter);
|
||||
T element = diagnosticWithParameters.getParameter(parameter);
|
||||
return factory.createAction(new DiagnosticWithPsiElementImpl<T>(diagnostic.getFactory(), diagnostic.getSeverity(), diagnostic.getMessage(), element));
|
||||
return (JetIntentionAction<PsiElement>) factory.createAction(new DiagnosticWithPsiElementImpl<T>(diagnostic.getFactory(), diagnostic.getSeverity(), diagnostic.getMessage(), element));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -6,10 +6,7 @@ import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters;
|
||||
import org.jetbrains.jet.lang.diagnostics.Errors;
|
||||
import org.jetbrains.jet.lang.diagnostics.PsiElementOnlyDiagnosticFactory;
|
||||
import org.jetbrains.jet.lang.psi.JetFunctionOrPropertyAccessor;
|
||||
import org.jetbrains.jet.lang.psi.JetModifierListOwner;
|
||||
import org.jetbrains.jet.lang.psi.JetProperty;
|
||||
import org.jetbrains.jet.lang.psi.JetPropertyAccessor;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lexer.JetToken;
|
||||
import org.jetbrains.jet.lexer.JetTokens;
|
||||
|
||||
@@ -53,7 +50,7 @@ public class QuickFixes {
|
||||
add(Errors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT, addAbstractModifierFactory);
|
||||
add(Errors.REDUNDANT_ABSTRACT, removeAbstractModifierFactory);
|
||||
|
||||
JetIntentionActionFactory<JetModifierListOwner> addAbstractToClassFactory = QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addAbstractModifierFactory, DiagnosticParameters.CLASS);
|
||||
JetIntentionActionFactory<PsiElement> addAbstractToClassFactory = QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addAbstractModifierFactory, DiagnosticParameters.CLASS);
|
||||
add(Errors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, removeAbstractModifierFactory);
|
||||
add(Errors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, addAbstractToClassFactory);
|
||||
|
||||
@@ -89,6 +86,12 @@ public class QuickFixes {
|
||||
add(Errors.UNNECESSARY_SAFE_CALL, ReplaceSafeCallToDotCall.createFactory());
|
||||
|
||||
add(Errors.REDUNDANT_MODIFIER, RemoveRedundantModifierFix.createFactory());
|
||||
|
||||
add(Errors.PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR, RemovePartsFromPropertyFix.createRemoveInitializerFactory());
|
||||
|
||||
JetIntentionActionFactory<JetClass> addPrimaryConstructorFactory = AddPrimaryConstructorFix.createFactory();
|
||||
add(Errors.PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR, QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addPrimaryConstructorFactory, DiagnosticParameters.CLASS));
|
||||
add(Errors.PRIMARY_CONSTRUCTOR_MISSING_STATEFUL_PROPERTY, addPrimaryConstructorFactory);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,10 +2,12 @@ package org.jetbrains.jet.plugin.quickfix;
|
||||
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
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;
|
||||
@@ -17,34 +19,46 @@ import org.jetbrains.jet.lang.types.JetType;
|
||||
*/
|
||||
public class RemovePartsFromPropertyFix extends JetIntentionAction<JetProperty> {
|
||||
private final JetType type;
|
||||
private final String partsToRemove;
|
||||
private final boolean removeInitializer;
|
||||
private final boolean removeGetter;
|
||||
private final boolean removeSetter;
|
||||
|
||||
private RemovePartsFromPropertyFix(@NotNull JetProperty element, JetType type) {
|
||||
private RemovePartsFromPropertyFix(@NotNull JetProperty element, @Nullable JetType type, boolean removeInitializer, boolean removeGetter, boolean removeSetter) {
|
||||
super(element);
|
||||
this.type = type;
|
||||
partsToRemove = partsToRemove(element.getGetter() != null && element.getGetter().getBodyExpression() != null,
|
||||
element.getSetter() != null && element.getSetter().getBodyExpression() != null,
|
||||
element.getInitializer() != null);
|
||||
this.removeInitializer = removeInitializer;
|
||||
this.removeGetter = removeGetter;
|
||||
this.removeSetter = removeSetter;
|
||||
}
|
||||
|
||||
private RemovePartsFromPropertyFix(@NotNull JetProperty element, @Nullable JetType type) {
|
||||
this(element, type, element.getInitializer() != null,
|
||||
element.getGetter() != null && element.getGetter().getBodyExpression() != null,
|
||||
element.getSetter() != null && element.getSetter().getBodyExpression() != null);
|
||||
}
|
||||
|
||||
private static String partsToRemove(boolean hasGetter, boolean hasSetter, boolean hasInitializer) {
|
||||
private RemovePartsFromPropertyFix(@NotNull JetProperty element, boolean removeInitializer, boolean removeGetter, boolean removeSetter) {
|
||||
this(element, null, removeInitializer, removeGetter, removeSetter);
|
||||
}
|
||||
|
||||
private static String partsToRemove(boolean getter, boolean setter, boolean initializer) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (hasGetter) {
|
||||
if (getter) {
|
||||
sb.append("getter");
|
||||
if (hasSetter && hasInitializer) {
|
||||
if (setter && initializer) {
|
||||
sb.append(", ");
|
||||
}
|
||||
else if (hasSetter || hasInitializer) {
|
||||
else if (setter || initializer) {
|
||||
sb.append(" and ");
|
||||
}
|
||||
}
|
||||
if (hasSetter) {
|
||||
if (setter) {
|
||||
sb.append("setter");
|
||||
if (hasInitializer) {
|
||||
if (initializer) {
|
||||
sb.append(" and ");
|
||||
}
|
||||
}
|
||||
if (hasInitializer) {
|
||||
if (initializer) {
|
||||
sb.append("initializer");
|
||||
}
|
||||
return sb.toString();
|
||||
@@ -53,7 +67,7 @@ public class RemovePartsFromPropertyFix extends JetIntentionAction<JetProperty>
|
||||
@NotNull
|
||||
@Override
|
||||
public String getText() {
|
||||
return "Remove " + partsToRemove + " from property";
|
||||
return "Remove " + partsToRemove(removeGetter, removeSetter, removeInitializer) + " from property";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -71,23 +85,23 @@ public class RemovePartsFromPropertyFix extends JetIntentionAction<JetProperty>
|
||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
|
||||
JetProperty newElement = (JetProperty) element.copy();
|
||||
JetPropertyAccessor getter = newElement.getGetter();
|
||||
if (getter != null) {
|
||||
if (removeGetter && getter != null) {
|
||||
newElement.deleteChildInternal(getter.getNode());
|
||||
}
|
||||
JetPropertyAccessor setter = newElement.getSetter();
|
||||
if (setter != null) {
|
||||
if (removeSetter && setter != null) {
|
||||
newElement.deleteChildInternal(setter.getNode());
|
||||
}
|
||||
JetExpression initializer = newElement.getInitializer();
|
||||
boolean needImport = false;
|
||||
if (initializer != null) {
|
||||
if (removeInitializer && initializer != null) {
|
||||
PsiElement nameIdentifier = newElement.getNameIdentifier();
|
||||
assert nameIdentifier != null;
|
||||
PsiElement nextSibling = nameIdentifier.getNextSibling();
|
||||
assert nextSibling != null;
|
||||
newElement.deleteChildRange(nextSibling, initializer);
|
||||
|
||||
if (newElement.getPropertyTypeRef() == null) {
|
||||
if (newElement.getPropertyTypeRef() == null && type != null) {
|
||||
newElement = addPropertyType(project, newElement, type);
|
||||
needImport = true;
|
||||
}
|
||||
@@ -102,13 +116,11 @@ public class RemovePartsFromPropertyFix extends JetIntentionAction<JetProperty>
|
||||
public static JetProperty addPropertyType(Project project, JetProperty property, JetType type) {
|
||||
JetProperty newProperty = (JetProperty) property.copy();
|
||||
JetTypeReference typeReference = JetPsiFactory.createType(project, type.toString());
|
||||
PsiElement[] colon = JetPsiFactory.createColon(project);
|
||||
Pair<PsiElement, PsiElement> colon = JetPsiFactory.createColon(project);
|
||||
PsiElement nameIdentifier = newProperty.getNameIdentifier();
|
||||
assert nameIdentifier != null;
|
||||
newProperty.addAfter(typeReference, nameIdentifier);
|
||||
for (int i = colon.length - 1; i >= 0; i--) {
|
||||
newProperty.addAfter(colon[i], nameIdentifier);
|
||||
}
|
||||
newProperty.addRangeAfter(colon.getFirst(), colon.getSecond(), nameIdentifier);
|
||||
return newProperty;
|
||||
}
|
||||
|
||||
@@ -123,4 +135,14 @@ public class RemovePartsFromPropertyFix extends JetIntentionAction<JetProperty>
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static JetIntentionActionFactory<JetProperty> createRemoveInitializerFactory() {
|
||||
return new JetIntentionActionFactory<JetProperty>() {
|
||||
@Override
|
||||
public JetIntentionAction<JetProperty> createAction(DiagnosticWithPsiElement diagnostic) {
|
||||
assert diagnostic.getPsiElement() instanceof JetProperty;
|
||||
return new RemovePartsFromPropertyFix((JetProperty) diagnostic.getPsiElement(), true, false, false);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
// "Add primary constructor to A" "true"
|
||||
namespace a
|
||||
|
||||
class A() {
|
||||
var i : Int = <caret>1
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// "Add primary constructor to A" "true"
|
||||
namespace a
|
||||
|
||||
class A<caret>() {
|
||||
var i : Int = 1
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// "Add primary constructor to A" "true"
|
||||
namespace a
|
||||
|
||||
class A {
|
||||
var i : Int = <caret>1
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// "Add primary constructor to A" "true"
|
||||
namespace a
|
||||
|
||||
class A<caret> {
|
||||
var i : Int = 1
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package org.jetbrains.jet.plugin.quickfix;
|
||||
|
||||
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase;
|
||||
import org.jetbrains.jet.JetTestCaseBase;
|
||||
|
||||
/**
|
||||
* @author svtk
|
||||
*/
|
||||
public class AddPrimaryConstructorTest extends LightQuickFixTestCase {
|
||||
|
||||
public void test() throws Exception {
|
||||
doAllTests();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getBasePath() {
|
||||
return "/quickfix/addPrimaryConstructor";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTestDataPath() {
|
||||
return JetTestCaseBase.getTestDataPathBase();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user