From 7446a478ddfe827afc3b0a8fae7de0493ad162d2 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 2 Dec 2015 10:49:53 +0100 Subject: [PATCH] IDEA-117543 (Bad quickfix for "implicit numeric conversion") --- .../ImplicitNumericConversionInspection.java | 12 ++++++ .../OperatorAssignment.after.java | 10 +++++ .../OperatorAssignment.java | 10 +++++ .../ImplicitNumericConversionFixTest.java | 42 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/numeric/ImplicitNumericConversionFixTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/ImplicitNumericConversionInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/ImplicitNumericConversionInspection.java index 095d0fcd931e..18e650160ade 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/ImplicitNumericConversionInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/ImplicitNumericConversionInspection.java @@ -123,6 +123,18 @@ public class ImplicitNumericConversionInspection extends BaseInspection { PsiReplacementUtil.replaceExpression(expression, convertedExpression); } else { + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent; + final PsiJavaToken sign = assignmentExpression.getOperationSign(); + if (!JavaTokenType.EQ.equals(sign.getTokenType())) { + final String lhsText = assignmentExpression.getLExpression().getText(); + final String newExpressionText = + lhsText + "=(" + expectedType.getCanonicalText() + ")(" + lhsText + sign.getText().charAt(0) + expression.getText() + ')'; + PsiReplacementUtil.replaceExpression(assignmentExpression, newExpressionText); + return; + } + } final String castExpression; if (ParenthesesUtils.getPrecedence(expression) <= ParenthesesUtils.TYPE_CAST_PRECEDENCE) { castExpression = '(' + expectedType.getCanonicalText() + ')' + expression.getText(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.after.java new file mode 100644 index 000000000000..f3783c9802af --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.after.java @@ -0,0 +1,10 @@ +class OperatorAssignment { + public static void main(String[] args) { + int a = 10; + double b = 0.5; + + a = (int) (a * b); + + System.out.println(a); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.java new file mode 100644 index 000000000000..aff6648ca32d --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/implicit_numeric_conversion/OperatorAssignment.java @@ -0,0 +1,10 @@ +class OperatorAssignment { + public static void main(String[] args) { + int a = 10; + double b = 0.5; + + a *= b; + + System.out.println(a); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/numeric/ImplicitNumericConversionFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/numeric/ImplicitNumericConversionFixTest.java new file mode 100644 index 000000000000..f5487306fd74 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/numeric/ImplicitNumericConversionFixTest.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2015 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.siyeh.ig.fixes.numeric; + +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.IGQuickFixesTestCase; +import com.siyeh.ig.numeric.ImplicitNumericConversionInspection; + +/** + * @author Bas Leijdekkers + */ +public class ImplicitNumericConversionFixTest extends IGQuickFixesTestCase { + + public void testOperatorAssignment() { + doTest(); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(new ImplicitNumericConversionInspection()); + myDefaultHint = InspectionGadgetsBundle.message("implicit.numeric.conversion.make.explicit.quickfix"); + } + + @Override + protected String getRelativePath() { + return "numeric/implicit_numeric_conversion"; + } +}