Single liner code block:
Hello world
No tags are interpreted inside them
{@link java.lang.String niceLink}
No markdown markup is interpreted inside them
- _Hello_ <code>
This is a broken inline link - `Start of broken link
end of broken link`diff --git a/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/BasicJavaElementTypeConverter.kt b/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/BasicJavaElementTypeConverter.kt index 97812fa914e8..3f2f1854ef2b 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/BasicJavaElementTypeConverter.kt +++ b/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/BasicJavaElementTypeConverter.kt @@ -297,4 +297,5 @@ val BasicJavaElementTypeConverter: ElementTypeConverter = elementTypeConverterOf JavaDocSyntaxElementType.DOC_MARKDOWN_CODE_BLOCK to BasicJavaDocElementType.BASIC_DOC_MARKDOWN_CODE_BLOCK, JavaDocSyntaxElementType.DOC_MARKDOWN_REFERENCE_LINK to BasicJavaDocElementType.BASIC_DOC_MARKDOWN_REFERENCE_LINK, + JavaDocSyntaxElementType.DOC_MARKDOWN_REFERENCE_LABEL to BasicJavaDocElementType.BASIC_DOC_MARKDOWN_REFERENCE_LABEL, ) diff --git a/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/AbstractBasicJavaDocElementTypeFactory.java b/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/AbstractBasicJavaDocElementTypeFactory.java index af2760702e78..afae118763c0 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/AbstractBasicJavaDocElementTypeFactory.java +++ b/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/AbstractBasicJavaDocElementTypeFactory.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl.source; import com.intellij.psi.tree.IElementType; @@ -39,6 +39,8 @@ public abstract class AbstractBasicJavaDocElementTypeFactory { public final IElementType DOC_MARKDOWN_REFERENCE_LINK; + public final IElementType DOC_MARKDOWN_REFERENCE_LABEL; + public JavaDocElementTypeContainer(IElementType DOC_TAG, IElementType DOC_COMMENT, IElementType DOC_SNIPPET_TAG, @@ -54,7 +56,8 @@ public abstract class AbstractBasicJavaDocElementTypeFactory { IElementType DOC_TYPE_HOLDER, IElementType DOC_PARAMETER_REF, IElementType DOC_MARKDOWN_CODE_BLOCK, - IElementType DOC_MARKDOWN_REFERENCE_LINK) { + IElementType DOC_MARKDOWN_REFERENCE_LINK, + IElementType DOC_MARKDOWN_REFERENCE_LABEL) { this.DOC_TAG = DOC_TAG; this.DOC_COMMENT = DOC_COMMENT; this.DOC_SNIPPET_TAG = DOC_SNIPPET_TAG; @@ -71,6 +74,7 @@ public abstract class AbstractBasicJavaDocElementTypeFactory { this.DOC_PARAMETER_REF = DOC_PARAMETER_REF; this.DOC_MARKDOWN_CODE_BLOCK = DOC_MARKDOWN_CODE_BLOCK; this.DOC_MARKDOWN_REFERENCE_LINK = DOC_MARKDOWN_REFERENCE_LINK; + this.DOC_MARKDOWN_REFERENCE_LABEL = DOC_MARKDOWN_REFERENCE_LABEL; } } diff --git a/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/BasicJavaDocElementType.java b/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/BasicJavaDocElementType.java index 259d5440483f..413d0507662a 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/BasicJavaDocElementType.java +++ b/java/java-frontback-psi-impl/src/com/intellij/psi/impl/source/BasicJavaDocElementType.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl.source; import com.intellij.java.syntax.element.JavaDocSyntaxElementType; @@ -50,6 +50,7 @@ public interface BasicJavaDocElementType { IElementType BASIC_DOC_COMMENT = new IJavaDocElementType("DOC_COMMENT"); IElementType BASIC_DOC_MARKDOWN_CODE_BLOCK = new IJavaDocElementType("DOC_CODE_BLOCK"); IElementType BASIC_DOC_MARKDOWN_REFERENCE_LINK = new IJavaDocElementType("DOC_REFERENCE_LINK"); + IElementType BASIC_DOC_MARKDOWN_REFERENCE_LABEL = new IJavaDocElementType("DOC_REFERENCE_LABEL"); ParentAwareTokenSet BASIC_ALL_JAVADOC_ELEMENTS = ParentAwareTokenSet.create( BASIC_DOC_TAG, BASIC_DOC_INLINE_TAG, BASIC_DOC_METHOD_OR_FIELD_REF, BASIC_DOC_PARAMETER_REF, BASIC_DOC_TAG_VALUE_ELEMENT, diff --git a/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavadocParsingTest.java b/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavadocParsingTest.java index 31e3b07ba3b9..7aef9395fcc8 100644 --- a/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavadocParsingTest.java +++ b/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavadocParsingTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2017 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. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.parser; import com.intellij.pom.java.LanguageLevel; @@ -220,6 +220,7 @@ public abstract class AbstractBasicJavadocParsingTest extends AbstractBasicJavaP public void testReferenceLinkMarkdown09() { doTest(true); } public void testReferenceLinkMarkdown10() { doTest(true); } public void testReferenceLinkMarkdown11() { doTest(true); } + public void testReferenceLinkMarkdown12() { doTest(true); } public void testMarkdownWithDocCommentBeforeMarkdown() { setLanguageLevel(LanguageLevel.JDK_21); diff --git a/java/java-psi-api/src/com/intellij/psi/JavaElementVisitor.java b/java/java-psi-api/src/com/intellij/psi/JavaElementVisitor.java index a7099db769c8..ea32521a3ec9 100644 --- a/java/java-psi-api/src/com/intellij/psi/JavaElementVisitor.java +++ b/java/java-psi-api/src/com/intellij/psi/JavaElementVisitor.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi; import com.intellij.psi.javadoc.*; @@ -253,6 +253,10 @@ public abstract class JavaElementVisitor extends PsiElementVisitor { visitElement(block); } + public void visitMarkdownReferenceLabel(@NotNull PsiMarkdownReferenceLabel label) { + visitElement(label); + } + public void visitMarkdownReferenceLink(@NotNull PsiMarkdownReferenceLink referenceLink) { visitElement(referenceLink); } diff --git a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLabel.java b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLabel.java new file mode 100644 index 000000000000..71fb34e6651a --- /dev/null +++ b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLabel.java @@ -0,0 +1,7 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.psi.javadoc; + +import com.intellij.psi.PsiElement; + +/** Describes a markdown reference label */ +public interface PsiMarkdownReferenceLabel extends PsiElement {} diff --git a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLink.java b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLink.java index f3d8e9b33e77..6b62149a8fa5 100644 --- a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLink.java +++ b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiMarkdownReferenceLink.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.javadoc; import com.intellij.psi.PsiElement; diff --git a/java/java-psi-impl/src/com/intellij/lang/java/syntax/JavaElementTypeConverterExtension.kt b/java/java-psi-impl/src/com/intellij/lang/java/syntax/JavaElementTypeConverterExtension.kt index 84c8e60c95cb..f7d2c0dd2dbb 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/syntax/JavaElementTypeConverterExtension.kt +++ b/java/java-psi-impl/src/com/intellij/lang/java/syntax/JavaElementTypeConverterExtension.kt @@ -289,6 +289,7 @@ class JavaElementTypeConverterExtension : ElementTypeConverterFactory { JavaDocSyntaxElementType.DOC_COMMENT to JavaDocElementType.DOC_COMMENT, JavaDocSyntaxElementType.DOC_MARKDOWN_CODE_BLOCK to JavaDocElementType.DOC_MARKDOWN_CODE_BLOCK, JavaDocSyntaxElementType.DOC_MARKDOWN_REFERENCE_LINK to JavaDocElementType.DOC_MARKDOWN_REFERENCE_LINK, + JavaDocSyntaxElementType.DOC_MARKDOWN_REFERENCE_LABEL to JavaDocElementType.DOC_MARKDOWN_REFERENCE_LABEL, JavaDocSyntaxTokenType.DOC_COMMENT_START to JavaDocTokenType.DOC_COMMENT_START, JavaDocSyntaxTokenType.DOC_COMMENT_END to JavaDocTokenType.DOC_COMMENT_END, diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLabelImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLabelImpl.java new file mode 100644 index 000000000000..459978dd62f8 --- /dev/null +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLabelImpl.java @@ -0,0 +1,30 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.psi.impl.source.javadoc; + +import com.intellij.psi.JavaElementVisitor; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.impl.source.tree.CompositePsiElement; +import com.intellij.psi.javadoc.PsiMarkdownReferenceLabel; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.psi.impl.source.tree.JavaDocElementType.DOC_MARKDOWN_REFERENCE_LABEL; + +public class PsiMarkdownReferenceLabelImpl extends CompositePsiElement implements PsiMarkdownReferenceLabel { + public PsiMarkdownReferenceLabelImpl() { + super(DOC_MARKDOWN_REFERENCE_LABEL); + } + + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof JavaElementVisitor) { + ((JavaElementVisitor)visitor).visitMarkdownReferenceLabel(this); + return; + } + super.accept(visitor); + } + + @Override + public String toString() { + return "PsiReferenceLabel:"; + } +} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLinkImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLinkImpl.java index 2ccd89e429f7..7a7958df6af3 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLinkImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/javadoc/PsiMarkdownReferenceLinkImpl.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl.source.javadoc; import com.intellij.psi.JavaElementVisitor; @@ -32,7 +32,9 @@ public class PsiMarkdownReferenceLinkImpl extends CompositePsiElement implements @Override public @Nullable PsiElement getLabel() { - if (getChildren().length >= 1) return getChildren()[1]; + if (getChildren().length >= 1) { + return getChildren()[1]; + } // malformed/incomplete link return null; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java index f79fcc6775ad..31fa8cb9a7b0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java @@ -55,6 +55,7 @@ public interface JavaDocElementType { IElementType DOC_SNIPPET_ATTRIBUTE_VALUE = new JavaDocParentProviderElementType("DOC_SNIPPET_ATTRIBUTE_VALUE", BasicJavaDocElementType.BASIC_DOC_SNIPPET_ATTRIBUTE_VALUE); IElementType DOC_MARKDOWN_CODE_BLOCK = new JavaDocCompositeElementType("DOC_CODE_BLOCK", () -> new PsiMarkdownCodeBlockImpl(), BasicJavaDocElementType.BASIC_DOC_MARKDOWN_CODE_BLOCK); IElementType DOC_MARKDOWN_REFERENCE_LINK = new JavaDocCompositeElementType("DOC_REFERENCE_LINK", () -> new PsiMarkdownReferenceLinkImpl(), BasicJavaDocElementType.BASIC_DOC_MARKDOWN_REFERENCE_LINK); + IElementType DOC_MARKDOWN_REFERENCE_LABEL = new JavaDocCompositeElementType("DOC_REFERENCE_LABEL", () -> new PsiMarkdownReferenceLabelImpl(), BasicJavaDocElementType.BASIC_DOC_MARKDOWN_REFERENCE_LABEL); ILazyParseableElementType DOC_REFERENCE_HOLDER = new BasicJavaDocElementType.DocReferenceHolderElementType(); ILazyParseableElementType DOC_TYPE_HOLDER = new BasicJavaDocElementType.DocTypeHolderElementType(); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementTypeFactory.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementTypeFactory.java index 54ce60bc2e63..b7ccbd8938ce 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementTypeFactory.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementTypeFactory.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl.source.tree; import com.intellij.psi.impl.source.AbstractBasicJavaDocElementTypeFactory; @@ -29,7 +29,8 @@ public class JavaDocElementTypeFactory extends AbstractBasicJavaDocElementTypeFa JavaDocElementType.DOC_TYPE_HOLDER, JavaDocElementType.DOC_PARAMETER_REF, JavaDocElementType.DOC_MARKDOWN_CODE_BLOCK, - JavaDocElementType.DOC_MARKDOWN_REFERENCE_LINK + JavaDocElementType.DOC_MARKDOWN_REFERENCE_LINK, + JavaDocElementType.DOC_MARKDOWN_REFERENCE_LABEL ); } diff --git a/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt b/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt index b71d526b7e48..6acafb53e446 100644 --- a/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt +++ b/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt @@ -2,7 +2,6 @@ package com.intellij.java.syntax.element import com.intellij.platform.syntax.SyntaxElementType -import kotlin.jvm.JvmField /** * @see com.intellij.psi.impl.source.tree.JavaDocElementType @@ -27,4 +26,5 @@ object JavaDocSyntaxElementType { @JvmField val DOC_COMMENT: SyntaxElementType = SyntaxElementType("DOC_COMMENT") @JvmField val DOC_MARKDOWN_CODE_BLOCK: SyntaxElementType = SyntaxElementType("DOC_CODE_BLOCK") @JvmField val DOC_MARKDOWN_REFERENCE_LINK: SyntaxElementType = SyntaxElementType("DOC_REFERENCE_LINK") + @JvmField val DOC_MARKDOWN_REFERENCE_LABEL: SyntaxElementType = SyntaxElementType("DOC_REFERENCE_LABEL") } \ No newline at end of file diff --git a/java/java-syntax/src/com/intellij/java/syntax/parser/JavaDocParser.kt b/java/java-syntax/src/com/intellij/java/syntax/parser/JavaDocParser.kt index c068165ba624..a783f7eb1fd1 100644 --- a/java/java-syntax/src/com/intellij/java/syntax/parser/JavaDocParser.kt +++ b/java/java-syntax/src/com/intellij/java/syntax/parser/JavaDocParser.kt @@ -267,15 +267,22 @@ class JavaDocParser( tag.rollbackTo() tag = builder.mark() if (hasLabel) { + builder.advanceLexer() + val label = builder.mark() // Label range already known, mark it as comment data while (!builder.eof()) { - builder.advanceLexer() + if (builder.tokenType === JavaDocSyntaxTokenType.DOC_INLINE_CODE_FENCE) { + parseInlineCodeBlock() + continue + } if (builder.currentOffset < endLabelOffset) { builder.remapCurrentToken(JavaDocSyntaxTokenType.DOC_COMMENT_DATA) + builder.advanceLexer() continue } break } + label.done(JavaDocSyntaxElementType.DOC_MARKDOWN_REFERENCE_LABEL) builder.advanceLexer() } diff --git a/java/java-tests/testData/codeInsight/javadocIG/markdownInlineCodeBlock.html b/java/java-tests/testData/codeInsight/javadocIG/markdownInlineCodeBlock.html index 3c7f84e59ef3..393e9abe1d1b 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/markdownInlineCodeBlock.html +++ b/java/java-tests/testData/codeInsight/javadocIG/markdownInlineCodeBlock.html @@ -1,5 +1,6 @@
class MarkdownCodeBlock
Single liner code block:
Hello world
No tags are interpreted inside them
{@link java.lang.String niceLink}
No markdown markup is interpreted inside them
- _Hello_ <code>
This is a broken inline link - `Start of broken link
end of broken link`_Hello_ <code>Code span inside a link
+ my text with a code span!
This is a broken inline code span + `Start of broken code span
end of broken code span``
///
-/// This is a broken inline link
-/// `Start of broken link
+/// Code span inside a link
+/// [my text with `a code span`!][java.lang.String]
///
-/// end of broken link`
+/// This is a broken inline code span
+/// `Start of broken code span
+///
+/// end of broken code span`
class MarkdownCodeBlock {}
\ No newline at end of file
diff --git a/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12.java b/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12.java
new file mode 100644
index 000000000000..7f8074db7660
--- /dev/null
+++ b/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12.java
@@ -0,0 +1,2 @@
+/// [link with `inline code`!][java.lang.String]
+class C {}
\ No newline at end of file
diff --git a/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12.txt b/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12.txt
new file mode 100644
index 000000000000..5f903e8bb5c4
--- /dev/null
+++ b/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12.txt
@@ -0,0 +1,49 @@
+PsiJavaFile:ReferenceLinkMarkdown12.java
+ PsiImportList
+
+ PsiClass:C
+ PsiDocComment
+ PsiDocToken:DOC_COMMENT_LEADING_ASTERISKS('///')
+ PsiWhiteSpace(' ')
+ PsiReferenceLink:
+ PsiDocToken:DOC_LBRACKET('[')
+ PsiReferenceLabel:
+ PsiDocToken:DOC_COMMENT_DATA('link with ')
+ PsiMarkdownCodeBlock:
+ PsiDocToken:DOC_INLINE_CODE_FENCE('`')
+ PsiDocToken:DOC_COMMENT_DATA('inline code')
+ PsiDocToken:DOC_INLINE_CODE_FENCE('`')
+ PsiDocToken:DOC_COMMENT_DATA('!')
+ PsiDocToken:DOC_RBRACKET(']')
+ PsiDocToken:DOC_LBRACKET('[')
+ PsiElement(DOC_REFERENCE_HOLDER)
+ PsiJavaCodeReferenceElement:java.lang.String
+ PsiJavaCodeReferenceElement:java.lang
+ PsiJavaCodeReferenceElement:java
+ PsiIdentifier:java('java')
+ PsiReferenceParameterList
+
+ PsiJavaToken:DOT('.')
+ PsiIdentifier:lang('lang')
+ PsiReferenceParameterList
+
+ PsiJavaToken:DOT('.')
+ PsiIdentifier:String('String')
+ PsiReferenceParameterList
+
+ PsiDocToken:DOC_RBRACKET(']')
+ PsiWhiteSpace('\n')
+ PsiModifierList:
+
+ PsiKeyword:class('class')
+ PsiWhiteSpace(' ')
+ PsiIdentifier:C('C')
+ PsiTypeParameterList
+
+ PsiReferenceList
+
+ PsiReferenceList
+
+ PsiWhiteSpace(' ')
+ PsiJavaToken:LBRACE('{')
+ PsiJavaToken:RBRACE('}')
\ No newline at end of file
diff --git a/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12_node.txt b/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12_node.txt
new file mode 100644
index 000000000000..d2e777a6ac53
--- /dev/null
+++ b/java/java-tests/testData/psi/parser-full/javadocParsing/ReferenceLinkMarkdown12_node.txt
@@ -0,0 +1,49 @@
+java.FILE
+ IMPORT_LIST
+
+ CLASS
+ DOC_COMMENT
+ DOC_COMMENT_LEADING_ASTERISKS
+ WHITE_SPACE
+ DOC_REFERENCE_LINK
+ DOC_LBRACKET
+ DOC_REFERENCE_LABEL
+ DOC_COMMENT_DATA
+ DOC_CODE_BLOCK
+ DOC_INLINE_CODE_FENCE
+ DOC_COMMENT_DATA
+ DOC_INLINE_CODE_FENCE
+ DOC_COMMENT_DATA
+ DOC_RBRACKET
+ DOC_LBRACKET
+ DOC_REFERENCE_HOLDER
+ JAVA_CODE_REFERENCE
+ JAVA_CODE_REFERENCE
+ JAVA_CODE_REFERENCE
+ IDENTIFIER
+ REFERENCE_PARAMETER_LIST
+
+ DOT
+ IDENTIFIER
+ REFERENCE_PARAMETER_LIST
+
+ DOT
+ IDENTIFIER
+ REFERENCE_PARAMETER_LIST
+
+ DOC_RBRACKET
+ WHITE_SPACE
+ MODIFIER_LIST
+
+ CLASS_KEYWORD
+ WHITE_SPACE
+ IDENTIFIER
+ TYPE_PARAMETER_LIST
+
+ EXTENDS_LIST
+
+ IMPLEMENTS_LIST
+
+ WHITE_SPACE
+ LBRACE
+ RBRACE
\ No newline at end of file