From 14d7f57946d19736d552f263f4eed70ea18f0006 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 18 Oct 2017 10:45:08 +0200 Subject: [PATCH] junit 4 -> junit 5: replace with static imports after refactoring (IDEA-179927) if replace simultaneously, all old assertions have to be checked if they have no conflicts with current static import --- .../impl/AddOnDemandStaticImportAction.java | 12 +++-- .../JUnit5AssertionsConverterInspection.java | 8 +--- .../ig/junit/JUnit5ConverterInspection.java | 48 ++++++++++++++++++- .../AssertArrayEquals.after.java | 5 +- .../AssertArrayEqualsMessage.after.java | 5 +- .../AssertEquals.after.java | 5 +- .../AssertTrue.after.java | 5 +- .../AssumeTrue.after.java | 5 +- .../FullConversion.after.java | 11 +++++ .../junit5_converter/FullConversion.java | 11 +++++ .../junit/junit5_converter/Simple.after.java | 13 ++--- .../fixes/junit/Junit5ConverterFixTest.java | 3 ++ 12 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java index 1779e36fdcac..a2e774a0a646 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorColors; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -110,17 +111,17 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc return classToImport != null; } - public static void invoke(final Project project, PsiFile file, final Editor editor, PsiElement element) { + public static boolean invoke(final Project project, PsiFile file, final Editor editor, PsiElement element) { final PsiJavaCodeReferenceElement refExpr = (PsiJavaCodeReferenceElement)element.getParent(); final PsiClass aClass = (PsiClass)refExpr.resolve(); if (aClass == null) { - return; + return false; } final PsiClass containingClass = PsiUtil.getTopLevelClass(refExpr); if (aClass != containingClass) { PsiImportList importList = ((PsiJavaFile)file).getImportList(); if (importList == null) { - return; + return false; } boolean alreadyImported = false; for (PsiImportStaticStatement statement : importList.getImportStaticStatements()) { @@ -138,6 +139,7 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc } } + Ref conflict = new Ref<>(false); List roots = file.getViewProvider().getAllFiles(); for (final PsiFile root : roots) { PsiElement copy = root.copy(); @@ -163,6 +165,9 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc if (manager.areElementsEquivalent(after, resolved)) { expressionToDequalifyOffsets.add(expression.getTextRange().getStartOffset() + delta); } + else { + conflict.set(true); + } } catch (IncorrectOperationException e) { LOG.error(e); @@ -191,6 +196,7 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc return true; }); } + return conflict.get(); } @Override diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5AssertionsConverterInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5AssertionsConverterInspection.java index 3220445fb2db..74c4ffcd700f 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5AssertionsConverterInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5AssertionsConverterInspection.java @@ -30,7 +30,6 @@ import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ImportUtils; import com.siyeh.ig.testFrameworks.AssertHint; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -190,11 +189,8 @@ public class JUnit5AssertionsConverterInspection extends BaseInspection { } PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (qualifier != null || !ImportUtils.addStaticImport(qualifiedName, methodName, methodExpression)) { - methodExpression.setQualifierExpression(JavaPsiFacade.getElementFactory(project).createReferenceExpression(newAssertClass)); - JavaCodeStyleManager.getInstance(project).shortenClassReferences(methodExpression); - } + methodExpression.setQualifierExpression(JavaPsiFacade.getElementFactory(project).createReferenceExpression(newAssertClass)); + JavaCodeStyleManager.getInstance(project).shortenClassReferences(methodExpression); } @Nls diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5ConverterInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5ConverterInspection.java index 99032c915316..80da56428dd1 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5ConverterInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit5ConverterInspection.java @@ -17,6 +17,7 @@ package com.siyeh.ig.junit; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.TestFrameworks; +import com.intellij.codeInsight.intention.impl.AddOnDemandStaticImportAction; import com.intellij.codeInspection.*; import com.intellij.codeInspection.actions.CleanupInspectionIntention; import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; @@ -219,13 +220,18 @@ public class JUnit5ConverterInspection extends BaseInspection { return ArrayUtil.mergeArrays(usages, descriptors); } + List> myReplacedRefs = new ArrayList<>(); + @Override protected void performRefactoring(@NotNull UsageInfo[] usages) { List migrateUsages = new ArrayList<>(); List descriptions = new ArrayList<>(); + SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(myProject); for (UsageInfo usage : usages) { if (usage instanceof MyDescriptionBasedUsageInfo) { - descriptions.add (((MyDescriptionBasedUsageInfo)usage).myDescriptor); + ProblemDescriptor descriptor = ((MyDescriptionBasedUsageInfo)usage).myDescriptor; + descriptions.add (descriptor); + markUsagesImportedThroughStaticImport(smartPointerManager, descriptor); } else { migrateUsages.add(usage); @@ -234,6 +240,46 @@ public class JUnit5ConverterInspection extends BaseInspection { super.performRefactoring(migrateUsages.toArray(new UsageInfo[migrateUsages.size()])); CleanupInspectionIntention.applyFixes(myProject, "Convert Assertions", descriptions, JUnit5AssertionsConverterInspection.ReplaceObsoleteAssertsFix.class, false); } + + @Override + protected void performPsiSpoilingRefactoring() { + super.performPsiSpoilingRefactoring(); + tryToRestoreStaticImportsOnNewAssertions(); + } + + private void markUsagesImportedThroughStaticImport(SmartPointerManager smartPointerManager, ProblemDescriptor descriptor) { + PsiElement element = descriptor.getPsiElement(); + PsiMethodCallExpression callExpression = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class); + if (callExpression != null) { + PsiReferenceExpression methodExpression = callExpression.getMethodExpression(); + PsiElement scope = methodExpression.getQualifierExpression() == null + ? methodExpression.advancedResolve(false).getCurrentFileResolveScope() + : null; + if (scope instanceof PsiImportStaticStatement && ((PsiImportStaticStatement)scope).isOnDemand()) { + myReplacedRefs.add(smartPointerManager.createSmartPsiElementPointer(callExpression)); + } + } + } + + private void tryToRestoreStaticImportsOnNewAssertions() { + for (SmartPsiElementPointer ref : myReplacedRefs) { + PsiElement element = ref.getElement(); + if (element instanceof PsiMethodCallExpression) { + PsiExpression qualifierExpression = ((PsiMethodCallExpression)element).getMethodExpression().getQualifierExpression(); + if (qualifierExpression != null) { + PsiElement referenceNameElement = ((PsiReferenceExpression)qualifierExpression).getReferenceNameElement(); + PsiClass aClass = referenceNameElement != null ? AddOnDemandStaticImportAction + .getClassToPerformStaticImport(referenceNameElement) : null; + PsiFile containingFile = element.getContainingFile(); + if (aClass != null && !AddOnDemandStaticImportAction.invoke(myProject, containingFile, null, referenceNameElement)) { + PsiImportStatementBase importReferenceTo = PsiTreeUtil + .getParentOfType(((PsiJavaFile)containingFile).findImportReferenceTo(aClass), PsiImportStatementBase.class); + if (importReferenceTo != null) importReferenceTo.delete(); + } + } + } + } + } } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEquals.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEquals.after.java index 4cf7df0b96e3..3598b885bb4b 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEquals.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEquals.after.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.junit.jupiter.api.Assertions; + import static org.junit.Assert.*; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; class Test1 { @org.junit.jupiter.api.Test public void test_first() throws Exception { - assertArrayEquals(new Object[] {}, null); + Assertions.assertArrayEquals(new Object[] {}, null); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEqualsMessage.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEqualsMessage.after.java index 5828a361e6cf..61b9892218da 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEqualsMessage.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertArrayEqualsMessage.after.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.junit.jupiter.api.Assertions; + import static org.junit.Assert.*; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; class Test1 { @org.junit.jupiter.api.Test public void test_first() throws Exception { - assertArrayEquals(new Object[] {}, null, "message"); + Assertions.assertArrayEquals(new Object[] {}, null, "message"); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertEquals.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertEquals.after.java index d6b299b71e29..660f132b8107 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertEquals.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertEquals.after.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.junit.jupiter.api.Assertions; + import static org.junit.Assert.*; -import static org.junit.jupiter.api.Assertions.assertEquals; class Test1 { @org.junit.jupiter.api.Test public void test_first() throws Exception { - assertEquals("Expected", "actual", "message"); + Assertions.assertEquals("Expected", "actual", "message"); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertTrue.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertTrue.after.java index e6af964ccd9a..c23f10424dfa 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertTrue.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssertTrue.after.java @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.junit.jupiter.api.Assertions; + import static org.junit.Assert.*; -import static org.junit.jupiter.api.Assertions.assertTrue; class Test1 { @org.junit.jupiter.api.Test public void test_first() throws Exception { - assertTrue(false, "message"); + Assertions.assertTrue(false, "message"); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssumeTrue.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssumeTrue.after.java index 740481194960..4348ef6ace70 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssumeTrue.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_assertions_converter/AssumeTrue.after.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.junit.jupiter.api.Assumptions; + import static org.junit.Assume.*; -import static org.junit.jupiter.api.Assumptions.assumeTrue; class Test1 { @org.junit.jupiter.api.Test public void test_first() throws Exception { - assumeTrue(false, "message"); + Assumptions.assumeTrue(false, "message"); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.after.java new file mode 100644 index 000000000000..e19e44b2649a --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.after.java @@ -0,0 +1,11 @@ +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class FullConversion { + @Test + public void testAssertions() { + fail("fail"); + assertTrue(true, "always"); + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.java new file mode 100644 index 000000000000..6b1fa755f4e9 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/FullConversion.java @@ -0,0 +1,11 @@ + +import static org.junit.Assert.*; +import org.junit.Test; + +public class FullConversion { + @Test + public void testAssertions() { + fail("fail"); + assertTrue("always", true); + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/Simple.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/Simple.after.java index 8f14ac1809a5..566d8facf130 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/Simple.after.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/junit/junit5_converter/Simple.after.java @@ -13,22 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.Assert.*; public class Simple { @Test public void test_first() throws Exception { - assertArrayEquals(new Object[] {}, null); - assertArrayEquals(new Object[] {}, null, "message"); + Assertions.assertArrayEquals(new Object[] {}, null); + Assertions.assertArrayEquals(new Object[] {}, null, "message"); - assertEquals("Expected", "actual"); - assertEquals("Expected", "actual", "message"); + Assertions.assertEquals("Expected", "actual"); + Assertions.assertEquals("Expected", "actual", "message"); fail(); - fail(""); + Assertions.fail(""); } } diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/junit/Junit5ConverterFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/junit/Junit5ConverterFixTest.java index 507396f5c97c..288d7ccc7ccf 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/junit/Junit5ConverterFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/junit/Junit5ConverterFixTest.java @@ -26,6 +26,9 @@ public class Junit5ConverterFixTest extends IGQuickFixesTestCase { public void testSimple() { doTest(); } + public void testFullConversion() { + doTest(); + } @Override protected void tuneFixture(JavaModuleFixtureBuilder builder) throws Exception {