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";
+ }
+}