fix lazy parsers for doc comments

- forgot to close the root marker in the prev commit
- use JavaDocLexer

GitOrigin-RevId: 400206b6588a16b8ba2396c69b055bb491eda942
This commit is contained in:
Max Medvedev
2025-08-21 09:53:55 +00:00
committed by intellij-monorepo-bot
parent f2e0836de5
commit 4682103c9d
5 changed files with 58 additions and 14 deletions
@@ -2,9 +2,12 @@
package com.intellij.java.syntax.element.lazyParser
import com.intellij.java.syntax.element.JavaDocSyntaxElementType
import com.intellij.java.syntax.lexer.JavaDocLexer
import com.intellij.java.syntax.parser.JavaDocParser
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
@@ -12,7 +15,9 @@ 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()
parseFragment(syntaxTreeBuilder, JavaDocSyntaxElementType.DOC_COMMENT, false) {
JavaDocParser(syntaxTreeBuilder, languageLevel).parseDocCommentText()
}
return prepareProduction(syntaxTreeBuilder)
}
@@ -25,4 +30,9 @@ internal class JavaDocCommentParser : LazyParser {
newText.startsWith("/**") &&
newText.endsWith("*/")
}
override fun createLexer(lexingContext: LazyLexingContext): Lexer =
JavaDocLexer(languageLevel)
private val languageLevel get() = LanguageLevel.HIGHEST
}
@@ -1,6 +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.java.syntax.element.lazyParser
import com.intellij.java.syntax.element.JavaDocSyntaxElementType
import com.intellij.java.syntax.lexer.JavaLexer
import com.intellij.java.syntax.lexer.JavaTypeEscapeLexer
import com.intellij.java.syntax.parser.JavaDocParser
@@ -16,7 +17,9 @@ 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))
parseFragment(syntaxTreeBuilder, JavaDocSyntaxElementType.DOC_TYPE_HOLDER, false) {
JavaDocParser(syntaxTreeBuilder, languageLevel).parseJavadocType(JavaParser(languageLevel))
}
return prepareProduction(syntaxTreeBuilder)
}
@@ -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.
@file:JvmName("ParsingUtil")
package com.intellij.java.syntax.element.lazyParser
import com.intellij.java.syntax.JavaSyntaxBundle
import com.intellij.platform.syntax.SyntaxElementType
import com.intellij.platform.syntax.parser.SyntaxTreeBuilder
import kotlin.jvm.JvmName
inline fun parseFragment(
builder: SyntaxTreeBuilder,
type: SyntaxElementType,
eatAll: Boolean = false,
block: () -> Unit,
) {
val root = builder.mark()
block()
if (!builder.eof()) {
if (!eatAll) throw IncompleteFragmentParsingException("Unexpected token: '${builder.tokenText}'")
val extras = builder.mark()
while (!builder.eof()) {
builder.advanceLexer()
}
extras.error(JavaSyntaxBundle.message("unexpected.tokens"))
}
root.done(type)
}
class IncompleteFragmentParsingException(message: String) : RuntimeException(message)