[java] @see tag ref verification (IDEA-97635)

This commit is contained in:
Roman Shevchenko
2016-03-09 13:28:11 +01:00
parent 4176064485
commit 77a63a0eea
4 changed files with 30 additions and 2 deletions

View File

@@ -15,7 +15,8 @@
*/
package com.intellij.codeInspection.javaDoc;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.reference.RefJavaUtil;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.project.Project;
@@ -23,7 +24,9 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.javadoc.PsiDocParamRef;
import com.intellij.psi.impl.source.tree.JavaDocElementType;
import com.intellij.psi.javadoc.*;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
@@ -39,6 +42,8 @@ import java.util.stream.Stream;
public class JavadocHighlightUtil {
private static final String[] TAGS_TO_CHECK = {"author", "version", "since"};
private static final Set<String> UNIQUE_TAGS = ContainerUtil.newHashSet("return", "deprecated", "serial", "serialData");
private static final TokenSet SEE_TAG_REFS = TokenSet.create(
JavaDocElementType.DOC_REFERENCE_HOLDER, JavaDocElementType.DOC_METHOD_OR_FIELD_REF);
public interface ProblemHolder {
Project project();
@@ -181,7 +186,18 @@ public class JavadocHighlightUtil {
}
}
checkInlineTags(tag.getDataElements(), holder);
PsiElement[] dataElements = tag.getDataElements();
if ("see".equals(tagName)) {
if (dataElements.length == 0 || dataElements.length == 1 && empty(dataElements[0])) {
holder.problem(tag.getNameElement(), InspectionsBundle.message("inspection.javadoc.problem.see.tag.expecting.ref"), null);
}
else if (!SEE_TAG_REFS.contains(dataElements[0].getNode().getElementType())) {
holder.problem(dataElements[0], InspectionsBundle.message("inspection.javadoc.problem.see.tag.expecting.ref"), null);
}
}
checkInlineTags(dataElements, holder);
}
}

View File

@@ -0,0 +1,10 @@
/**
* <warning descr="Class or method reference is expected after @see tag">@see</warning>
* @see <warning descr="Class or method reference is expected after @see tag">{@link C}</warning> clarification
*
* @see C a correct one
* @see C#f
*/
class C {
int f;
}

View File

@@ -67,6 +67,7 @@ public class JavadocHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testSee5() { doTest(); }
public void testLinkToItself() { doTest(); }
public void testSeeConstants() { doTest(); }
public void testSeeNonRefs() { doTest(); }
public void testReturn0() { doTest(); }
public void testException0() { doTest(); }
public void testException1() { doTest(); }

View File

@@ -271,6 +271,7 @@ inspection.javadoc.problem.descriptor=Required Javadoc is absent
inspection.javadoc.problem.descriptor1=Period in the documentation is missing. The period is used by the Javadoc tool to generate the comment for the overview page
inspection.javadoc.problem.missing.tag=Required tag {0} is missing
inspection.javadoc.problem.missing.tag.description={0} is missing after @{1} tag
inspection.javadoc.problem.see.tag.expecting.ref=Class or method reference is expected after @see tag
inspection.javadoc.problem.cannot.resolve=Cannot resolve symbol {0}
inspection.javadoc.problem.name.expected=Name expected
inspection.javadoc.problem.wrong.tag=Wrong tag {0}