WrapLongWithMathToIntExact intention checks availability inside of intention (based on IDEA-CR-6351)

This commit is contained in:
Dmitry Batkovich
2015-10-29 18:18:55 +03:00
parent 4c1a68a3fb
commit fc02e0b826
5 changed files with 27 additions and 14 deletions
@@ -267,5 +267,5 @@ public abstract class QuickFixFactory {
public abstract IntentionAction addMethodQualifierFix(@NotNull PsiMethodCallExpression methodCall);
@NotNull
public abstract IntentionAction createWrapLongWithMathToIntExactFix(@NotNull PsiExpression expression);
public abstract IntentionAction createWrapLongWithMathToIntExactFix(@Nullable PsiType type, @NotNull PsiExpression expression);
}
@@ -564,9 +564,7 @@ public class HighlightUtil extends HighlightUtilBase {
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createAddTypeCastFix(lType, expression));
}
if (expression != null) {
if (PsiType.INT.equals(lType) && rType != null && (PsiType.LONG.equals(rType) || PsiType.LONG.getBoxedTypeName().equals(rType.getCanonicalText(false)))) {
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createWrapLongWithMathToIntExactFix(expression));
}
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createWrapLongWithMathToIntExactFix(lType, expression));
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createWrapExpressionFix(lType, expression));
AddTypeArgumentsConditionalFix.register(highlightInfo, expression, lType);
}
@@ -1418,9 +1416,7 @@ public class HighlightUtil extends HighlightUtilBase {
QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createConvertSwitchToIfIntention(statement));
if (PsiType.LONG.equals(type) || PsiType.FLOAT.equals(type) || PsiType.DOUBLE.equals(type)) {
QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createAddTypeCastFix(PsiType.INT, expression));
if (PsiType.LONG.equals(type)) {
QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createWrapLongWithMathToIntExactFix(expression));
}
QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createWrapLongWithMathToIntExactFix(PsiType.INT, expression));
}
if (requiredLevel != null) {
QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createIncreaseLanguageLevelFix(requiredLevel));
@@ -16,12 +16,16 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil;
import com.intellij.codeInsight.intention.HighPriorityAction;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.Nls;
@@ -36,8 +40,11 @@ public class WrapLongWithMathToIntExactFix extends LocalQuickFixAndIntentionActi
public final static MyMethodArgumentFixerFactory REGISTAR = new MyMethodArgumentFixerFactory();
public WrapLongWithMathToIntExactFix(final @NotNull PsiExpression expression) {
private final PsiType myType;
public WrapLongWithMathToIntExactFix(final PsiType type, final @NotNull PsiExpression expression) {
super(expression);
myType = type;
}
@NotNull
@@ -60,7 +67,17 @@ public class WrapLongWithMathToIntExactFix extends LocalQuickFixAndIntentionActi
@NotNull PsiFile file,
@NotNull PsiElement startElement,
@NotNull PsiElement endElement) {
return startElement.isValid() && startElement.getManager().isInProject(startElement) && PsiUtil.isLanguageLevel8OrHigher(startElement);
return startElement.isValid() &&
startElement.getManager().isInProject(startElement) &&
PsiUtil.isLanguageLevel8OrHigher(startElement) &&
areSameTypes(myType, PsiType.INT) &&
areSameTypes(((PsiExpression) startElement).getType(), PsiType.LONG);
}
private static boolean areSameTypes(@Nullable PsiType type, @NotNull PsiPrimitiveType expected) {
return !(type == null ||
!type.isValid() ||
(!type.equals(expected) && !expected.getBoxedTypeName().equals(type.getCanonicalText(false))));
}
@Nls
@@ -106,8 +123,8 @@ public class WrapLongWithMathToIntExactFix extends LocalQuickFixAndIntentionActi
}
@Override
public boolean areTypesConvertible(final PsiType exprType, final PsiType parameterType, final PsiElement context) {
return parameterType.isConvertibleFrom(exprType) || (PsiType.INT.equals(parameterType) && PsiType.LONG.equals(exprType));
public boolean areTypesConvertible(final PsiType exprType, final PsiType parameterType, @NotNull final PsiElement context) {
return parameterType.isConvertibleFrom(exprType) || (areSameTypes(parameterType, PsiType.INT) && areSameTypes(exprType, PsiType.LONG));
}
@Override
@@ -611,7 +611,7 @@ public class EmptyQuickFixFactory extends QuickFixFactory {
@NotNull
@Override
public IntentionAction createWrapLongWithMathToIntExactFix(@NotNull PsiExpression expression) {
public IntentionAction createWrapLongWithMathToIntExactFix(@Nullable PsiType type, @NotNull PsiExpression expression) {
return QuickFixes.EMPTY_FIX;
}
}
@@ -770,8 +770,8 @@ public class QuickFixFactoryImpl extends QuickFixFactory {
@NotNull
@Override
public IntentionAction createWrapLongWithMathToIntExactFix(@NotNull PsiExpression expression) {
return new WrapLongWithMathToIntExactFix(expression);
public IntentionAction createWrapLongWithMathToIntExactFix(@Nullable PsiType type, @NotNull PsiExpression expression) {
return new WrapLongWithMathToIntExactFix(type, expression);
}
private static boolean timeToOptimizeImports(@NotNull PsiFile file) {