diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java index 49379c2c4f3e..2a9fc2f4a79f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.scope.CompletionElement; import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor; import com.intellij.codeInsight.editorActions.wordSelection.DocTagSelectioner; +import com.intellij.codeInsight.javadoc.JavaDocUtil; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInspection.InspectionProfile; import com.intellij.codeInspection.SuppressionUtil; @@ -391,16 +392,19 @@ public class JavaDocCompletionContributor extends CompletionContributor { private static void shortenReferences(final Project project, final Editor editor, InsertionContext context, int offset) { PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument()); final PsiElement element = context.getFile().findElementAt(offset); - final PsiDocTagValue tagValue = PsiTreeUtil.getParentOfType(element, PsiDocTagValue.class); - if (tagValue != null) { - try { - JavaCodeStyleManager.getInstance(project).shortenClassReferences(tagValue); - } - catch (IncorrectOperationException e) { - LOG.error(e); + final PsiDocComment docComment = PsiTreeUtil.getParentOfType(element, PsiDocComment.class); + if (!JavaDocUtil.isInsidePackageInfo(docComment)) { + final PsiDocTagValue tagValue = PsiTreeUtil.getParentOfType(element, PsiDocTagValue.class); + if (tagValue != null) { + try { + JavaCodeStyleManager.getInstance(project).shortenClassReferences(tagValue); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } } + PsiDocumentManager.getInstance(context.getProject()).commitAllDocuments(); } - PsiDocumentManager.getInstance(context.getProject()).commitAllDocuments(); } } } diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java index 8a686f834958..2228b2628fa0 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.IncorrectOperationException; @@ -363,4 +364,8 @@ public class JavaDocUtil { return list == null ? PsiClassType.EMPTY_ARRAY : list.getReferencedTypes(); } + public static boolean isInsidePackageInfo(@Nullable PsiDocComment containingComment) { + return containingComment != null && containingComment.getOwner() == null && containingComment.getParent() instanceof PsiJavaFile; + } + } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 807b42d60383..c1893da7162e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.impl.source; +import com.intellij.codeInsight.javadoc.JavaDocUtil; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -162,7 +163,7 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme i == JavaDocElementType.DOC_REFERENCE_HOLDER || i == JavaDocElementType.DOC_TYPE_HOLDER) { PsiDocComment docComment = PsiTreeUtil.getParentOfType(this, PsiDocComment.class); - if (docComment != null && docComment.getOwner() == null && docComment.getParent() instanceof PsiJavaFile) { + if (JavaDocUtil.isInsidePackageInfo(docComment)) { return CLASS_FQ_OR_PACKAGE_NAME_KIND; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy index b966d5205776..2b4d4af70554 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.groovy @@ -229,6 +229,20 @@ class Foo { myFixture.assertPreferredCompletionItems 0, 'param', 'param param2' } + public void "test fqns in package info"() { + myFixture.configureByText "package-info.java", ''' +/** + * {@link java.util.Map#putA} + */ +''' + myFixture.complete(CompletionType.BASIC) + myFixture.checkResult ''' +/** + * {@link java.util.Map#putAll(java.util.Map)} + */ +''' + } + public void "test suggest same param descriptions"() { myFixture.configureByText "a.java", ''' class Foo { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspection.java index e79f9df5fa7d..25109cc5f26e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspection.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.style; +import com.intellij.codeInsight.javadoc.JavaDocUtil; import com.intellij.codeInspection.CleanupLocalInspectionTool; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.diagnostic.Logger; @@ -205,11 +206,8 @@ public class UnnecessaryFullyQualifiedNameInspection extends BaseInspection impl return; } final CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(reference.getProject()); - if (styleSettings.USE_FQ_CLASS_NAMES_IN_JAVADOC) { - final PsiElement containingComment = PsiTreeUtil.getParentOfType(reference, PsiDocComment.class); - if (containingComment != null) { - return; - } + if (acceptFullyQualifiedNamesInJavadoc(reference, styleSettings)) { + return; } final PsiFile containingFile = reference.getContainingFile(); if (!(containingFile instanceof PsiJavaFile)) { @@ -261,4 +259,14 @@ public class UnnecessaryFullyQualifiedNameInspection extends BaseInspection impl } } } + + public static boolean acceptFullyQualifiedNamesInJavadoc(PsiJavaCodeReferenceElement reference, CodeStyleSettings styleSettings) { + final PsiDocComment containingComment = PsiTreeUtil.getParentOfType(reference, PsiDocComment.class); + if (containingComment != null) { + if (styleSettings.USE_FQ_CLASS_NAMES_IN_JAVADOC || JavaDocUtil.isInsidePackageInfo(containingComment)) { + return true; + } + } + return false; + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_fully_qualified_name/test1/package-info.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_fully_qualified_name/test1/package-info.java new file mode 100644 index 000000000000..01825303d455 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/unnecessary_fully_qualified_name/test1/package-info.java @@ -0,0 +1,3 @@ +/** + * {@link java.util.Map(java.util.function.BiConsumer)} +*/ \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspectionTest.java index 6c5a89009735..2e1b839c85d3 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/style/UnnecessaryFullyQualifiedNameInspectionTest.java @@ -1,11 +1,22 @@ package com.siyeh.ig.style; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.siyeh.ig.IGInspectionTestCase; public class UnnecessaryFullyQualifiedNameInspectionTest extends IGInspectionTestCase { public void test() throws Exception { - doTest("com/siyeh/igtest/style/unnecessary_fully_qualified_name", - new UnnecessaryFullyQualifiedNameInspection()); + final CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(getProject()); + + boolean inJavadoc = styleSettings.USE_FQ_CLASS_NAMES_IN_JAVADOC; + try { + styleSettings.USE_FQ_CLASS_NAMES_IN_JAVADOC = false; + doTest("com/siyeh/igtest/style/unnecessary_fully_qualified_name", + new UnnecessaryFullyQualifiedNameInspection()); + } + finally { + styleSettings.USE_FQ_CLASS_NAMES_IN_JAVADOC = inJavadoc; + } } } diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/fqnames/FullyQualifiedNamePredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/fqnames/FullyQualifiedNamePredicate.java index 5342b62db4b9..b09afbb3d776 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/fqnames/FullyQualifiedNamePredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/fqnames/FullyQualifiedNamePredicate.java @@ -21,6 +21,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.ig.psiutils.ImportUtils; +import com.siyeh.ig.style.UnnecessaryFullyQualifiedNameInspection; import com.siyeh.ipp.base.PsiElementPredicate; class FullyQualifiedNamePredicate implements PsiElementPredicate { @@ -40,6 +41,11 @@ class FullyQualifiedNamePredicate implements PsiElementPredicate { if (PsiTreeUtil.getParentOfType(element, PsiImportStatementBase.class, PsiPackageStatement.class, JavaCodeFragment.class) != null) { return false; } + final Project project = element.getProject(); + final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(project); + if (UnnecessaryFullyQualifiedNameInspection.acceptFullyQualifiedNamesInJavadoc(referenceElement, codeStyleSettings)) { + return false; + } final PsiElement qualifier = referenceElement.getQualifier(); if (!(qualifier instanceof PsiJavaCodeReferenceElement)) { return false; @@ -50,8 +56,6 @@ class FullyQualifiedNamePredicate implements PsiElementPredicate { if (!(resolved instanceof PsiClass)) { return false; } - final Project project = element.getProject(); - final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(project); if (!codeStyleSettings.INSERT_INNER_CLASS_IMPORTS) { return false; }