diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java index 5ac2989b7196..1f8f51470730 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RedundantCastInspection.java @@ -120,7 +120,7 @@ public class RedundantCastInspection extends GenericsInspectionToolBase { PsiElement castTypeElement = descriptor.getPsiElement(); PsiTypeCastExpression cast = castTypeElement == null ? null : (PsiTypeCastExpression)castTypeElement.getParent(); if (cast != null) { - RedundantCastUtil.removeCast(cast); + RemoveRedundantCastUtil.removeCast(cast); } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RemoveRedundantCastUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RemoveRedundantCastUtil.java new file mode 100644 index 000000000000..22468c512e46 --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/redundantCast/RemoveRedundantCastUtil.java @@ -0,0 +1,43 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.codeInspection.redundantCast; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiParenthesizedExpression; +import com.intellij.psi.PsiTypeCastExpression; +import com.intellij.psi.util.PsiPrecedenceUtil; +import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.psiutils.CommentTracker; + +public class RemoveRedundantCastUtil { + private static final Logger LOG = Logger.getInstance(RemoveRedundantCastUtil.class); + + public static PsiExpression removeCast(PsiTypeCastExpression castExpression) { + if (castExpression == null) return null; + PsiElement parent = castExpression.getParent(); + PsiExpression operand = castExpression.getOperand(); + if (operand instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parExpr = (PsiParenthesizedExpression)operand; + if (parent instanceof PsiExpression && !PsiPrecedenceUtil.areParenthesesNeeded(parExpr.getExpression(), (PsiExpression)parent, true)) { + operand = parExpr.getExpression(); + } + } + if (operand == null) return null; + + PsiExpression toBeReplaced = castExpression; + + while (parent instanceof PsiParenthesizedExpression) { + toBeReplaced = (PsiExpression)parent; + parent = parent.getParent(); + } + + try { + return (PsiExpression)new CommentTracker().replaceAndRestoreComments(toBeReplaced, operand); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + return toBeReplaced; + } +} diff --git a/java/java-impl/src/com/intellij/codeInspection/ReplaceInefficientStreamCountInspection.java b/java/java-impl/src/com/intellij/codeInspection/ReplaceInefficientStreamCountInspection.java index aad8124e57d1..e67d64cd3611 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ReplaceInefficientStreamCountInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/ReplaceInefficientStreamCountInspection.java @@ -1,6 +1,7 @@ // Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.codeInspection; +import com.intellij.codeInspection.redundantCast.RemoveRedundantCastUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -245,7 +246,7 @@ public class ReplaceInefficientStreamCountInspection extends AbstractBaseJavaLoc String replacementText = (addCast ? "(long) " : "") + ct.text(methodExpression)+"()"; PsiElement replacement = ct.replaceAndRestoreComments(toReplace, replacementText); if (replacement instanceof PsiTypeCastExpression && RedundantCastUtil.isCastRedundant((PsiTypeCastExpression)replacement)) { - RedundantCastUtil.removeCast((PsiTypeCastExpression)replacement); + RemoveRedundantCastUtil.removeCast((PsiTypeCastExpression)replacement); } } diff --git a/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java b/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java index 22eaa6bd94a2..15fe9620068a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/SimplifyStreamApiCallChainsInspection.java @@ -7,6 +7,7 @@ import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.intention.impl.StreamRefactoringUtil; import com.intellij.codeInspection.dataFlow.DfaUtil; import com.intellij.codeInspection.dataFlow.NullabilityUtil; +import com.intellij.codeInspection.redundantCast.RemoveRedundantCastUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; @@ -560,7 +561,7 @@ public class SimplifyStreamApiCallChainsInspection extends AbstractBaseJavaLocal factory.createExpressionFromText("(" + boxedType.getCanonicalText() + ") " + expression.getText(), expression); PsiElement cast = expression.replace(castExpression); if (cast instanceof PsiTypeCastExpression && RedundantCastUtil.isCastRedundant((PsiTypeCastExpression)cast)) { - RedundantCastUtil.removeCast((PsiTypeCastExpression)cast); + RemoveRedundantCastUtil.removeCast((PsiTypeCastExpression)cast); } } } diff --git a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java index 32aa8808fa58..ef9b1a129bec 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/StreamToLoopInspection.java @@ -5,6 +5,7 @@ import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.codeInspection.redundantCast.RemoveRedundantCastUtil; import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.lang.java.lexer.JavaLexer; import com.intellij.openapi.diagnostic.Attachment; @@ -334,7 +335,7 @@ public class StreamToLoopInspection extends AbstractBaseJavaLocalInspectionTool private static PsiElement normalize(@NotNull Project project, PsiElement element) { element = JavaCodeStyleManager.getInstance(project).shortenClassReferences(element); PsiDiamondTypeUtil.removeRedundantTypeArguments(element); - RedundantCastUtil.getRedundantCastsInside(element).forEach(RedundantCastUtil::removeCast); + RedundantCastUtil.getRedundantCastsInside(element).forEach(RemoveRedundantCastUtil::removeCast); return element; } diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index d9fecc5fbf74..05e9d5615321 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -13,6 +13,7 @@ import com.intellij.codeInspection.dataFlow.*; import com.intellij.codeInspection.dataFlow.instructions.BranchingInstruction; import com.intellij.codeInspection.dataFlow.instructions.Instruction; import com.intellij.codeInspection.dataFlow.value.DfaValue; +import com.intellij.codeInspection.redundantCast.RemoveRedundantCastUtil; import com.intellij.ide.DataManager; import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.PsiClassListCellRenderer; @@ -1058,7 +1059,7 @@ public class ExtractMethodProcessor implements MatchProvider { final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)parent; final PsiTypeElement castType = typeCastExpression.getCastType(); if (castType != null && Comparing.equal(castType.getType(), paramType)) { - RedundantCastUtil.removeCast(typeCastExpression); + RemoveRedundantCastUtil.removeCast(typeCastExpression); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java index d59b4f4026f8..b4a7f5664a53 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/InlineUtil.java @@ -16,6 +16,7 @@ package com.intellij.refactoring.util; import com.intellij.codeInsight.ChangeContextUtil; +import com.intellij.codeInspection.redundantCast.RemoveRedundantCastUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Comparing; @@ -171,7 +172,7 @@ public class InlineUtil { operand.replace(expr); expr = (PsiTypeCastExpression)expr.replace(cast); if (RedundantCastUtil.isCastRedundant((PsiTypeCastExpression)expr)) { - return RedundantCastUtil.removeCast((PsiTypeCastExpression)expr); + return RemoveRedundantCastUtil.removeCast((PsiTypeCastExpression)expr); } return expr; 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 70d51b0e7c74..8f3fac85968e 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 @@ -60,34 +60,6 @@ public class RedundantCastUtil { return arg; } - public static PsiExpression removeCast(PsiTypeCastExpression castExpression) { - if (castExpression == null) return null; - PsiElement parent = castExpression.getParent(); - PsiExpression operand = castExpression.getOperand(); - if (operand instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parExpr = (PsiParenthesizedExpression)operand; - if (parent instanceof PsiExpression && !PsiPrecedenceUtil.areParenthesesNeeded(parExpr.getExpression(), (PsiExpression)parent, true)) { - operand = parExpr.getExpression(); - } - } - if (operand == null) return null; - - PsiExpression toBeReplaced = castExpression; - - while (parent instanceof PsiParenthesizedExpression) { - toBeReplaced = (PsiExpression)parent; - parent = parent.getParent(); - } - - try { - return (PsiExpression)toBeReplaced.replace(operand); - } - catch (IncorrectOperationException e) { - LOG.error(e); - } - return toBeReplaced; - } - private static class MyCollectingVisitor extends MyIsRedundantVisitor { private final Set myFoundCasts = new HashSet<>(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/afterStringConcatenation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/afterStringConcatenation.java index cac0b99522b4..286c3bada50d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/afterStringConcatenation.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/afterStringConcatenation.java @@ -1,6 +1,7 @@ // "Remove redundant cast(s)" "true" class Test { { - String s = "" + (1 + 2); + //c1 + String s = "" + (1 + 2); } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/beforeStringConcatenation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/beforeStringConcatenation.java index 2ad9840b3dc6..208074a8a202 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/beforeStringConcatenation.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantCast/beforeStringConcatenation.java @@ -1,6 +1,7 @@ // "Remove redundant cast(s)" "true" class Test { { - String s = "" + (int) (1 + 2); + String s = "" + (int)//c1 + (1 + 2); } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/ConstantConditionalExpressionInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/ConstantConditionalExpressionInspection.java index 0c43060b2320..be45d3627499 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/ConstantConditionalExpressionInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/ConstantConditionalExpressionInspection.java @@ -16,6 +16,7 @@ package com.siyeh.ig.controlflow; import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.redundantCast.RemoveRedundantCastUtil; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiConditionalExpression; import com.intellij.psi.PsiExpression; @@ -92,7 +93,7 @@ public class ConstantConditionalExpressionInspection PsiTypeCastExpression castExpression = (PsiTypeCastExpression)ct .replaceAndRestoreComments(expression, "(" + expressionType.getCanonicalText() + ")" + ct.text(replacement)); if (RedundantCastUtil.isCastRedundant(castExpression)) { - RedundantCastUtil.removeCast(castExpression); + RemoveRedundantCastUtil.removeCast(castExpression); } } else { diff --git a/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java b/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java index 115826b23612..a2aba7a20cca 100644 --- a/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java +++ b/plugins/InspectionGadgets/src/com/intellij/codeInspection/redundantCast/CastCanBeRemovedNarrowingVariableTypeInspection.java @@ -145,7 +145,7 @@ public class CastCanBeRemovedNarrowingVariableTypeInspection extends AbstractBas PsiTypeCastExpression castOccurrence = tryCast(PsiUtil.skipParenthesizedExprUp(((PsiReferenceExpression)reference).getParent()), PsiTypeCastExpression.class); if (castOccurrence != null && RedundantCastUtil.isCastRedundant(castOccurrence)) { - RedundantCastUtil.removeCast(castOccurrence); + RemoveRedundantCastUtil.removeCast(castOccurrence); } } }