From 92a5282ab92e3377ab3334d94319d4c5a07e2c4d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 29 Jun 2022 18:35:54 +0200 Subject: [PATCH] [java-intentions] ConvertDoubleToFloatFix removed; superseded with CastMethodArgumentFix GitOrigin-RevId: 861631447c4281fd75f77545702e8540ed4ed38b --- .../impl/analysis/HighlightMethodUtil.java | 2 - .../quickfix/ConvertDoubleToFloatFix.java | 113 ------------------ .../com/intellij/psi/util/PsiLiteralUtil.java | 13 +- .../quickFix/convertDoubleToFloat/after1.java | 4 +- .../quickFix/convertDoubleToFloat/after2.java | 4 +- .../quickFix/convertDoubleToFloat/after3.java | 4 +- .../quickFix/convertDoubleToFloat/after4.java | 4 +- .../quickFix/convertDoubleToFloat/after5.java | 4 +- .../quickFix/convertDoubleToFloat/after6.java | 4 +- .../quickFix/convertDoubleToFloat/after7.java | 7 ++ .../convertDoubleToFloat/before1.java | 2 +- .../convertDoubleToFloat/before2.java | 2 +- .../convertDoubleToFloat/before3.java | 2 +- .../convertDoubleToFloat/before4.java | 2 +- .../convertDoubleToFloat/before5.java | 2 +- .../convertDoubleToFloat/before6.java | 2 +- .../convertDoubleToFloat/before7.java | 2 +- 17 files changed, 34 insertions(+), 139 deletions(-) delete mode 100644 java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertDoubleToFloatFix.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after7.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 71ab49cc4d46..008df4b035e1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -960,7 +960,6 @@ public final class HighlightMethodUtil { QuickFixAction.registerQuickFixAction(highlightInfo, fixRange, QUICK_FIX_FACTORY.createSurroundWithArrayFix(methodCall, null)); CastMethodArgumentFix.REGISTRAR.registerCastActions(methodCandidates, methodCall, highlightInfo, fixRange); - ConvertDoubleToFloatFix.registerIntentions(methodCandidates, list, highlightInfo, fixRange); AddTypeArgumentsFix.REGISTRAR.registerCastActions(methodCandidates, methodCall, highlightInfo, fixRange); CandidateInfo[] candidates = resolveHelper.getReferencedMethodCandidates(methodCall, true); @@ -1881,7 +1880,6 @@ public final class HighlightMethodUtil { if (classReference != null) { ConstructorParametersFixer.registerFixActions(classReference, constructorCall, info, fixRange); ChangeTypeArgumentsFix.registerIntentions(results, list, info, aClass, fixRange); - ConvertDoubleToFloatFix.registerIntentions(results, list, info, fixRange); } ChangeStringLiteralToCharInMethodCallFix.registerFixes(constructors, constructorCall, info, fixRange); QuickFixAction.registerQuickFixAction(info, fixRange, QUICK_FIX_FACTORY.createSurroundWithArrayFix(constructorCall, null)); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertDoubleToFloatFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertDoubleToFloatFix.java deleted file mode 100644 index b07a79ced3b9..000000000000 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ConvertDoubleToFloatFix.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.codeInsight.daemon.impl.quickfix; - -import com.intellij.codeInsight.daemon.impl.HighlightInfo; -import com.intellij.codeInsight.intention.IntentionAction; -import com.intellij.codeInsight.intention.impl.BaseIntentionAction; -import com.intellij.java.analysis.JavaAnalysisBundle; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; -import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class ConvertDoubleToFloatFix implements IntentionAction { - private final PsiExpression myExpression; - - public ConvertDoubleToFloatFix(PsiExpression expression) { - myExpression = expression; - } - - @NotNull - @Override - public String getText() { - return JavaAnalysisBundle.message("convert.0.to.float", myExpression.getText()); - } - - @NotNull - @Override - public String getFamilyName() { - return getText(); - } - - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { - if (myExpression.isValid()) { - if (!StringUtil.endsWithIgnoreCase(myExpression.getText(), "f")) { - final PsiLiteralExpression expression = (PsiLiteralExpression)createFloatingPointExpression(project); - final Object value = expression.getValue(); - return value instanceof Float && !((Float)value).isInfinite() && !(((Float)value).floatValue() == 0 && !TypeConversionUtil.isFPZero(expression.getText())); - } - } - return false; - } - - @Override - public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { - myExpression.replace(createFloatingPointExpression(project)); - } - - private PsiExpression createFloatingPointExpression(Project project) { - final String text = myExpression.getText(); - if (StringUtil.endsWithIgnoreCase(text, "d")) { - return JavaPsiFacade.getElementFactory(project).createExpressionFromText(text.substring(0, text.length() - 1) + "f", myExpression); - } else { - return JavaPsiFacade.getElementFactory(project).createExpressionFromText(text + "f", myExpression); - } - } - - @Override - public boolean startInWriteAction() { - return true; - } - - public static void registerIntentions(JavaResolveResult @NotNull [] candidates, - @NotNull PsiExpressionList list, - @Nullable HighlightInfo highlightInfo, - TextRange fixRange) { - if (candidates.length == 0) return; - PsiExpression[] expressions = list.getExpressions(); - for (JavaResolveResult candidate : candidates) { - registerIntention(expressions, highlightInfo, fixRange, candidate, list); - } - } - - private static void registerIntention(PsiExpression @NotNull [] expressions, - @Nullable HighlightInfo highlightInfo, - TextRange fixRange, - @NotNull JavaResolveResult candidate, - @NotNull PsiElement context) { - if (!candidate.isStaticsScopeCorrect()) return; - PsiMethod method = (PsiMethod)candidate.getElement(); - if (method != null && BaseIntentionAction.canModify(method)) { - final PsiParameter[] parameters = method.getParameterList().getParameters(); - if (parameters.length == expressions.length) { - for (int i = 0, length = parameters.length; i < length; i++) { - PsiParameter parameter = parameters[i]; - final PsiExpression expression = expressions[i]; - if (expression instanceof PsiLiteralExpression && PsiType.FLOAT.equals(parameter.getType()) && PsiType.DOUBLE.equals(expression.getType())) { - QuickFixAction.registerQuickFixAction(highlightInfo, fixRange, new ConvertDoubleToFloatFix(expression)); - } - } - } - } - } -} diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java index 6f94f0407785..8e9d76deff1c 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiLiteralUtil.java @@ -666,12 +666,15 @@ public final class PsiLiteralUtil { } if (PsiType.DOUBLE.equals(exprType) && PsiType.FLOAT.equals(wantedType)) { Double value = ObjectUtils.tryCast(literal.getValue(), Double.class); - if (value != null && (double)(float)(double)value == value) { - String text = literal.getText(); - if (StringUtil.endsWithIgnoreCase(text, "D")) { - text = text.substring(0, text.length() - 1); + if (value != null) { + float f = (float)(double)value; + if (Float.isFinite(f) && (f != 0.0 || value == 0.0)) { + String text = literal.getText(); + if (StringUtil.endsWithIgnoreCase(text, "D")) { + text = text.substring(0, text.length() - 1); + } + return text + "F"; } - return text + "F"; } } if (PsiType.FLOAT.equals(exprType) && PsiType.DOUBLE.equals(wantedType)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after1.java index 150bd12f3c60..0032c7fa7612 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after1.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after1.java @@ -1,7 +1,7 @@ -// "Convert '1e1' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { - foo(1e1f); + foo(1e1F); } void foo(float f){} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after2.java index 99cdfdf2f2af..adf4b4d08e51 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after2.java @@ -1,7 +1,7 @@ -// "Convert '2.' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { - foo(2.f); + foo(2.F); } void foo(float f){} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after3.java index 9272f41b2410..83548d768c47 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after3.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after3.java @@ -1,7 +1,7 @@ -// "Convert '.3' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { - foo(.3f); + foo(.3F); } void foo(float f){} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after4.java index 9d3993fd0f27..6aa997aa1eb7 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after4.java @@ -1,7 +1,7 @@ -// "Convert '0.0' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { - foo(0.0f); + foo(0.0F); } void foo(float f){} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after5.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after5.java index 7e70cf492967..c6b4eb0a7e78 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after5.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after5.java @@ -1,7 +1,7 @@ -// "Convert '3.14' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { - foo(3.14f); + foo(3.14F); } void foo(float f){} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after6.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after6.java index 42310faf30be..e3fee590638e 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after6.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after6.java @@ -1,7 +1,7 @@ -// "Convert '1e-9d' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { - foo(1e-9f); + foo(1e-9F); } void foo(float f){} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after7.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after7.java new file mode 100644 index 000000000000..5a074f8e0855 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/after7.java @@ -0,0 +1,7 @@ +// "Cast argument to 'float'" "true" +class Test { + void bar() { + foo((float) 1e137); + } + void foo(float f){} +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before1.java index e476b77bc9e0..3cf29ab90869 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before1.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before1.java @@ -1,4 +1,4 @@ -// "Convert '1e1' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(1e1); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before2.java index fa67aa86c9bf..683478d04a6a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before2.java @@ -1,4 +1,4 @@ -// "Convert '2.' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(2.); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before3.java index 3f6fb07e7b48..ccc41794c14c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before3.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before3.java @@ -1,4 +1,4 @@ -// "Convert '.3' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(.3); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before4.java index 92cb59d6872e..e49d7a671f1f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before4.java @@ -1,4 +1,4 @@ -// "Convert '0.0' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(0.0); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before5.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before5.java index 9541ec5647fe..e6ad49c7955c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before5.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before5.java @@ -1,4 +1,4 @@ -// "Convert '3.14' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(3.14); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before6.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before6.java index 74c6049452a3..c7be6a2f970b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before6.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before6.java @@ -1,4 +1,4 @@ -// "Convert '1e-9d' to float" "true" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(1e-9d); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before7.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before7.java index fe93892a6b6d..082a791ee0fb 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before7.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convertDoubleToFloat/before7.java @@ -1,4 +1,4 @@ -// "Convert '1e137' to float" "false" +// "Cast argument to 'float'" "true" class Test { void bar() { foo(1e137);