From bfde8b00af209a80f5c45e41830363dff34d16be Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 22 Apr 2019 13:27:54 +0700 Subject: [PATCH] RedundantCastUtil: report safe widening primitive casts Fixes IDEA-154832 IDEA add unnecessary cast to double on method inline GitOrigin-RevId: 1e8dbd1466f74bdab9584a860f4e188b025fba1c --- .../intellij/psi/util/RedundantCastUtil.java | 2 +- .../generics/PrimitiveWidening.java | 18 ++++++++++++++++++ .../inlineMethod/WidenArgument.java | 12 ++++++++++++ .../inlineMethod/WidenArgument.java.after | 8 ++++++++ .../codeInspection/RedundantCast15Test.java | 2 ++ .../refactoring/inline/InlineMethodTest.java | 4 ++++ 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java create mode 100644 java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after diff --git a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java index 5730be7ac359..32f8805df501 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java @@ -761,7 +761,7 @@ public class RedundantCastUtil { PsiType castType = typeElement.getType(); if (castType instanceof PsiPrimitiveType) { if (opType instanceof PsiPrimitiveType) { - return !opType.equals(castType); // let's suppose all not equal primitive casts are necessary + return !TypeConversionUtil.isSafeConversion(castType, opType); // let's suppose that casts losing precision are important } final PsiPrimitiveType unboxedOpType = PsiPrimitiveType.getUnboxedType(opType); if (unboxedOpType != null && !unboxedOpType.equals(castType) ) { diff --git a/java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java b/java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java new file mode 100644 index 000000000000..4b0f5802aa1d --- /dev/null +++ b/java/java-tests/testData/inspection/redundantCast/generics/PrimitiveWidening.java @@ -0,0 +1,18 @@ +import org.jetbrains.annotations.*; + +class A { + double widen(int x) { + return (double) x; + } + + double widenDataLoss(long x) { + return (double) x; + } + + void call(short a, byte b, long c) { + widen((int)a); + widen((int)b); + widen((int)c); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java new file mode 100644 index 000000000000..c81ef21aff32 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java @@ -0,0 +1,12 @@ +class UnnecessaryDoubleCast { + public void check() { + eq(25, 25.49); + } + + private static void eq(double expected, double actual) { + assertDoubleEquals(expected, actual); + } + + public static void assertDoubleEquals(double v, double v2) { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after new file mode 100644 index 000000000000..7aa50597248d --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/WidenArgument.java.after @@ -0,0 +1,8 @@ +class UnnecessaryDoubleCast { + public void check() { + assertDoubleEquals(25, 25.49); + } + + public static void assertDoubleEquals(double v, double v2) { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java index 7383056065da..945b74b6aba7 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/RedundantCast15Test.java @@ -78,4 +78,6 @@ public class RedundantCast15Test extends LightCodeInsightFixtureTestCase { myFixture.testHighlighting(getTestName(false) + ".java"); } public void testDifferentNullness() { doTest();} + + public void testPrimitiveWidening() { doTest(); } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java index 163f0ce19e3e..c2c2fc456b9b 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineMethodTest.java @@ -422,6 +422,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { public void testPrivateFieldInSuperClassInSameFile() { doTest(); } + + public void testWidenArgument() { + doTest(); + } public void testInlineMultipleOccurrencesInFieldInitializer() { doTest();