From f746cdbdc4f589a771de56e4e8ef442ed8f244fd Mon Sep 17 00:00:00 2001 From: "Andrey.Cherkasov" Date: Wed, 21 Oct 2020 13:03:30 +0300 Subject: [PATCH] IDEA-251250 add quickfix for JavaDocs annotations for inspection "tag description is missing" GitOrigin-RevId: 144bc690511b94af09184780d3621ff1e31b9068 --- .../javaDoc/JavaDocLocalInspection.java | 37 +++++++++++++++++++ .../javaDoc/JavadocHighlightUtil.java | 12 ++++-- .../afterException.java | 11 ++++++ .../afterExceptionWithoutParams.java | 11 ++++++ .../afterParam.java | 10 +++++ .../afterReturn.java | 10 +++++ .../afterThrows.java | 11 ++++++ .../afterThrowsWithoutParams.java | 11 ++++++ .../beforeException.java | 12 ++++++ .../beforeExceptionWithoutParams.java | 12 ++++++ .../beforeParam.java | 11 ++++++ .../beforeReturn.java | 11 ++++++ .../beforeThrows.java | 12 ++++++ .../beforeThrowsWithoutParams.java | 12 ++++++ ...emoveJavadocTagWithoutDescriptionTest.java | 21 +++++++++++ 15 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterException.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterExceptionWithoutParams.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterParam.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterReturn.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrows.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrowsWithoutParams.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeException.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeExceptionWithoutParams.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeParam.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeReturn.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrows.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrowsWithoutParams.java create mode 100644 java/java-tests/testSrc/com/intellij/java/codeInsight/intention/RemoveJavadocTagWithoutDescriptionTest.java diff --git a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java index 40db20599ed3..1fdd14ddca2d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java @@ -90,6 +90,10 @@ public class JavaDocLocalInspection extends LocalInspectionTool { return new AddUnknownTagToCustoms(this, tag); } + private static LocalQuickFix createRemoveTagWithoutDescriptionFix(@NotNull String tag) { + return new RemoveTagWithoutDescriptionFix(tag); + } + public void setPackageOption(String modifier, String tags) { PACKAGE_OPTIONS.ACCESS_JAVADOC_REQUIRED_FOR = modifier; PACKAGE_OPTIONS.REQUIRED_TAGS = tags; @@ -793,6 +797,34 @@ public class JavaDocLocalInspection extends LocalInspectionTool { } } + private static class RemoveTagWithoutDescriptionFix implements LocalQuickFix { + private final String myTag; + + RemoveTagWithoutDescriptionFix(String tag) { + myTag = tag; + } + + @NotNull + @Override + public String getName() { + return CommonQuickFixBundle.message("fix.remove", myTag); + } + + @NotNull + @Override + public String getFamilyName() { + return JavaBundle.message("quickfix.family.remove.javadoc.tag"); + } + + @Override + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + PsiDocTag myTag = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiDocTag.class); + if (myTag != null) { + myTag.delete(); + } + } + } + private final class ProblemHolderImpl implements JavadocHighlightUtil.ProblemHolder { private final ProblemsHolder myHolder; private final boolean myOnTheFly; @@ -844,5 +876,10 @@ public class JavaDocLocalInspection extends LocalInspectionTool { public LocalQuickFix registerTagFix(@NotNull String tag) { return createRegisterTagFix(tag); } + + @Override + public LocalQuickFix removeTagWithoutDescriptionFix(@NotNull String tag) { + return createRemoveTagWithoutDescriptionFix(tag); + } } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavadocHighlightUtil.java b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavadocHighlightUtil.java index baa94b3e3c9a..76dcc1125c47 100644 --- a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavadocHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavadocHighlightUtil.java @@ -45,6 +45,7 @@ public final class JavadocHighlightUtil { LocalQuickFix addMissingTagFix(@NotNull String tag, @NotNull String value); LocalQuickFix addMissingParamTagFix(@NotNull String name); LocalQuickFix registerTagFix(@NotNull String tag); + LocalQuickFix removeTagWithoutDescriptionFix(@NotNull String tag); } static boolean isJavaDocRequired(@NotNull JavaDocLocalInspection inspection, @NotNull PsiModifierListOwner element) { @@ -446,20 +447,25 @@ public final class JavadocHighlightUtil { if ("return".equals(tag.getName())) { if (emptyTag(tag)) { String tagText = "@return"; - holder.problem(tag.getNameElement(), JavaBundle.message("inspection.javadoc.method.problem.missing.tag.description", tagText), null); + LocalQuickFix fix = holder.removeTagWithoutDescriptionFix("@return"); + holder.problem(tag.getNameElement(), JavaBundle.message("inspection.javadoc.method.problem.missing.tag.description", tagText), fix); } } else if ("throws".equals(tag.getName()) || "exception".equals(tag.getName())) { if (emptyThrowsTag(tag)) { String tagText = "" + tag.getName() + ""; - holder.problem(tag.getNameElement(), JavaBundle.message("inspection.javadoc.method.problem.missing.tag.description", tagText), null); + PsiDocTagValue valueElement = tag.getValueElement(); + String tagTextForFix = "@" + tag.getName() + (valueElement != null ? " " + valueElement.getText() : ""); + LocalQuickFix fix = holder.removeTagWithoutDescriptionFix(tagTextForFix); + holder.problem(tag.getNameElement(), JavaBundle.message("inspection.javadoc.method.problem.missing.tag.description", tagText), fix); } } else if ("param".equals(tag.getName())) { PsiDocTagValue valueElement = tag.getValueElement(); if (valueElement != null && emptyParamTag(tag, valueElement)) { String tagText = "@param " + valueElement.getText() + ""; - holder.problem(valueElement, JavaBundle.message("inspection.javadoc.method.problem.missing.tag.description", tagText), null); + LocalQuickFix fix = holder.removeTagWithoutDescriptionFix("@param " + valueElement.getText()); + holder.problem(valueElement, JavaBundle.message("inspection.javadoc.method.problem.missing.tag.description", tagText), fix); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterException.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterException.java new file mode 100644 index 000000000000..582c5419d054 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterException.java @@ -0,0 +1,11 @@ +// "Remove '@exception IllegalArgumentException'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterExceptionWithoutParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterExceptionWithoutParams.java new file mode 100644 index 000000000000..c13492ebefd6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterExceptionWithoutParams.java @@ -0,0 +1,11 @@ +// "Remove '@exception'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterParam.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterParam.java new file mode 100644 index 000000000000..565b729f14d3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterParam.java @@ -0,0 +1,10 @@ +// "Remove '@param someInt'" "true" + +class Foo { + /** + * @return blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterReturn.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterReturn.java new file mode 100644 index 000000000000..f95a91844f05 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterReturn.java @@ -0,0 +1,10 @@ +// "Remove '@return'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrows.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrows.java new file mode 100644 index 000000000000..11380cb13b8f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrows.java @@ -0,0 +1,11 @@ +// "Remove '@throws IllegalArgumentException'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrowsWithoutParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrowsWithoutParams.java new file mode 100644 index 000000000000..61c62e4a31dc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/afterThrowsWithoutParams.java @@ -0,0 +1,11 @@ +// "Remove '@throws'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeException.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeException.java new file mode 100644 index 000000000000..c19305562211 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeException.java @@ -0,0 +1,12 @@ +// "Remove '@exception IllegalArgumentException'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + * @exception IllegalArgumentException + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeExceptionWithoutParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeExceptionWithoutParams.java new file mode 100644 index 000000000000..7c3a593769ec --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeExceptionWithoutParams.java @@ -0,0 +1,12 @@ +// "Remove '@exception'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + * @exception + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeParam.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeParam.java new file mode 100644 index 000000000000..458afaa271e9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeParam.java @@ -0,0 +1,11 @@ +// "Remove '@param someInt'" "true" + +class Foo { + /** + * @param someInt + * @return blah-blah-blah + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeReturn.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeReturn.java new file mode 100644 index 000000000000..06d3451f9ec0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeReturn.java @@ -0,0 +1,11 @@ +// "Remove '@return'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrows.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrows.java new file mode 100644 index 000000000000..6a538e78fbaf --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrows.java @@ -0,0 +1,12 @@ +// "Remove '@throws IllegalArgumentException'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + * @throws IllegalArgumentException + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrowsWithoutParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrowsWithoutParams.java new file mode 100644 index 000000000000..86ece5c171ed --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription/beforeThrowsWithoutParams.java @@ -0,0 +1,12 @@ +// "Remove '@throws'" "true" + +class Foo { + /** + * @param someInt blah-blah-blah + * @return blah-blah-blah + * @throws + */ + double foo(int someInt) { + return 3.14; + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/RemoveJavadocTagWithoutDescriptionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/RemoveJavadocTagWithoutDescriptionTest.java new file mode 100644 index 000000000000..e406df81c7c6 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/RemoveJavadocTagWithoutDescriptionTest.java @@ -0,0 +1,21 @@ +// Copyright 2000-2020 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.java.codeInsight.intention; + +import com.intellij.codeInsight.daemon.LightIntentionActionTestCase; +import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.javaDoc.JavaDocLocalInspection; +import org.jetbrains.annotations.NotNull; + +public class RemoveJavadocTagWithoutDescriptionTest extends LightIntentionActionTestCase { + @Override + protected LocalInspectionTool @NotNull [] configureLocalInspectionTools() { + return new LocalInspectionTool[]{ + new JavaDocLocalInspection() + }; + } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/removeJavadocTagWithoutDescription"; + } +}