From dbde0774570f4ab8a8011499a87340e182f0268a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 11 May 2020 10:26:57 +0200 Subject: [PATCH] java redundant cast: property test GitOrigin-RevId: 6a02848ab0839c4a2cb3a7b0ccc8d153ef60e7d3 --- .../daemon/impl/quickfix/AddTypeCastFix.java | 2 +- .../JavaCodeInsightSanityTest.java | 50 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java index 3b96a0fed284..1b31450a9a50 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeCastFix.java @@ -74,7 +74,7 @@ public class AddTypeCastFix extends LocalQuickFixAndIntentionActionOnPsiElement addTypeCast(project, (PsiExpression)startElement, myType); } - private static void addTypeCast(Project project, PsiExpression originalExpression, PsiType type) { + public static void addTypeCast(Project project, PsiExpression originalExpression, PsiType type) { PsiExpression typeCast = createCastExpression(originalExpression, project, type); originalExpression.replace(typeCast); } diff --git a/java/java-tests/testSrc/com/intellij/java/propertyBased/JavaCodeInsightSanityTest.java b/java/java-tests/testSrc/com/intellij/java/propertyBased/JavaCodeInsightSanityTest.java index 11821c1f0013..8643f23d2e59 100644 --- a/java/java-tests/testSrc/com/intellij/java/propertyBased/JavaCodeInsightSanityTest.java +++ b/java/java-tests/testSrc/com/intellij/java/propertyBased/JavaCodeInsightSanityTest.java @@ -2,14 +2,19 @@ package com.intellij.java.propertyBased; import com.intellij.application.options.CodeStyle; +import com.intellij.codeInsight.daemon.impl.quickfix.AddTypeCastFix; +import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl; import com.intellij.openapi.util.RecursionManager; -import com.intellij.psi.PsiFile; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.impl.source.PsiEnumConstantImpl; +import com.intellij.psi.util.PsiTypesUtil; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.SkipSlowTestLocally; import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; @@ -19,6 +24,7 @@ import org.jetbrains.jetCheck.Generator; import org.jetbrains.jetCheck.PropertyChecker; import java.io.File; +import java.util.List; import java.util.function.Function; import java.util.function.Supplier; @@ -88,6 +94,20 @@ public class JavaCodeInsightSanityTest extends LightJavaCodeInsightFixtureTestCa return rootSettings.getCommonSettings(JavaLanguage.INSTANCE).getRootSettings().getCustomSettings(JavaCodeStyleSettings.class); } + public void testRemoveRedundantCast() { + enableInspections(); + Function> fileActions = + file -> Generator.sampledFrom(new InvokeIntentionAtElement(file, new JavaIntentionPolicy() { + @Override + protected boolean shouldSkipIntention(@NotNull String actionText) { + return !actionText.equals(JavaAnalysisBundle.message("inspection.redundant.cast.remove.quickfix")); + } + }, PsiTypeCastExpression.class, Function.identity()), + new InsertTypeCastCommand(file)); + PropertyChecker + .checkScenarios(actionsOnJavaFiles(fileActions)); + } + public void testParenthesesDontChangeIntention() { enableInspections(); Function> fileActions = @@ -123,4 +143,32 @@ public class JavaCodeInsightSanityTest extends LightJavaCodeInsightFixtureTestCa ) )); } + + private static class InsertTypeCastCommand extends ActionOnFile { + private InsertTypeCastCommand(PsiFile file) { + super(file); + } + + @Override + public void performCommand(@NotNull Environment env) { + PsiDocumentManager.getInstance(getProject()).commitDocument(getDocument()); + + int randomOffset = generatePsiOffset(env, null); + PsiElement leaf = getFile().findElementAt(randomOffset); + + if (leaf != null) { + List elementsToWrap = new JavaParenthesesPolicy().getElementsToWrap(leaf); + if (elementsToWrap.isEmpty()) return; + PsiElement expr = env.generateValue(Generator.sampledFrom(elementsToWrap).noShrink(), null); + if (!(expr instanceof PsiExpression)) return; + PsiType type = ((PsiExpression)expr).getType(); + if (type == null || !PsiTypesUtil.isDenotableType(type, expr)) return; //accept cast in expression statement + env.logMessage("Inserting cast '" + + StringUtil.escapeStringCharacters("(" + type.getCanonicalText() + ")") + + "' at " + + MadTestingUtil.getPositionDescription(expr.getTextOffset(), getDocument())); + WriteCommandAction.runWriteCommandAction(getProject(), () -> AddTypeCastFix.addTypeCast(getProject(), (PsiExpression)expr, type)); + } + } + } }