From a8695ad7d5584d7fa5e8ab533b9de74ad5a32f79 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sat, 5 Oct 2013 13:18:54 +0200 Subject: [PATCH] IDEA-114069 (Add 'no package Javadoc' inspection) --- .../javaDoc/JavaDocLocalInspection.java | 235 +++++++++++------- .../missedThrowsTag/expected.xml | 21 +- .../packageInfo/expected.xml | 26 ++ .../packageInfo/src/a/b/package-info.java | 2 + .../packageInfo/src/a/c/d/package-info.java | 4 + .../packageInfo/src/a/c/package-info.java | 4 + .../packageInfo/src/a/package-info.java | 1 + .../codeInspection/JavaDocInspectionTest.java | 8 + .../src/messages/InspectionsBundle.properties | 1 + 9 files changed, 198 insertions(+), 104 deletions(-) create mode 100644 java/java-tests/testData/inspection/javaDocInspection/packageInfo/expected.xml create mode 100644 java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/b/package-info.java create mode 100644 java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/d/package-info.java create mode 100644 java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/package-info.java create mode 100644 java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/package-info.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 02175288be23..fc3cdd0b6fc7 100644 --- a/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspection.java @@ -94,6 +94,7 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } } + @NonNls public Options PACKAGE_OPTIONS = new Options("none", ""); @NonNls public Options TOP_LEVEL_CLASS_OPTIONS = new Options("none", ""); @NonNls public Options INNER_CLASS_OPTIONS = new Options("none", ""); @NonNls public Options METHOD_OPTIONS = new Options("none", "@return@param@throws or @exception"); @@ -225,7 +226,12 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { GridBagConstraints gc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1, 0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0),0,0 ); add(createAdditionalJavadocTagsPanel(), gc); JTabbedPane tabs = new JBTabbedPane(SwingConstants.BOTTOM); - @NonNls String[] tags = new String[]{"@author", "@version", "@since", "@param"}; + @NonNls String[] tags; + tags = new String[]{"@author", "@version", "@since"}; + tabs.add(InspectionsBundle.message("inspection.javadoc.option.tab.title.package"), createOptionsPanel(new String[]{NONE, PUBLIC}, + tags,PACKAGE_OPTIONS)); + + tags = new String[]{"@author", "@version", "@since", "@param"}; tabs.add(InspectionsBundle.message("inspection.javadoc.option.tab.title"), createOptionsPanel(new String[]{NONE, PUBLIC, PACKAGE_LOCAL}, tags, TOP_LEVEL_CLASS_OPTIONS)); @@ -368,22 +374,19 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); try { - final PsiDocCommentOwner owner = PsiTreeUtil.getParentOfType(descriptor.getEndElement(), PsiDocCommentOwner.class); - if (owner != null) { - if (!CodeInsightUtil.preparePsiElementsForWrite(owner)) return; - final PsiDocComment docComment = owner.getDocComment(); + final PsiDocComment docComment = PsiTreeUtil.getParentOfType(descriptor.getEndElement(), PsiDocComment.class); + if (docComment != null) { + if (!CodeInsightUtil.preparePsiElementsForWrite(docComment)) return; final PsiDocTag tag = factory.createDocTagFromText("@" + myTag + " " + myValue); - if (docComment != null) { - PsiElement addedTag; - final PsiElement anchor = getAnchor(descriptor); - if (anchor != null) { - addedTag = docComment.addBefore(tag, anchor); - } - else { - addedTag = docComment.add(tag); - } - moveCaretTo(addedTag); + PsiElement addedTag; + final PsiElement anchor = getAnchor(descriptor); + if (anchor != null) { + addedTag = docComment.addBefore(tag, anchor); } + else { + addedTag = docComment.add(tag); + } + moveCaretTo(addedTag); } } catch (IncorrectOperationException e) { @@ -415,6 +418,55 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { return InspectionsBundle.message("inspection.javadoc.problem.add.tag.family"); } } + + @Nullable + @Override + public ProblemDescriptor[] checkFile(@NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) { + if (!PsiPackage.PACKAGE_INFO_FILE.equals(file.getName()) || !(file instanceof PsiJavaFile)) { + return null; + } + final PsiDocComment docComment = PsiTreeUtil.getChildOfType(file, PsiDocComment.class); + final JavaDirectoryService directoryService = JavaDirectoryService.getInstance(); + final PsiDirectory directory = file.getContainingDirectory(); + final PsiPackage aPackage = directoryService.getPackage(directory); + if (IGNORE_DEPRECATED && aPackage != null) { + final PsiModifierList modifierList = aPackage.getModifierList(); + if (modifierList != null && modifierList.findAnnotation("java.lang.Deprecated") != null) { + return null; + } + } + final PsiJavaFile javaFile = (PsiJavaFile)file; + final PsiPackageStatement packageStatement = javaFile.getPackageStatement(); + final PsiElement elementToHighlight = packageStatement != null ? packageStatement : file; + + final boolean required = isJavaDocRequired(aPackage); + if (docComment != null) { + if (IGNORE_DEPRECATED && docComment.findTagByName("deprecated") != null) { + return null; + } + } + else { + return required + ? new ProblemDescriptor[]{createDescriptor(elementToHighlight, REQUIRED_JAVADOC_IS_ABSENT, manager, isOnTheFly)} + : null; + } + + final PsiDocTag[] tags = docComment.getTags(); + final ArrayList problems = + getRequiredTagProblems(aPackage, docComment.getFirstChild(), tags, manager, isOnTheFly, required); + final ArrayList tagProblems = getTagValuesProblems(aPackage, tags, manager, isOnTheFly); + if (tagProblems != null) { + problems.addAll(tagProblems); + } + checkInlineTags(manager, problems, docComment.getDescriptionElements(), + JavadocManager.SERVICE.getInstance(docComment.getProject()), isOnTheFly); + checkForPeriodInDoc(aPackage, docComment, problems, manager, isOnTheFly); + checkForBadCharacters(docComment, problems, manager, isOnTheFly); + return problems.isEmpty() + ? null + : problems.toArray(new ProblemDescriptor[problems.size()]); + } + @Override @Nullable public ProblemDescriptor[] checkClass(@NotNull PsiClass psiClass, @NotNull InspectionManager manager, boolean isOnTheFly) { @@ -435,59 +487,16 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } PsiDocTag[] tags = docComment.getTags(); - @NonNls String[] tagsToCheck = {"author", "version", "since"}; - @NonNls String[] absentDescriptionKeys = { - "inspection.javadoc.problem.missing.author.description", - "inspection.javadoc.problem.missing.version.description", - "inspection.javadoc.problem.missing.since.description"}; - final ArrayList problems = new ArrayList(2); - if (required) { - boolean[] isTagRequired = new boolean[tagsToCheck.length]; - boolean[] isTagPresent = new boolean[tagsToCheck.length]; - - boolean someTagsAreRequired = false; - for (int i = 0; i < tagsToCheck.length; i++) { - final String tag = tagsToCheck[i]; - someTagsAreRequired |= isTagRequired[i] = isTagRequired(psiClass, tag); - } - - if (someTagsAreRequired) { - for (PsiDocTag tag : tags) { - String tagName = tag.getName(); - for (int i = 0; i < tagsToCheck.length; i++) { - final String tagToCheck = tagsToCheck[i]; - if (tagToCheck.equals(tagName)) { - isTagPresent[i] = true; - } - } - } - } - - for (int i = 0; i < tagsToCheck.length; i++) { - final String tagToCheck = tagsToCheck[i]; - if (isTagRequired[i] && !isTagPresent[i]) { - problems.add(createMissingTagDescriptor(elementToHighlight, tagToCheck, manager, isOnTheFly)); - } - } - } + final ArrayList problems = getRequiredTagProblems(psiClass, docComment.getFirstChild(), tags, manager, isOnTheFly, required); ArrayList tagProblems = getTagValuesProblems(psiClass, tags, manager, isOnTheFly); if (tagProblems != null) { problems.addAll(tagProblems); } - checkForPeriodInDoc(docComment, problems, manager, isOnTheFly); + checkForPeriodInDoc(psiClass, docComment, problems, manager, isOnTheFly); checkInlineTags(manager, problems, docComment.getDescriptionElements(), JavadocManager.SERVICE.getInstance(docComment.getProject()), isOnTheFly); checkForBadCharacters(docComment, problems, manager, isOnTheFly); - for (PsiDocTag tag : tags) { - for (int i = 0; i < tagsToCheck.length; i++) { - final String tagToCheck = tagsToCheck[i]; - if (tagToCheck.equals(tag.getName()) && extractTagDescription(tag).length() == 0) { - problems.add(createDescriptor(elementToHighlight, InspectionsBundle.message(absentDescriptionKeys[i]), manager, isOnTheFly)); - } - } - } - checkDuplicateTags(tags, problems, manager, isOnTheFly); if (required && isTagRequired(psiClass, "param") && psiClass.hasTypeParameters() && nameIdentifier != null) { @@ -511,6 +520,56 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { : problems.toArray(new ProblemDescriptor[problems.size()]); } + private ArrayList getRequiredTagProblems(PsiElement context, + PsiElement elementToHighlight, + PsiDocTag[] tags, + InspectionManager manager, boolean isOnTheFly, boolean required) { + @NonNls String[] tagsToCheck = {"author", "version", "since"}; + @NonNls String[] absentDescriptionKeys = { + "inspection.javadoc.problem.missing.author.description", + "inspection.javadoc.problem.missing.version.description", + "inspection.javadoc.problem.missing.since.description"}; + final ArrayList problems = new ArrayList(2); + if (required) { + boolean[] isTagRequired = new boolean[tagsToCheck.length]; + boolean[] isTagPresent = new boolean[tagsToCheck.length]; + + boolean someTagsAreRequired = false; + for (int i = 0; i < tagsToCheck.length; i++) { + final String tag = tagsToCheck[i]; + someTagsAreRequired |= isTagRequired[i] = isTagRequired(context, tag); + } + + if (someTagsAreRequired) { + for (PsiDocTag tag : tags) { + String tagName = tag.getName(); + for (int i = 0; i < tagsToCheck.length; i++) { + final String tagToCheck = tagsToCheck[i]; + if (tagToCheck.equals(tagName)) { + isTagPresent[i] = true; + } + } + } + } + + for (int i = 0; i < tagsToCheck.length; i++) { + final String tagToCheck = tagsToCheck[i]; + if (isTagRequired[i] && !isTagPresent[i]) { + problems.add(createMissingTagDescriptor(elementToHighlight, tagToCheck, manager, isOnTheFly)); + } + } + } + for (PsiDocTag tag : tags) { + for (int i = 0; i < tagsToCheck.length; i++) { + final String tagToCheck = tagsToCheck[i]; + if (tagToCheck.equals(tag.getName()) && extractTagDescription(tag).isEmpty()) { + problems.add(createDescriptor(tag.getNameElement(), InspectionsBundle.message(absentDescriptionKeys[i]), manager, isOnTheFly)); + } + } + } + return problems; + } + private static ProblemDescriptor createMissingParamTagDescriptor(final PsiIdentifier nameIdentifier, final PsiTypeParameter psiTypeParameter, final InspectionManager manager, boolean isOnTheFly) { @@ -540,7 +599,7 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } checkInlineTags(manager, problems, docComment.getDescriptionElements(), JavadocManager.SERVICE.getInstance(docComment.getProject()), isOnTheFly); - checkForPeriodInDoc(docComment, problems, manager, isOnTheFly); + checkForPeriodInDoc(psiField, docComment, problems, manager, isOnTheFly); checkDuplicateTags(docComment.getTags(), problems, manager, isOnTheFly); checkForBadCharacters(docComment, problems, manager, isOnTheFly); return problems.isEmpty() @@ -632,18 +691,12 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { if (required && isReturnRequired && isReturnAbsent) { - final PsiIdentifier psiIdentifier = psiMethod.getNameIdentifier(); - if (psiIdentifier != null) { - problems.add(createMissingTagDescriptor(psiIdentifier, "return", manager, isOnTheFly)); - } + problems.add(createMissingTagDescriptor(docComment.getFirstChild(), "return", manager, isOnTheFly)); } if (absentParameters != null) { for (PsiParameter psiParameter : absentParameters) { - final PsiIdentifier nameIdentifier = psiMethod.getNameIdentifier(); - if (nameIdentifier != null) { - problems.add(createMissingParamTagDescriptor(nameIdentifier, psiParameter, manager, isOnTheFly)); - } + problems.add(createMissingParamTagDescriptor(docComment.getFirstChild(), psiParameter, manager, isOnTheFly)); } } @@ -686,7 +739,7 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { processThrowsTags(tags, declaredExceptions, manager, problems, isOnTheFly); if (!declaredExceptions.isEmpty()) { for (PsiClassType declaredException : declaredExceptions.keySet()) { - problems.add(createMissingThrowsTagDescriptor(psiMethod, manager, declaredException, isOnTheFly)); + problems.add(createMissingThrowsTagDescriptor(docComment.getFirstChild(), manager, declaredException, isOnTheFly)); } } } @@ -696,7 +749,7 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { problems.addAll(tagProblems); } - checkForPeriodInDoc(docComment, problems, manager, isOnTheFly); + checkForPeriodInDoc(psiMethod, docComment, problems, manager, isOnTheFly); checkForBadCharacters(docComment, problems, manager, isOnTheFly); for (PsiDocTag tag : tags) { if ("param".equals(tag.getName())) { @@ -782,23 +835,22 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } @Nullable - private static ProblemDescriptor createMissingThrowsTagDescriptor(final PsiMethod method, + private static ProblemDescriptor createMissingThrowsTagDescriptor(final PsiElement elementToHighlight, final InspectionManager manager, final PsiClassType exceptionClassType, boolean isOnTheFly) { @NonNls String tag = "throws"; String message = InspectionsBundle.message("inspection.javadoc.problem.missing.tag", "@" + tag + " " + exceptionClassType.getCanonicalText()); final String firstDeclaredException = exceptionClassType.getCanonicalText(); - final PsiIdentifier nameIdentifier = method.getNameIdentifier(); - return nameIdentifier != null ? createDescriptor(nameIdentifier, message,new AddMissingTagFix(tag, firstDeclaredException), manager, - isOnTheFly) : null; + return createDescriptor(elementToHighlight, message, new AddMissingTagFix(tag, firstDeclaredException), manager, isOnTheFly); } private static ProblemDescriptor createMissingTagDescriptor(PsiElement elementToHighlight, @NonNls String tag, final InspectionManager manager, boolean isOnTheFly) { String message = InspectionsBundle.message("inspection.javadoc.problem.missing.tag", "@" + tag + ""); - return createDescriptor(elementToHighlight, message,new AddMissingTagFix(tag), manager, isOnTheFly); + return createDescriptor(elementToHighlight, message, new AddMissingTagFix(tag), manager, isOnTheFly); } + private static ProblemDescriptor createMissingParamTagDescriptor(PsiElement elementToHighlight, PsiParameter param, final InspectionManager manager, boolean isOnTheFly) { @@ -928,7 +980,8 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { }); } - private void checkForPeriodInDoc(PsiDocComment docComment, + private void checkForPeriodInDoc(PsiElement context, + PsiDocComment docComment, ArrayList problems, InspectionManager manager, boolean onTheFly) { if (IGNORE_JAVADOC_PERIOD) return; @@ -936,11 +989,10 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { int dotIndex = docComment.getText().indexOf('.'); int tagOffset = 0; if (dotIndex >= 0) { //need to find first valid tag - final PsiDocCommentOwner owner = PsiTreeUtil.getParentOfType(docComment, PsiDocCommentOwner.class); for (PsiDocTag tag : tags) { final String tagName = tag.getName(); final JavadocTagInfo tagInfo = JavadocManager.SERVICE.getInstance(tag.getProject()).getTagInfo(tagName); - if (tagInfo != null && tagInfo.isValidInContext(owner) && !tagInfo.isInline()) { + if (tagInfo != null && tagInfo.isValidInContext(context) && !tagInfo.isInline()) { tagOffset = tag.getTextOffset(); break; } @@ -956,23 +1008,21 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { } @Nullable - private ArrayList getTagValuesProblems(PsiDocCommentOwner context, PsiDocTag[] tags, InspectionManager inspectionManager, + private ArrayList getTagValuesProblems(PsiElement context, PsiDocTag[] tags, InspectionManager inspectionManager, boolean isOnTheFly) { final ArrayList problems = new ArrayList(2); - nextTag: for (PsiDocTag tag : tags) { final JavadocManager manager = JavadocManager.SERVICE.getInstance(tag.getProject()); String tagName = tag.getName(); JavadocTagInfo tagInfo = manager.getTagInfo(tagName); if (tagInfo == null || !tagInfo.isValidInContext(context)) { - if (checkTagInfo(inspectionManager, tagInfo, tag, isOnTheFly, problems)) continue nextTag; + if (checkTagInfo(inspectionManager, tagInfo, tag, isOnTheFly, problems)) continue; } PsiDocTagValue value = tag.getValueElement(); - final JavadocTagInfo info = manager.getTagInfo(tagName); - if (info != null && !info.isValidInContext(context)) continue; - String message = info == null ? null : info.checkTagValue(value); + if (tagInfo != null && !tagInfo.isValidInContext(context)) continue; + String message = tagInfo == null ? null : tagInfo.checkTagValue(value); final PsiReference reference = value != null ? value.getReference() : null; if (message == null && reference != null) { @@ -990,9 +1040,10 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { if (message != null) { final PsiDocTagValue valueElement = tag.getValueElement(); if (valueElement == null){ - problems.add(inspectionManager.createProblemDescriptor(tag, InspectionsBundle.message("inspection.javadoc.method.problem.missing.tag.description", "" + tag.getName() + ""), null, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - isOnTheFly, true)); - } else { + problems.add(inspectionManager.createProblemDescriptor(tag, InspectionsBundle.message( + "inspection.javadoc.method.problem.missing.tag.description", "" + tag.getName() + ""), (LocalQuickFix)null, + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, isOnTheFly)); } + else { problems.add(createDescriptor(valueElement, message, inspectionManager, isOnTheFly)); } } @@ -1059,6 +1110,10 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { @SuppressWarnings({"SimplifiableIfStatement"}) private boolean isTagRequired(PsiElement context, @NonNls String tag) { + if (context instanceof PsiPackage) { + return isTagRequired(PACKAGE_OPTIONS, tag); + } + if (context instanceof PsiClass) { if (PsiTreeUtil.getParentOfType(context, PsiClass.class) != null) { return isTagRequired(INNER_CLASS_OPTIONS, tag); @@ -1085,6 +1140,10 @@ public class JavaDocLocalInspection extends BaseLocalInspectionTool { private boolean isJavaDocRequired(PsiModifierListOwner psiElement) { final RefJavaUtil refUtil = RefJavaUtil.getInstance(); int actualAccess = getAccessNumber(refUtil.getAccessModifier(psiElement)); + if (psiElement instanceof PsiPackage) { + return 1 <= getAccessNumber(PACKAGE_OPTIONS.ACCESS_JAVADOC_REQUIRED_FOR); + } + if (psiElement instanceof PsiClass) { PsiClass psiClass = (PsiClass)psiElement; if (PsiTreeUtil.getParentOfType(psiClass, PsiClass.class) != null) { diff --git a/java/java-tests/testData/inspection/javaDocInspection/missedThrowsTag/expected.xml b/java/java-tests/testData/inspection/javaDocInspection/missedThrowsTag/expected.xml index 7a13959edff4..a5402a7cfad1 100644 --- a/java/java-tests/testData/inspection/javaDocInspection/missedThrowsTag/expected.xml +++ b/java/java-tests/testData/inspection/javaDocInspection/missedThrowsTag/expected.xml @@ -1,20 +1,9 @@ - Test.java - 5 - - - void foo() - foo() - <default> - - Test - Test - - - Declaration has javadoc problems - Required tag <code>@throws</code> java.io.IOException is missing - + Test.java + 2 + Declaration has Javadoc problems + Required tag <code>@throws</code> java.io.IOException is missing + - diff --git a/java/java-tests/testData/inspection/javaDocInspection/packageInfo/expected.xml b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/expected.xml new file mode 100644 index 000000000000..72980758b4d2 --- /dev/null +++ b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/expected.xml @@ -0,0 +1,26 @@ + + + + package-info.java + 2 + a.c.d + Declaration has Javadoc problems + Author is missing after @author tag + + + + package-info.java + 1 + a.c + Declaration has Javadoc problems + Required tag <code>@author</code> is missing + + + + package-info.java + 1 + a + Declaration has Javadoc problems + Required Javadoc is absent + + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/b/package-info.java b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/b/package-info.java new file mode 100644 index 000000000000..256624de629d --- /dev/null +++ b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/b/package-info.java @@ -0,0 +1,2 @@ +@Deprecated +package a.b; \ No newline at end of file diff --git a/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/d/package-info.java b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/d/package-info.java new file mode 100644 index 000000000000..444a834942e7 --- /dev/null +++ b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/d/package-info.java @@ -0,0 +1,4 @@ +/** + * @author + */ +package a.c.d; diff --git a/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/package-info.java b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/package-info.java new file mode 100644 index 000000000000..b22d0bc455ed --- /dev/null +++ b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/c/package-info.java @@ -0,0 +1,4 @@ +/** + * + */ +package a.c; \ No newline at end of file diff --git a/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/package-info.java b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/package-info.java new file mode 100644 index 000000000000..b47ad045fb2e --- /dev/null +++ b/java/java-tests/testData/inspection/javaDocInspection/packageInfo/src/a/package-info.java @@ -0,0 +1 @@ +package a; \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/JavaDocInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/JavaDocInspectionTest.java index f508a2764def..0e5e20e3212f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/JavaDocInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/JavaDocInspectionTest.java @@ -70,4 +70,12 @@ public class JavaDocInspectionTest extends InspectionTestCase { inspection.setIgnoreSimpleAccessors(true); doTest("javaDocInspection/" + getTestName(true), inspection); } + + public void testPackageInfo() throws Exception { + final JavaDocLocalInspection inspection = new JavaDocLocalInspection(); + inspection.IGNORE_DEPRECATED = true; + inspection.PACKAGE_OPTIONS.ACCESS_JAVADOC_REQUIRED_FOR = "public"; + inspection.PACKAGE_OPTIONS.REQUIRED_TAGS = "@author"; + doTest("javaDocInspection/" + getTestName(true), inspection); + } } diff --git a/platform/platform-resources-en/src/messages/InspectionsBundle.properties b/platform/platform-resources-en/src/messages/InspectionsBundle.properties index 0c284661db0d..727dfc8616b6 100644 --- a/platform/platform-resources-en/src/messages/InspectionsBundle.properties +++ b/platform/platform-resources-en/src/messages/InspectionsBundle.properties @@ -248,6 +248,7 @@ inspection.actiongo.prev=Go Prev Problem inspection.javadoc.display.name=Declaration has Javadoc problems inspection.javadoc.ref.display.name=Declaration has problems in Javadoc references +inspection.javadoc.option.tab.title.package=Package inspection.javadoc.option.tab.title=Class inspection.javadoc.option.tab.title.method=Method inspection.javadoc.option.tab.title.field=Field