Java doc parsing: add lazy parsers for doc comments

GitOrigin-RevId: c39a77d27e6d1e8c8ab484c9fcc95f5c3c30a614
This commit is contained in:
Max Medvedev
2025-08-20 12:28:49 +00:00
committed by intellij-monorepo-bot
parent 073b78b70a
commit 520aff6ccf
3 changed files with 59 additions and 2 deletions
@@ -1,6 +1,8 @@
// 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.syntax.element
import com.intellij.java.syntax.element.lazyParser.JavaDocCommentParser
import com.intellij.java.syntax.element.lazyParser.JavaDocTypeParser
import com.intellij.platform.syntax.SyntaxElementType
import kotlin.jvm.JvmField
@@ -22,9 +24,9 @@ object JavaDocSyntaxElementType {
@JvmField val DOC_REFERENCE_HOLDER: SyntaxElementType = SyntaxElementType("DOC_REFERENCE_HOLDER")
@JvmField val DOC_TYPE_HOLDER: SyntaxElementType = SyntaxElementType("DOC_TYPE_HOLDER")
@JvmField val DOC_TYPE_HOLDER: SyntaxElementType = SyntaxElementType("DOC_TYPE_HOLDER", lazyParser = JavaDocTypeParser())
@JvmField val DOC_COMMENT: SyntaxElementType = SyntaxElementType("DOC_COMMENT")
@JvmField val DOC_COMMENT: SyntaxElementType = SyntaxElementType("DOC_COMMENT", lazyParser = JavaDocCommentParser())
@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")
@@ -0,0 +1,28 @@
// 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.syntax.element.lazyParser
import com.intellij.java.syntax.element.JavaDocSyntaxElementType
import com.intellij.java.syntax.parser.JavaDocParser
import com.intellij.platform.syntax.LazyParser
import com.intellij.platform.syntax.LazyParsingContext
import com.intellij.platform.syntax.parser.ProductionResult
import com.intellij.platform.syntax.parser.prepareProduction
import com.intellij.pom.java.LanguageLevel
internal class JavaDocCommentParser : LazyParser {
override fun parse(parsingContext: LazyParsingContext): ProductionResult {
val syntaxTreeBuilder = parsingContext.syntaxTreeBuilder
JavaDocParser(syntaxTreeBuilder, LanguageLevel.HIGHEST).parseDocCommentText()
return prepareProduction(syntaxTreeBuilder)
}
override fun canBeReparsedIncrementally(parsingContext: LazyParsingContext): Boolean {
val newText = parsingContext.text
val tokenList = parsingContext.tokenList
return tokenList.tokenCount == 1 &&
tokenList.getTokenType(0) == JavaDocSyntaxElementType.DOC_COMMENT &&
newText.startsWith("/**") &&
newText.endsWith("*/")
}
}
@@ -0,0 +1,27 @@
// 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.syntax.element.lazyParser
import com.intellij.java.syntax.lexer.JavaLexer
import com.intellij.java.syntax.lexer.JavaTypeEscapeLexer
import com.intellij.java.syntax.parser.JavaDocParser
import com.intellij.java.syntax.parser.JavaParser
import com.intellij.platform.syntax.LazyLexingContext
import com.intellij.platform.syntax.LazyParser
import com.intellij.platform.syntax.LazyParsingContext
import com.intellij.platform.syntax.lexer.Lexer
import com.intellij.platform.syntax.parser.ProductionResult
import com.intellij.platform.syntax.parser.prepareProduction
import com.intellij.pom.java.LanguageLevel
internal class JavaDocTypeParser : LazyParser {
override fun parse(parsingContext: LazyParsingContext): ProductionResult {
val syntaxTreeBuilder = parsingContext.syntaxTreeBuilder
JavaDocParser(syntaxTreeBuilder, languageLevel).parseJavadocType(JavaParser(languageLevel))
return prepareProduction(syntaxTreeBuilder)
}
override fun createLexer(lexingContext: LazyLexingContext): Lexer =
JavaTypeEscapeLexer(JavaLexer(languageLevel))
private val languageLevel get() = LanguageLevel.JDK_1_3
}