ExtractSideEffectsFix -> DeleteSideEffectsAwareFix; i18n

Now intention availability logic is moved from HighlightUtil to DeleteSideEffectsAwareFix
Review: IDEA-CR-21623
This commit is contained in:
Tagir Valeev
2017-06-08 12:15:20 +07:00
parent 4596de53f6
commit fb6965b6b9
16 changed files with 60 additions and 35 deletions
@@ -261,6 +261,9 @@ public abstract class QuickFixFactory {
@NotNull public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@NotNull PsiElement element);
@NotNull public abstract LocalQuickFixAndIntentionActionOnPsiElement createDeleteFix(@NotNull PsiElement element, @NotNull @Nls String text);
@NotNull
public abstract IntentionAction createDeleteSideEffectAwareFix(@NotNull PsiExpressionStatement statement);
@NotNull
public abstract IntentionAction createSafeDeleteFix(@NotNull PsiElement element);
@@ -300,8 +303,4 @@ public abstract class QuickFixFactory {
@NotNull
public abstract IntentionAction createWrapStringWithFileFix(@Nullable PsiType type, @NotNull PsiExpression expression);
@NotNull
public abstract IntentionAction createExtractSideEffectsFix(@NotNull PsiExpressionStatement statement,
@NotNull List<PsiExpression> sideEffects);
}
@@ -69,7 +69,6 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.hash.HashSet;
import com.intellij.util.ui.UIUtil;
import com.intellij.xml.util.XmlStringUtil;
import com.siyeh.ig.psiutils.SideEffectChecker;
import gnu.trove.THashMap;
import org.intellij.lang.annotations.Language;
import org.jetbrains.annotations.*;
@@ -1421,19 +1420,8 @@ public class HighlightUtil extends HighlightUtilBase {
HighlightInfo error =
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(description).create();
if (statement instanceof PsiExpressionStatement) {
PsiExpressionStatement expressionStatement = (PsiExpressionStatement)statement;
PsiExpression expression = expressionStatement.getExpression();
List<PsiExpression> sideEffects = SideEffectChecker.extractSideEffectExpressions(expression);
if (sideEffects.isEmpty()) {
QuickFixAction.registerQuickFixAction(error, QuickFixFactory.getInstance().createDeleteFix(statement));
}
else {
// "Remove unnecessary parentheses" action is already present which will do the same
if(sideEffects.size() != 1 || sideEffects.get(0) != PsiUtil.skipParenthesizedExprDown(expression)) {
QuickFixAction
.registerQuickFixAction(error, QuickFixFactory.getInstance().createExtractSideEffectsFix(expressionStatement, sideEffects));
}
}
QuickFixAction
.registerQuickFixAction(error, QuickFixFactory.getInstance().createDeleteSideEffectAwareFix((PsiExpressionStatement)statement));
}
return error;
}
@@ -696,7 +696,7 @@ public class EmptyQuickFixFactory extends QuickFixFactory {
@NotNull
@Override
public IntentionAction createExtractSideEffectsFix(@NotNull PsiExpressionStatement statement, @NotNull List<PsiExpression> sideEffects) {
public IntentionAction createDeleteSideEffectAwareFix(@NotNull PsiExpressionStatement statement) {
return QuickFixes.EMPTY_FIX;
}
}
@@ -15,11 +15,13 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.intention.LowPriorityAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.SideEffectChecker;
@@ -29,22 +31,34 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
public class ExtractSideEffectsFix implements IntentionAction, LowPriorityAction {
public class DeleteSideEffectsAwareFix implements IntentionAction, LowPriorityAction {
private final SmartPsiElementPointer<PsiExpressionStatement> myPointer;
private final String myMessage;
public ExtractSideEffectsFix(PsiExpressionStatement statement, List<PsiExpression> effects) {
public DeleteSideEffectsAwareFix(PsiExpressionStatement statement) {
myPointer = SmartPointerManager.getInstance(statement.getProject()).createSmartPsiElementPointer(statement);
PsiExpression expression = statement.getExpression();
PsiStatement[] statements = StatementExtractor.generateStatements(effects, expression);
if (statements.length == 1) {
if(statements[0] instanceof PsiIfStatement) {
myMessage = "Convert to 'if' statement";
} else {
myMessage = "Extract side effect";
List<PsiExpression> sideEffects = SideEffectChecker.extractSideEffectExpressions(expression);
if (sideEffects.isEmpty()) {
myMessage = QuickFixBundle.message("delete.element.fix.text");
}
else if (sideEffects.size() == 1 && sideEffects.get(0) == PsiUtil.skipParenthesizedExprDown(expression)) {
// "Remove unnecessary parentheses" action is already present which will do the same
myMessage = "";
}
else {
PsiStatement[] statements = StatementExtractor.generateStatements(sideEffects, expression);
if (statements.length == 1) {
if (statements[0] instanceof PsiIfStatement) {
myMessage = QuickFixBundle.message("extract.side.effects.convert.to.if");
}
else {
myMessage = QuickFixBundle.message("extract.side.effects.single");
}
}
else {
myMessage = QuickFixBundle.message("extract.side.effects.multiple");
}
} else {
myMessage = "Extract side effects";
}
}
@@ -59,12 +73,12 @@ public class ExtractSideEffectsFix implements IntentionAction, LowPriorityAction
@NotNull
@Override
public String getFamilyName() {
return "Extract side effects";
return QuickFixBundle.message("extract.side.effects.family.name");
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return true;
return !myMessage.isEmpty();
}
@Override
@@ -879,7 +879,7 @@ public class QuickFixFactoryImpl extends QuickFixFactory {
@NotNull
@Override
public IntentionAction createExtractSideEffectsFix(@NotNull PsiExpressionStatement statement, @NotNull List<PsiExpression> sideEffects) {
return new ExtractSideEffectsFix(statement, sideEffects);
public IntentionAction createDeleteSideEffectAwareFix(@NotNull PsiExpressionStatement statement) {
return new DeleteSideEffectsAwareFix(statement);
}
}
@@ -0,0 +1,5 @@
// "Delete element" "true"
public class Main {
public void test() {
}
}
@@ -0,0 +1,6 @@
// "Delete element" "true"
public class Main {
public void test() {
2 <caret>+ 2;
}
}
@@ -0,0 +1,8 @@
// "Extract side effect" "false"
import java.io.File;
public class Main {
public void test(File f) {
(f.mkd<caret>irs());
}
}
@@ -17,11 +17,11 @@ package com.intellij.java.codeInsight.daemon.quickFix;
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
public class ExtractSideEffectsTest extends LightQuickFixParameterizedTestCase {
public class DeleteSideEffectsAwareTest extends LightQuickFixParameterizedTestCase {
public void test() throws Exception { doAllTests(); }
@Override
protected String getBasePath() {
return "/codeInsight/daemonCodeAnalyzer/quickFix/extractSideEffects";
return "/codeInsight/daemonCodeAnalyzer/quickFix/deleteSideEffectsAware";
}
}
@@ -299,6 +299,11 @@ delete.element.fix.text=Delete element
delete.reference.fix.text=Delete reference
delete.unreachable.statement.fix.text=Delete unreachable statement
extract.side.effects.convert.to.if=Convert to 'if' statement
extract.side.effects.single=Extract side effect
extract.side.effects.multiple=Extract side effects
extract.side.effects.family.name=Delete statement extracting side effects
module.info.add.requires.family.name=Add 'requires' statement to module-info.java
module.info.add.requires.name=Add ''requires {0}'' statement to module-info.java