From f0714e94073f7cd51a63013718512b8a41f6b0fe Mon Sep 17 00:00:00 2001 From: Mathias Date: Wed, 26 Nov 2025 16:54:31 +0100 Subject: [PATCH] IDEA-380337 javadoc: Fix broken rendered jdoc This commit also fixes broken links in nested classes GitOrigin-RevId: 44443df5abd7646168124452ad25679e6570166d --- .../codeInsight/javadoc/JavaDocUtil.java | 16 ++++++++++------ .../codeInsight/javadocIG/linkNested.html | 1 + .../codeInsight/javadocIG/linkNested.java | 8 ++++++++ .../javadocIG/markdownReferenceLink.html | 2 +- .../javadocIG/markdownReferenceLink.java | 2 ++ .../javadoc/JavaDocInfoGeneratorTest.java | 4 ++++ 6 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/javadocIG/linkNested.html create mode 100644 java/java-tests/testData/codeInsight/javadocIG/linkNested.java 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 ad10352c9aac..f8931046108b 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 @@ -115,12 +115,15 @@ public final class JavaDocUtil { PsiClass aClass = classRef.isEmpty() ? PsiTreeUtil.getParentOfType(context, PsiClass.class, false) : findClassFromRef(manager, facade, classRef, context); - if (aClass == null) return null; - if (fragmentIndex >= 0) { - return findFragmentOwner(aClass, useNavigationElement, refTextCorrected, fragmentIndex, manager); - } else { - return findReference(aClass, useNavigationElement, refTextCorrected, poundIndex); + while (aClass != null){ + PsiElement reference = fragmentIndex >= 0 + ? findFragmentOwner(aClass, useNavigationElement, refTextCorrected, fragmentIndex, manager) + : findReference(aClass, context, useNavigationElement, refTextCorrected, poundIndex); + if (reference != null) return reference; + + aClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class, true); } + return null; } } @@ -141,10 +144,11 @@ public final class JavaDocUtil { } private static @Nullable PsiElement findReference(@NotNull PsiClass refClass, + PsiElement context, boolean useNavigationElement, String refTextCorrected, int poundIndex) { - PsiElement member = findReferencedMember(refClass, refTextCorrected.substring(poundIndex + 1), refClass); + PsiElement member = findReferencedMember(refClass, refTextCorrected.substring(poundIndex + 1), context); return useNavigationElement && member != null ? member.getNavigationElement() : member; } diff --git a/java/java-tests/testData/codeInsight/javadocIG/linkNested.html b/java/java-tests/testData/codeInsight/javadocIG/linkNested.html new file mode 100644 index 000000000000..129a56239390 --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/linkNested.html @@ -0,0 +1 @@ +
 Outside.Inside
void inside()
outside()
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/linkNested.java b/java/java-tests/testData/codeInsight/javadocIG/linkNested.java new file mode 100644 index 000000000000..498c7540a8d6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/javadocIG/linkNested.java @@ -0,0 +1,8 @@ +class Outside { + void outside(){} + + class Inside { + /// [#outside()] + void inside(){} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.html b/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.html index ffec93af1346..e71c87cddeae 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.html +++ b/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.html @@ -1 +1 @@ -
class MarkdownCodeBlock

java.util.HashMap

The default empty collection

\ No newline at end of file +
class MarkdownCodeBlock

java.util.HashMap

The default empty collection

Test for context resolution

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.java b/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.java index b213d6657582..3f7a22656621 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.java +++ b/java/java-tests/testData/codeInsight/javadocIG/markdownReferenceLink.java @@ -3,4 +3,6 @@ /// [java.util.HashMap] /// /// [The default empty collection][java.util.Collections#EMPTY_LIST] +/// +/// [Test for context resolution][java.util.Collection#add(Object)] class MarkdownCodeBlock {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java index 04dba31c97f9..329b2b348a11 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java @@ -125,6 +125,10 @@ public class JavaDocInfoGeneratorTest extends JavaCodeInsightTestCase { public void testLegacySpacesInLiteral() { useJava7(); verifyJavaDoc(getTestClass()); } public void testLinkWithModule() { doTestClass(); } public void testLinkToModule() { doTestClass(); } + public void testLinkNested() { + configureByFile(); + verifyJavaDoc(getTestClass().getAllInnerClasses()[0].getMethods()[0]); + } public void testLinkWithLineBreak() { doTestClass(); } public void testDocumentationForJdkClassWithReferencesToClassesFromJavaLang() { useJava7(); doTestAtCaret(); } public void testDocumentationForUncheckedExceptionsInSupers() { useJava7(); doTestAtCaret(); }