From 112d905b230f6ad3df536f2d787ca089be8cd8b7 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Tue, 16 Jun 2020 12:39:30 +0700 Subject: [PATCH] IDEA-163195 - added a quick fix for message creation GitOrigin-RevId: aad3d98ca868875a6e27e2631ef41bb7df90584e --- .../InspectionGadgetsBundle.properties | 3 +- .../AssertWithoutMessageInspection.java | 39 +++++++++++++-- ...tAssertsWithoutMessagesInspectionTest.java | 47 +++++++++++++++++++ 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties index c26c88d9ef96..1f328abdcbbe 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties @@ -1073,7 +1073,8 @@ manual.array.copy.problem.descriptor=Manual array copy #loc manual.array.to.collection.copy.problem.descriptor=Manual array to collection copy #loc call.to.simple.getter.in.class.problem.descriptor=Call to simple getter #ref() from within class #loc call.to.simple.setter.in.class.problem.descriptor=Call to simple setter #ref() from within class #loc -asserts.without.messages.problem.descriptor=#ref() without message #loc +assert.without.message.problem.descriptor=#ref() without message #loc +assert.without.message.quick.fix.family.name=Add error message test.case.with.constructor.problem.descriptor=Initialization logic in constructor #ref() instead of 'setUp()' #loc test.case.with.constructor.problem.descriptor.initializer=Initialization logic in initializer instead of 'setUp()' misordered.assert.equals.arguments.problem.descriptor=Arguments to #ref() in wrong order #loc diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertWithoutMessageInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertWithoutMessageInspection.java index e40c7e634951..9d32566b40bd 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertWithoutMessageInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertWithoutMessageInspection.java @@ -15,12 +15,19 @@ */ package com.siyeh.ig.testFrameworks; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiMethodCallExpression; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.util.IntentionFamilyName; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.InspectionGadgetsFix; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class AssertWithoutMessageInspection extends BaseInspection { @@ -32,7 +39,7 @@ public class AssertWithoutMessageInspection extends BaseInspection { @Override @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message("asserts.without.messages.problem.descriptor"); + return InspectionGadgetsBundle.message("assert.without.message.problem.descriptor"); } private static class AssertionsWithoutMessagesVisitor extends BaseInspectionVisitor { @@ -50,4 +57,30 @@ public class AssertWithoutMessageInspection extends BaseInspection { } } } + + @Override + protected @Nullable InspectionGadgetsFix buildFix(Object... infos) { + return new InspectionGadgetsFix() { + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) { + PsiMethodCallExpression methodCallExpr = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiMethodCallExpression.class); + if (methodCallExpr == null) return; + + PsiExpressionList methodArgs = methodCallExpr.getArgumentList(); + PsiExpression[] methodArgExprs = methodArgs.getExpressions(); + PsiExpression firstMethodArgExpr = methodArgExprs.length > 0 ? methodArgExprs[0] : null; + PsiExpression newMessageExpr = JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText("\"\"", methodCallExpr); + PsiElement createdMessageExpr = methodArgs.addBefore(newMessageExpr, firstMethodArgExpr); + + final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); + if (editor == null) return; + editor.getCaretModel().moveToOffset(createdMessageExpr.getTextOffset() + 1); + } + + @Override + public @IntentionFamilyName @NotNull String getFamilyName() { + return InspectionGadgetsBundle.message("assert.without.message.quick.fix.family.name"); + } + }; + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/JUnitAssertsWithoutMessagesInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/JUnitAssertsWithoutMessagesInspectionTest.java index 4409db5767a9..0bbdd8195460 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/JUnitAssertsWithoutMessagesInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/JUnitAssertsWithoutMessagesInspectionTest.java @@ -28,6 +28,48 @@ public class JUnitAssertsWithoutMessagesInspectionTest extends LightJavaInspecti doTest(); } + public void testQuickFixAssertEquals() { + doTest("import org.junit.Test;\n" + + "import static org.junit.Assert.*;\n" + + + "class TestCase {\n" + + " @Test\n" + + " public void test() {\n" + + " assertEquals(1, 1);\n" + + " }\n" + + "}"); + checkQuickFix("Add error message", "import org.junit.Test;\n" + + "import static org.junit.Assert.*;\n" + + + "class TestCase {\n" + + " @Test\n" + + " public void test() {\n" + + " assertEquals(\"\", 1, 1);\n" + + " }\n" + + "}"); + } + + public void testQuickFixFail() { + doTest("import org.junit.Test;\n" + + "import static org.junit.Assert.*;\n" + + + "class TestCase {\n" + + " @Test\n" + + " public void test() {\n" + + " fail();\n" + + " }\n" + + "}"); + checkQuickFix("Add error message", "import org.junit.Test;\n" + + "import static org.junit.Assert.*;\n" + + + "class TestCase {\n" + + " @Test\n" + + " public void test() {\n" + + " fail(\"\");\n" + + " }\n" + + "}"); + } + @Override protected String getBasePath() { return "/plugins/InspectionGadgets/test/com/siyeh/igtest/junit/junit_asserts_without_messages"; @@ -48,6 +90,11 @@ public class JUnitAssertsWithoutMessagesInspectionTest extends LightJavaInspecti "public class Assert {" + " static public void assertEquals(double expected, double actual, double delta) {}" + " static public void assertEquals(Object expected, Object actual){}" + + " static public void assertEquals(String message, Object expected, Object actual){}" + + " static public void assertSame(Object expected, Object actual){}" + + " static public void assertSame(String message, Object expected, Object actual){}" + + " static public void fail(){}" + + " static public void fail(String message){}" + "}", "package org.junit.jupiter.api;\n" +